본문 바로가기
코딩코딩/머신러닝, 딥러닝

[케창딥] 5장_컴퓨터 비전을 위한 딥러닝, CNN 기본 개념

by g0n1 2020. 11. 9.
728x90

5장에서는 CNN, Convolutional Neural Network, Convnet,합성곱 신경망을 배웁니다.

(다 같은 말)


실습 환경 구축

어떤 환경에서 실습하실지 모르겠지만 만일 1. 오류가 난다, 2. 날 것만 같다, 3. 새로운 가상환경을 만들 것이다 의 경우에는 아래 글을 참고해 텐서플로우와 케라스 버전을 맞춰주시면 되겠습니다.

저도 구글 코랩에서 실습하는데 자꾸 오류가 나서 해결방법을 공유합니다. ^_^

g0n1.tistory.com/103

 

[디버깅] WARNING:tensorflow:Your input ran out of data; interrupting training.

케라스 창시자에게 배우는 딥러닝 예시 코드 5-14 실행 중 다음과 같은 오류 발생 Found 2000 images belonging to 2 classes. Found 1000 images belonging to 2 classes. Epoch 1/100 63/100 [=================..

g0n1.tistory.com


기본 모델

우선 케라스 Sequential API를 이용해 모델을 만들어봅시다.

from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation = 'relu', input_shape=(28,28,1)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3), activation = 'relu')
model.add(layers.MaxPooling2D((2,2))
model.add(layers.Conv2D(64,(3,3), activation = 'relu')
model.add(layers.Flatten())
model.add(layers.Dense(64,activation='relu'))
model.add(layer.Dense(64, activation='softmax'))  # 10개의 클래스를 분류해주는 출력층
# model.add(layer.Dense(1, activation='sigmoid')) # binary classification을 위한 출력층

순식간에 CNN 모델을 만들었습니다.

model.summary()를 찍어서 파라미터와 모델을 살펴봅시다.


컨브 레이어, Conv2D

이전 장의 Dense 레이어와 Conv2D 레이어 파라미터 중 차이가 나는 파라미터는 (3,3)이라는 파라미터가 보이네요. 저 파라미터는 window라고 부릅니다. 저 윈도우라는 녀석이 본인의 사이즈(3x3)만큼 이미지 위를 돌아다니면서(슬라이딩) 조금씩 나눠서 살펴봅니다. 그리고 그렇게 나오는 특성, 정보들을 Maxpooling을 통해 핵심만 뽑아내는 것이죠.

Convolution 연산은 (height, width, depth or channel)로 구성된 3D텐서에 대해 수행됩니다.

만약 인풋이 RGB 값을 갖는 경우에는 채널이 3, 그레이스케일(흑백)의 경우에는 채널이 1이 될 것입니다.

인풋에서는 채널이라는 표현이, 그 후의 출력에 대해서는 채널보다는 깊이라는 표현이 적절해보입니다.


인풋과 아웃풋

첫번째 층을 보시면 input으로 (28, 28, 1)을 넣어줬는데 output으로는 (26,26,32)가 나왔습니다. 

아웃풋의 이미지 사이즈를 알아내는 법은 간단합니다. 문과적으로 나타내보겠습니다.

output size = input size - kernel + 1

위 모델의 첫번째 Conv2D층을 가지고 계산해보자면, input size는 28, kernel은 3이므로

26 = 28 - 3 + 1

그렇다면 인풋과 아웃풋 사이즈는 늘 다를까요? 아닙니다. 인풋과 아웃풋 사이즈를 같은 값으로 만들고 싶으시다면 

패딩을 사용할 수 있는데요, 다음과 같이 넣어주시면 됩니다.

# 패딩 사용 O
model.add(layers.Conv2D(64,(3,3), activation = 'relu', padding='same')
# 패딩 사용 X
model.add(layers.Conv2D(64,(3,3), activation = 'relu', padding='valid')

 

그 밖에도 아웃풋의 크기는 스트라이드에 따라 더 작아질 수도 있습니다. 제가 아까 윈도우가 이미지 위를 돌아다니면서(슬라이딩) 꼼꼼히 살펴본다고 했는데, 이미지를 돌아다닐 때 조금 더 큰 보폭으로 다니게(좀 덜 꼼꼼하게 살펴보게) 하는 것이 스트라이드입니다.


맥스 풀링(Maxpooling)

Conv2D층 뒤에는 반드시 MaxPooling2D층이 있다는 사실을 눈치채셨나요?

CNN 모델에서는 인풋을 Conv2D 층을 통해 다양한 정보(Feature map)를 만들어 낸 다음, MaxPooling 레이어를 통해 반으로 접어버립니다.(다운 샘플링)

# 2x2 사이즈의 윈도우의 보폭을 2로 해서 Maxpooling 하겠다.
MaxPooling2D((2,2))

이렇게 되면 처리할 파라미터를 줄여주면서 특성의 공간적 계층 구조를 학습하는데 도움이 된다,,,라고 합니다.

쉽게 말하자면 과대적합을 막으면서 본질(원본에 대한 정보)을 놓치지 않기 위해서입니다.

Q. Max말고 Mean은 안 되나요?

A. 되긴 하는데 Max가 더 잘 작동한답니다. 가장 활성화된, 좋은 정보를 가진, 우수한 Feature를 뽑아내기 때문이겠죠?(유전 알고리즘이 떠오르네요)

 

728x90

댓글