[CNN 알고리즘들] LeNet-5의 구조

지난번에 컨볼루션 신경망(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 블로그


댓글()
  1. 딥러닝 2019.07.03 14:46 댓글주소  수정/삭제  댓글쓰기

    6장의 14 x 14 특성맵에서 연속된 3장씩을 모아서 5 x 5 x 3 사이즈의 필터와 컨볼루션 해준다(그림2에서 열0-5). 6장의 10 x 10 특성맵이 산출된다 .. 라고 하신 부분에서 연속된 3장, 연속된 4장은 임의로 선택한 개수인건가요?

  2. 학부생 2019.10.08 15:46 댓글주소  수정/삭제  댓글쓰기

    정말 좋은 글이네요! 감사합니다!

  3. 플라워댄스 2019.10.12 17:41 댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다 ㅎㅎ!

  4. 전문가가 되고 싶어요 2019.10.23 14:01 댓글주소  수정/삭제  댓글쓰기

    잘읽었습니다.

    평균 풀링하는 경우, 가중치와 바이어스가 각각 1개씩 생기는 이유는 뭔가요?

    • BlogIcon bskyvision 심교훈 2019.10.23 16:20 신고 댓글주소  수정/삭제

      좋은 질문 감사합니다.^^ 덕분에 저도 좀 더 자세히 살펴볼 수 있게 되었네요. 질문에 대한 답은 original 논문에서 찾을 수 있습니다. 그 내용은 다음과 같습니다.

      "평균풀링인데 왜 훈련해야할 파라미터가 필요한지 의아할 수 있는데, original 논문에 의하면 평균을 낸 후에 한 개의 훈련가능한 가중치(trainable weight)를 곱해주고 또 한 개의 훈련가능한 바이어스(trainable bias)를 더해준다고 한다. 그 값이 시그모이드 함수를 통해 활성화된다. 참고로 그 가중치와 바이어스는 시그모이드의 비활성도를 조절해준다고 한다. "