[CNN 알고리즘들] LeNet-5의 구조
LeNet-5 => https://bskyvision.com/418
AlexNet => https://bskyvision.com/421
VGG-F, VGG-M, VGG-S => https://bskyvision.com/420
VGG-16, VGG-19 => https://bskyvision.com/504
GoogLeNet(inception v1) => https://bskyvision.com/539
ResNet => https://bskyvision.com/644
SENet => https://bskyvision.com/640
-----
지난번에 컨볼루션 신경망(CNN)에 대해 대략적으로 설명했었다. 오늘은 이미지 분류용 CNN 중에 조상격인 LeNet에 대해서 살펴볼 것이다. LeNet의 다양한 버전들(LeNet-1, LeNet-2,...) 중에서 최종 버전인 LeNet-5를 정리하려고 한다. 자세히 읽으신다면 분명 유익한 것이 있을 거라고 생각합니다.^^
▶ LeNet
LeNet은 CNN을 처음으로 개발한 얀 르쿤(Yann Lecun) 연구팀이 1998년에 개발한 CNN 알고리즘의 이름이다. original 논문 제목은 "Gradient-based learning applied to document recognition"이다. 우선 LeNet-5의 구조를 살펴보자.
그림1. LeNet-5의 구조 [2]
그림1에서 볼 수 있듯이 LeNet-5는 인풋, 3개의 컨볼루션 레이어(C1, C3, C5), 2개의 서브샘플링 레이어(S2, S4), 1층의 full-connected 레이어(F6), 아웃풋 레이어로 구성되어 있다. 참고로 C1부터 F6까지 활성화 함수로 tanh을 사용한다.
1) C1 레이어: 입력 영상(여기서는 32 x 32 사이즈의 이미지)을 6개의 5 x 5 필터와 컨볼루션 연산을 해준다. 그 결과 6장의 28 x 28 특성 맵을 얻게 된다.
훈련해야할 파라미터 개수: (가중치*입력맵개수 + 바이어스)*특성맵개수 = (5*5*1 + 1)*6 = 156
2) S2 레이어: 6장의 28 x 28 특성 맵에 대해 서브샘플링을 진행한다. 결과적으로 28 x 28 사이즈의 특성 맵이 14 x 14 사이즈의 특성맵으로 축소된다. 2 x 2 필터를 stride 2로 설정해서 서브샘플링해주기 때문이다. 사용하는 서브샘플링 방법은 평균 풀링(average pooling)이다.
훈련해야할 파라미터 개수: (가중치 + 바이어스)*특성맵개수 = (1 + 1)*6 = 12
평균풀링인데 왜 훈련해야할 파라미터가 필요한지 의아할 수 있는데, original 논문에 의하면 평균을 낸 후에 한 개의 훈련가능한 가중치(trainable weight)를 곱해주고 또 한 개의 훈련가능한 바이어스(trainable bias)를 더해준다고 한다. 그 값이 시그모이드 함수를 통해 활성화된다. 참고로 그 가중치와 바이어스는 시그모이드의 비활성도를 조절해준다고 한다.
3) C3 레이어: 6장의 14 x 14 특성맵에 컨볼루션 연산을 수행해서 16장의 10 x 10 특성맵을 산출해낸다. 이것 이해하는데 한참 걸렸다. 참고자료[4]가 이해하는데 큰 도움이 되었다. 아마도 지금 이해한 것이 맞을 것이다. (혹시나 틀렸다면 누군가 알려주시길.)
6장의 14 x 14 특성맵에서 연속된 3장씩을 모아서 5 x 5 x 3 사이즈의 필터와 컨볼루션 해준다(그림2에서 열0-5). 6장의 10 x 10 특성맵이 산출된다.
또한 6장의 14 x 14 특성맵에서 연속된 4장씩을 모아서 5 x 5 x 4 사이즈의 필터와 컨볼루션 해준다(그림2에서 열6-11). 6장의 10 x 10 특성맵이 산출된다.
또한 6장의 14 x 14 특성맵에서 불연속한 4장씩을 모아서 5 x 5 x 4 사이즈의 필터와 컨볼루션 해준다(그림2에서 열12-14). 3장의 10 x 10 특성맵이 산출된다.
마지막으로 6장의 14 x 14 특성맵 모두를 가지고 5 x 5 x 6 사이즈의 필터와 컨볼루션 해준다(그림2에서 열15). 1장의 10 x 10 특성맵이 산출된다.
결과적으로 16장(6 + 6 + 3 + 1)의 10 x 10 특성맵을 얻게 되었다.
그림2. C3에서 6장의 14 x 14 특성맵을 조합하는 방법 [2]
훈련해야할 파라미터 개수:
첫번째그룹=> (가중치*입력맵개수+바이어스)*특성맵 개수 = (5*5*3 + 1)*6 = 456
두번째그룹=> (가중치*입력맵개수+바이어스)*특성맵 개수 = (5*5*4 + 1)*6 = 606
세번째그룹=> (가중치*입력맵개수+바이어스)*특성맵 개수 = (5*5*4 + 1)*3 = 303
네번째그룹=> (가중치*입력맵개수+바이어스)*특성맵 개수 = (5*5*6 + 1)*1 = 151
456 + 606 + 303 + 151 = 1516
4) S4 레이어: 16장의 10 x 10 특성 맵에 대해서 서브샘플링을 진행해 16장의 5 x 5 특성 맵으로 축소시킨다.
훈련해야할 파라미터 개수: (가중치 + 바이어스)*특성맵개수 = (1 + 1)*16 = 32
5) C5 레이어: 16장의 5 x 5 특성맵을 120개 5 x 5 x 16 사이즈의 필터와 컨볼루션 해준다. 결과적으로 120개 1 x 1 특성맵이 산출된다.
훈련해야할 파라미터 개수: (가중치*입력맵개수 + 바이어스)*특성맵 개수 = (5*5*16 + 1)*120 = 48120
6) F6 레이어: 84개의 유닛을 가진 피드포워드 신경망이다. C5의 결과를 84개의 유닛에 연결시킨다.
훈련해야할 파라미터 개수: 연결개수 = (입력개수 + 바이어스)*출력개수 = (120 + 1)*84 = 10164
7) 아웃풋 레이어: 10개의 Euclidean radial basis function(RBF) 유닛들로 구성되어있다. 각각 F6의 84개 유닛으로부터 인풋을 받는다. 최종적으로 이미지가 속한 클래스를 알려준다.
LeNet-5를 제대로 가동하기 위해 훈련해야할 파라미터는 총 156 + 12 + 1516 + 32 + 48120 + 10164 = 60000개다.
▶ 글을 마무리하며...
포스팅을 준비하고 글을 쓰면서 LeNet-5에 대해 어느 정도 이해한 것 같아 기분이 좋다. 누군가에게 도움이 되는 글이길...
<참고자료>
[1] https://laonple.blog.me/220648539191, 라온피플의 LeNet에 관한 포스팅
[2] Lecun 1998, Gradient-based learning applied to document recognition, LeNet-5에 대한 논문
[3] https://reniew.github.io/07/, reniew's blog의 LeNet에 관한 포스팅
[4] https://yohanes.gultom.me/2016/12/12/understanding-lenet-lecun-1998/, undefined 블로그