📌 이 글은 권철민님의 딥러닝 CNN 완벽 가이드를 바탕으로 정리한 내용입니다.
목차
- Keras에서 Conv2D와 Pooling의 적용
- Conv2D 적용하기
- Pooling 적용하기
- CNN 모델 생성하기
- Fully Connected Layer와 연결
Keras에서 Conv2D와 Pooling의 적용
- Conv2D() 를 모델에 적용 시에는 반드시 입력은 배치 크기를 제외하고 3차원이 되어야 한다.(즉., 배치를 포함하면 4차원)
1개의 Filter는 무조건 3차원이다.
따라서 32개의 커널을 만들어 주세요 라는 의미로 쓰인게 아니다.
그냥 Filter의 개수가 32개라는 것이다.
Filter 에는 커널이 하나 들어가 있다.
입력으로 들어오는 채널의 차원 (28, 28, 1) 과 자동적으로 맞아야 한다. 안 맞으면 아예 연산이 안된다.
(28, 28, 1)은 28x28 커널의 개수가 하나 인 것. 그렇기 때문에 3차원이다.
(filters=32) 의 뜻은 Filter의 갯수이다.
즉 28x28x1 이 32개가 있는 것이다.
그러면 파라미터는 3x3x32 = 288 에다가 bias 32개(개별 Filter마다 하나씩의 bias가 존재하기 때문에)를 더하면 총 320개의 파라미터가 나온다.
Conv2D 적용하기
따라서 아래 코드를 돌려보면 차원이 16개가 만들어 진 것을 확인할 수 있다.
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D
from tensorflow.keras.models import Model
input_tensor = Input(shape=(28, 28, 1))
x = Conv2D(filters=16, kernel_size=3, strides=1, padding='same', activation='relu')(input_tensor)
print('x type:', type(x), 'x:', x)
Conv2D의 배치는 무조건 3차원이다.
stride=1 : stride 간격을 1로 한다.
padding='same' : 원본 피쳐맵에 맞춘다.
padding='valid' : 원본 피쳐맵에서 2개 줄어듦
activation='relu' : 비선형성을 학습
Pooling 적용하기
input_tensor = Input(shape=(28, 28, 1))
x = Conv2D(filters=16, kernel_size=3, strides=1, padding='same', activation='relu')(input_tensor)
x = MaxPooling2D(2)(x)
print(x)
Pooling의 디폴트는 2이다.
Pool size를 2x2 로 가져가므로 28x28 의 Feature map이 14x14가 된 것을 확인할 수 있다.
CNN 모델 생성하기
input_tensor = Input(shape=(28, 28, 1))
x = Conv2D(filters=32, kernel_size=3, strides=1, padding='same', activation='relu')(input_tensor)
x = Conv2D(filters=64, kernel_size=3, activation='relu')(x)
x = MaxPooling2D(2)(x)
model = Model(inputs=input_tensor, outputs=x)
model.summary()
input_tensor를 집어 넣었을 때, output은 (28,28,32) 가 나왔다.
(28, 28, 1)은 28x28 커널의 개수가 하나 인 것. 그렇기 때문에 3차원이다.
conv2d_5 에서 32는 Filter 개수이다.
즉, 28x28x1 이 32개가 있는 것이다.
그러면 파라미터는 3x3x32 = 288 에다가 bias 32개(개별 Filter마다 하나씩의 bias가 존재하기 때문에)를 더하면 총 320개의 파라미터가 나온다.
이 결과를 다시 Conv2D 연산하면, output은 (26,26,64)가 나온다.
26은 Padding을 안했기 때문에 3x3 연산에서 2개가 줄어든 것이다.
18496 = 32x3x3x64 + 64(bias)
그 다음에 MaxPooling2D 를 적용해서 절반으로 줄었다.
MaxPooling은 피쳐맵을 줄이는 것이기 때문에 파라미터가 없다.
이렇게 끝나면 결과는 3차원으로 나오게 된다.
Fully Connected Layer와 연결
# 3차원으로 되어있는 Feature map 결과를 Fully Connected 연결하기 위해서는 Flatten()을 적용해야함
x = Flatten(x)
x = Dense(100, activation='relu')(x)
output = Dense(10, activation='softmax')(x)
model = Model(inputs=input_tensor, outputs=output)
model.summary()
Fully Connected layer와 연결하기 위해서는 1차원으로 뭉그러 뜨려야 한다.
그렇게 하기 위해서 Flatten을 해준다.
그리고 Dense로 연결을 해주면 13x13x64 = 10816 를 중간에 하나의 레이어로 연결해주고
최종적으로 classification을 위해서 softmax를 해준다.
'🖼 Computer Vision > CNN' 카테고리의 다른 글
CNN - Convolution 연산에서 Filter에 대한 이해 (2) | 2022.03.02 |
---|---|
CNN - Fashion MNIST 예측 모델 구현하기 (0) | 2022.03.02 |
CNN - Stride, Padding, Pooling (0) | 2022.02.15 |
CNN - Kernel & Feature map (0) | 2022.02.15 |
CNN - Convolution 연산의 이해 (0) | 2022.02.15 |