프로그래밍/머신러닝 & 딥러닝

LeNet-5 (Architecture 및 클래스 구현)

Jay_rock 2022. 10. 24. 19:24
LeNet-5는 합성곱 신경망이라는 개념을 최초로 개발한 얀 크룬이 개발한 CNN 구조이다. 

 

 

 

 

 

ABSTRACT

LeNet-5는 수표에 쓴 손글씨를 인식하는 딥러닝 구조로 발표되었다. LeNet에는 여러 버전이 있는데, 그중에 최종 버전인 LeNet-5이다. 모델 구조는 합성곱층과 다운 샘플링층(풀링)을 반복적으로 지나고 마지막엔 완전 연결층을 연결하여 연산을 수행한다. 이 모델이 현재 CNN의 초석이 되었다. 

 

 

 

 

 

LeNet-5 Architecture

LeNet-5 Architecture (source : https://www.datasciencecentral.com/lenet-5-a-classic-cnn-architecture)

LeNet-5 구조를 차례로 살펴보자. (C: convolution layer, S: pooling layer, F: fully-connected layer)

  • C1: 5x5 합성곱 연산을 통해 28x28 크기의 feature maps 6개를 생성한다.
  • S2: 6개의 feature maps을 14x14 크기로 다운 샘플링한다.
  • C3: 5x5 합성곱 연산을 통해 10x10 크기의 feature maps 16개를 생성한다.
  • S4: 16개의 feature maps을 5x5 크기로 다운 샘플링한다.
  • C5: 5x5 합성곱 연산을 통해 1x1 크기의 feature maps 120개를 생성한다.
  • F6: 완전연결층으로 84개의 노드와 연결한다.

 

 

 

 

LeNet-5 Example

앞서서 LeNet-5 모델의 구조를 공부했으니 이제 파이썬을 이용하여 직접 클래스를 구현해보자

 

Create LesNet-5 Class

## setup

import tensorflow as tf

from keras.api._v2.keras import Sequential
from keras.api._v2.keras import activations
from keras.optimizers import Optimizer

from tensorflow.keras import Model
from tensorflow.keras.models import Sequential
from tensorflow.keras.losses import categorical_crossentropy
from tensorflow.keras.layers import Dense, Flatten, Conv2D, AveragePooling2D


## LeNet-5 class
class LeNet(Sequential):
    def __init__(self, input_shape, nb_classes):
        super().__init__()

        self.add(Conv2D(6,kernel_size=(5,5), strides=(1,1), activations='relu', 
                        input_shape=input_shape, padding='same'))                      # C1
        self.add(AveragePooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))    # S2
        self.add(Conv2D(16,kernel_size=(5,5), strides=(1,1), activations='relu',
                        padding='valid'))                                              # C3
        self.add(AveragePooling2D(pool_size=(2,2), stride=(2,2), padding='valid'))     # S4

        self.add(Flatten())
        self.add(Dense(120, activations='relu'))                                       # C5
        self.add(Dense(84, activations='relu'))                                        # F6
        self.add(Dense(nb_classes, activations='softmax'))                             # Output

        self.compile(optimizer='adam', loss=categorical_crossentropy, metrics=['accuracy'])
  • strides : 필터를 적용하여 연산을 하는 간격
  • activation : 활성화 함수 선택 ( LeNet-5에선 'relu' 사용 )
  • padding : 연산 전에 이미지 주변에 빈 값을 넣어 이미지 크기를 유지 ( 'same' : 이미지를 연산 전과 후를 같게 함, 'valid' : 비활성화를 의미함

 

 

 

 

아직 CNN 용어들이 익숙하지 않다면 앞 포스트를 참고해주시기 바랍니다.

https://jaesuk-1207.tistory.com/51

 

합성곱 신경망 (Convolutional Neural Network, CNN) 개념 및 구조

합성곱 신경망은 이미지나 영상을 처리할 때 많이 사용되는 신경망입니다. 합성곱 신경망을 사용할 때 이미지를 한 번에 계산하는 것이 아닌 국소적인 부분을 계산함으로써 시간과 자원을 줄이

jaesuk-1207.tistory.com