본문 바로가기

VISION

고급 합성곱 신경망 구조 (1) - CNN의 패턴과 LeNet

전통적인 CNN을 기반으로

다양한 최신 합성곱 신경망 구조들이 등장했다.

 

이번 포스팅부터는 그 새로운 구조들의 특징과

각 구조들이 어떻게 발전되어 탄생했는지 정리해보려 한다.

 


우선 그에 앞서 CNN의 공통적인 디자인 패턴에 대해 알아보자.

1. 특징 추출과 분류

특징의 추출과 결과의 분류를 담당하는 부분이 다르다.

앞선 포스팅에서 설명했던 것과 같이

CNN에서는 합성곱층(필터)을 이용해 특징을 추출하고,

해당 특징들을 계속해서 추출하다 1차원 벡터화 한 후 전결합층을 통해 최종 분류 결과를 도출한다.

 

2. 이미지의 깊이는 증가, 크기는 감소

 

이미지는 높이 X 폭 X 깊이로 나타내어진다. 

이때 CNN을 통과 할 수록 이미지 깊이는 깊어지고,

크기(높이 x 폭)는 작아진다. 

https://jiho-ml.com/weekly-nlp-9/

인풋에서의 깊이는 색상이었다. 

회색조의 경우에는 1, 컬러의 경우에는 3의 깊이를 가진다.

 

이후부터의 깊이는 특징맵의 수이다.

따라서 갈수록 이미지의 깊이가 깊어진다 -> 갈수록 최대한 많은 특징을 뽑아내고자 한다

라 생각하면 된다

 

3. 전결합층 

 

모든 CNN에 해당되는 특징은 아니지만, 대부분의 합성곱신경망에서는

현재의 전결합 층은 이 전 층보다 유닛수가 같거나 줄어든다.

 

 

애초에 최대한 뽑아놓은 특징들을 바탕으로 분류를 해야하는 상황에서

굳이 노드를 늘려 계산량을 늘릴 필요는 없을 것 이다.

 

하지만 드물게 노드의 수가 증가하는 경우도 있으니 주의


[LeNet] 

그럼 이제 첫 번째 고급 CNN, LeNet에 대해 알아보자. 

 

정확한 명칭은 LeNet-5 으로, 가중치를 가진 5개의 층으로 구성되어 있기에 이러한 이름이 붙여졌다.

 

1. 구조

[입력 이미지 -> C1 -> tanh -> S2 -> C3 -> tanh -> S4 -> C5 -> tanh -> FC6 -> softmax7]

  • C1, C3, C5 : 가중치가 존재하는 합성 곱 층, tanh 활성화 함수가 항상 뒤에 따라온다.
  • tanh 활성화 함수 : 비선형 변환을 통해 모델 학습의 다양성을 높인다. 당시에는 relu보다 tanh, sigmoid가 유행
  • S2, S4 : 평균 풀링을 통해 이미지의 크기를 반으로 줄인다.  (풀링 사이즈가 2, stride가 2이므로 2x2격자를 1x1의 격자로 줄이는 것과 동일하다)
  • FC6, softmax 출력 : 특징을 바탕으로 이미지를 분류한다.

 

2. 이미지 크기, 파라미터 계산

2-1. 이미지의 크기 계산

C1에서의 이미지 크기 변화를 예시로 들어보자

32x32x1의 이미지에서 5x5 크기의 커널, stride가 1, padding이 없다면

커널이 최대로 이동할 수 있는 28x28의 사이즈가 나오고, 

이러한 커널이 6개 있으므로 

C1의 이미지 크기 : 28 x 28 x 6이 된다.

 

빠른 계산을 위해 공식을 작성해보자면 다음과 같다.

C1) (32-5+2*0)/1+1 = 28

C3) (14-5+2*0)/1+1 = 10 

C5) (5-5+2*0)/1+1 = 1

 

파라미터의 개수 계산

파라미터도 C1의 예시로 시작해보자.

 

C1에서는 kernel size인 5x5에 bias 1이 추가되고, 

여기에 kernel의 개수인 6이 곱해져

{(5x5)+1}x6 = 156개의 파라미터가 학습된다. 

 

다음 컨볼루션 부터는 이미지의 깊이가 깊어짐에 따라

커널의 깊이에 해당하는 값도 곱해진다.

 

C1) {(5x5)+1}x6 = 156

C3) {(5x5x6)+1}x16 = 2416

C5) {(5x5x16)+1}x120 = 48120

 

전결합층에서는 (노드의 개수 + bias 개수) * 다음 층 노드 개수로

파라미터의 개수를 계산할 수 있다.

FC6) (120+1)x84 = 10164

softmax) (84+1)x10 = 850

 

따라서 LeNet을 돌리는데 필요한 전체 파라미터의 개수는 

156+2416+48120+10164+850 = 61,706이 되고

GPT-3.5의 파라미터 개수가 1750억개가 넘어가는 시점에서

소규모 신경망으로 분류된다.

 

3. 구현

 

# 비어있는 순차형 모델 객체
model = Sequential()
#합성곱층 C1
model.add(Conv2D(filters = 6, kernel_size = 5, strides = 1, activation = 'tanh', input_shape = (28,28,1), padding = 'same')) #paddig same -> 패딩 O / valid -> 패딩 X
#풀링층 S2
model.add(AveragePooling2D(pool_size = 2, strides = 2, padding = 'valid'))
#합성곱층 C3
model.add(Conv2D(filters = 16, kernel_size = 5, strides =1, activation = 'tanh', padding = 'valid'))
#풀링층 S4
model.add(AveragePooling2D(pool_size = 2, strides = 2, padding = 'valid'))
#합성곱층 C5
model.add(Conv2D(filters = 120, kernel_size = 5, strides =1, activation = 'tanh', padding = 'valid'))
#CNN의 출력 1차원 벡터로 변환
model.add(Flatten())
#전결합층 FC6
model.add(Dense(units = 84, activation = 'tanh'))
#전결합층 FC7
model.add(Dense(units = 10, activation = 'softmax'))

 

summary 결과 앞에서 확인했던 61,706개의 파라미터가 학습되어야 함을 확인할 수 있다.

 

LeNet의 논문 에서는 미리 설정된 일정에 맞춰 학습률을 감소시키는 학습률 감쇠를 사용한다.

#학습률 감쇠
def lr_schedule(epoch):
  if epoch <=2:
      lr = 5e-4
  elif epoch >2 and epoch <=5:
      lr = 2e-4
  elif epoch >5 and epoch <=9:
      lr = 5e-5
  else:
      lr = 1e-5
  return lr

이후 다음과 같이 컴파일 하고 학습한다.

from keras.callbacks import ModelCheckpoint, LearningRateScheduler

lr_scheduler = LearningRateScheduler(lr_schedule)
checkpoint = ModelCheckpoint(filepath = 'path_to_save_file/file.hdf5',
                             verbose = 1,
                             save_best_only = True)
callbacks = [checkpoint, lr_scheduler]
model.compile(loss = 'categorical_crossentropy', optimizer = 'sgd', metrics =['accuracy'])

hist = model.fit(X_train, y_train, batch_size = 32, epochs = 20,  callbacks = callbacks, verbose = 2, shuffle=True)

컴파일이란 모델을 학습시키기 위한 학습 과정을 설정하는 단계로, 

보통 비용함수인 loss, 최적화 과정인 optimizer, 성능지표인 accuracy를 설정한다.

 

이후 학습시에는 fit을 통해 X_train, y_train을 넣고

배치사이즈, 에포크 수를 설정한다.

 

verbose는 학습의 진행상황을 보여줄 것인지 지정하는 인자이다.

 - 0 : 아무것도 출력하지 않는다.

 - 1 : 훈련의 진행도를 보여주는 진행 막대를 보여준다.

 - 2 : 미니 배치마다 손실 정보를 출력한다.

 

shuffle은 샘플을 학습할 때마다 데이터를 무작위로 섞을지 여부를 결정하는 값으로, 기본값이 True이다.

 

callback은 훈련 중 호출되는 콜백 함수의 리스트를 저장하는 인수이다.

위의 callback을 보면 체크포인트와 학습 스케줄러를 저장하고 있다.

체크포인트는 ModelCheckpoint 콜백 함수를 통해

검증세트의 손실이 기존 최고 성능 모델에 비해 낮아질때만 저장되도록  설정되었고,

학습 스케줄러는 앞에서 함수로 지정한 바와 같이

학습률 감쇠를 적용시킨다.