jjinyeok 성장일지

시각지능 딥러닝 #1 - CNN 개요 2022/09/19~2022/09/23 본문

[KT AIVLE School]

시각지능 딥러닝 #1 - CNN 개요 2022/09/19~2022/09/23

jjinyeok 2022. 9. 19. 18:28

  시각지능 딥러닝에서는 Convolution Neural Network(CNN) 모델과 Object Detection 모델 두가지를 소개하고 실습한다.

 

1. Batch Normalization & Drop Out

  시각지능 딥러닝에 본격적으로 들어가기에 앞서 Batch Noramilzation과 Dropout에 대해 간단히 다루었다.

  Batch Noramilzation이란 각 Hidden Layer의 Activation 값을 적절하게 퍼뜨리도록 강제화하는 작업이다. 학습을 빠르게 진행할 수 있고 가중치의 초기값에 크게 의존하지 않게 되며 Overfitting을 억제한다. 각 Hidden Layer 층 다음에 Batch Noramilzation Layer를 쌓는 방식으로 적용할 수 있다. 대부분의 경우 Batch Noramilzation을 적용한 것이 효과가 좋기 때문에 많이 사용해보도록 하자.

  Drop Out이란 Layer에 들어있는 Node를 무작위로 줄이는 작업이다. Ensemble 기법과 비슷한 효과를 내는데 무작위 Node를 삭제하므로써 계속 새로운 Neural Network 모델을 만들기 때문이다. 따라서 Drop Out을 통해 Overfitting을 방지할 수 있다.

  Batch Noramilzation과 Drop Out을 모델에 적용하는 과정은 다음과 같다. Batch Noramilzation을 적용하기 위해 Hidden Layer 이후 BatchNormalization() Layer를 추가한다. 또한 Drop Out을 적용하기 위해 얼만큼 줄일지 rate parameter를 사용해 적용해야 한다.

keras.backend.clear_session()

model = keras.models.Sequential() # Sequential 모델 생성

model.add(Input(shape=(28, 28, 1)))
model.add(Flatten())

model.add(Dense(512, activation=swish))
model.add(BatchNormalization()) # 각 batch에 대해 Scaling 적용 -> Internal Covariate Shift

model.add(Dense(512, activation=swish))
model.add(BatchNormalization()) # 각 batch에 대해 Scaling 적용 -> Internal Covariate Shift

model.add(Dense(128, activation=swish))
model.add(BatchNormalization()) # 각 batch에 대해 Scaling 적용 -> Internal Covariate Shift
model.add(Dropout(rate=0.2)) # Layer에 들어있는 Node 중 랜덤하게 0.2 줄임 -> Overfitting 방지

model.add(Dense(10, activation=softmax))

model.compile(loss=categorical_crossentropy, optimizer=Adam(), metrics=['accuracy'])

 

2. Convolution Neural Network 개요

  Convolution Neural Network는 다음과 같은 과정을 거친다. 과정은 이전 딥러닝 정리에서 나왔던 그림과 별반 다를 바 없어 보인다. Layer를 쌓아 더 고수준의 특징을 추출한다는 큰 목적이 같기 때문이다. 그러나 초면인 단어 두개가 있다. 바로 Convolution과 Pooling이다. 따라서 Convolution과 Pooling만 알게 된다면 우리는 CNN을 이해할 수 있다.

CNN 과정 (출처: https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53)

 

3. Convolution Layer

  Convolution Layer는 이전 Layer에 대해 Filter를 통해 Feature Map을 만든다. Convolution Layer는 단순히 Flatten으로 데이터를 1차원으로 바꾸는 것이 아닌 공간 구조를 반영해 Feature Map을 만든다. 이때 Filter와 Filter에 해당하는 픽셀들을 각각 곱하고 그 합을 새로운 Feature Map의 값으로 넣는다. 이런식으로 Feature Map들을 개발자가 정한만큼 만들고 이 Feature Map의 집합은 이전 Layer의 공간 구조를 반영하게 된다.

Convolution Layer에서 Feature Map을 만드는 과정 (출처: Stanford  CS231n  Lecture)

  Filter의 높이와 너비를 지정해준다면 채널은 이전 Layer의 채널과 동일한 값을 지닌다. 따라서 만들어지는 Feature Map은 2차원이며 Filter의 개수에 따라 전체 Feature Map의 집합은 3차원이 되는 것이다.

 

4. Convolution Layer : Stride & Padding

  Convolution Layer에는 2가지를 지정할 수 있다.

  첫번째는 Stride이다. Stride는 Filter가 이동하는 간격을 의미하는데 Default 값으로 (1, 1)이 쓰인다. Stride를 크게 잡게 된다면 이동이 이전 Layer의 크기를 넘어 안 맞을수도 있고 이전 Layer의 Feature가 무시될 수 있기 때문에 (1, 1) Default 값으로 많이 사용한다.

  두번째는 Padding이다. 이전까지 Padding을 적용하지 않았을 때 이전 Layer의 외곽을 반영하지 못하는 문제가 생길 수 있었다. 왜냐하면 외곽일수록 Filter에 적용되는 경우가 더 적기 때문이다. 이때 Padding을 사용한다. Padding은 이전 Layer의 외곽 너머에 추가적인 값을 주어 외곽 정보를 반영할 수 있도록 한다. 0을 Padding 값으로 주어 Padding 값이 무시될 수 있도록 하는 Zero Padding이 Default로 사용된다. Padding은 외곽 정보의 반영과 이전 Layer와 크기를 맞추는 두가지 용도로 많이 사용된다.

 

5. Pooling Layer

  Pooling Layer는 이전 Layer에 비해 연산량을 줄이는 역할을 한다. Pooling은 Filter의 Size와 Stride의 영향을 받는데 일반적드로 Pooling Layer의 Stride는 Filter Size를 따라간다. 이렇게 되면 Pooling 과정에서 어떤 값도 두번 중복되지 않게 된다. 보통 Max Pooling을 많이 쓰지만 Average Pooling도 많이 쓴다. Max Pooling을 쓰는 이유는 값이 클 수록 영향력이 클 것을 예상하기 때문이다. 즉 가장 영향력을 많이 끼치는 Feature를 가져간다는 의미정도로 생각하면 된다. 이는 ReLU가 0 이하의 값은 0으로 양수는 그대로 사용하며 값이 클 수록 영향력이 클 것을 예상하는 것과 같다.

 

  CNN의 코드와 실습 과정에 대해서는 다음 정리에서 다룰 것이다. Convolution과 Pooling은 글로 봤을 때는 어렵지만 그림을 직접 그려간다면 예상보다 별게 아니다. 오히려 겨우 이런 과정을 공간 구조를 반영하고 이를 통해 CNN의 마법 같은 성능이 발생한다는 것이 놀라웠다.

Comments