실습 코드
import tensorflow as tf
from tensorflow import keras
from keras import layers
def get_sequential_model(input_shape):
model = keras.Sequential(
[
# Input
layers.Input(input_shape),
# 1st Conv block
layers.Conv2D(64, 3, strides=1, activation='relu', padding='same'),
layers.Conv2D(64, 3, strides=1, activation='relu', padding='same'),
layers.MaxPool2D(), # 이미지 사이즈 반으로 축소
layers.BatchNormalization(),
layers.Dropout(0.5),
# 2nd Conv block
# 이미지 사이즈가 축소되었으면 필터사이즈를 키워주는게 일반적 / 64 -> 128
layers.Conv2D(128, 3, strides=1, activation='relu', padding='same'),
layers.Conv2D(128, 3, strides=1, activation='relu', padding='same'),
layers.MaxPool2D(),
layers.BatchNormalization(),
layers.Dropout(0.3),
# Classifier
layers.GlobalMaxPool2D(), # 한 필터에서 하나의 값만 가져오게 함
layers.Dense(128, activation='relu'),
layers.Dense(1, activation='sigmoid')
]
)
return model
input_shape = (256, 256, 3)
model = get_sequential_model(input_shape)
model.summary()
- filters: 몇 개의 다른 종류의 필터를 활용할 것인지를 나타냄. 출력 모양의 깊이(depth)를 결정
- kernel_size: 연산을 수행할 때 윈도우의 크기를 의미
- strides: 윈도우가 가로 그리고 세로로 움직이면서 내적 연산을 수행하는데, 한 번에 얼마나 움직일지를 의미
- padding: 이미지 사이즈를 방지하기 위해 사용되는 인자
Model Summary
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 256, 256, 64) 1792
conv2d_1 (Conv2D) (None, 256, 256, 64) 36928
max_pooling2d (MaxPooling2D (None, 128, 128, 64) 0
)
batch_normalization (BatchN (None, 128, 128, 64) 256
ormalization)
dropout (Dropout) (None, 128, 128, 64) 0
conv2d_2 (Conv2D) (None, 128, 128, 128) 73856
conv2d_3 (Conv2D) (None, 128, 128, 128) 147584
max_pooling2d_1 (MaxPooling (None, 64, 64, 128) 0
2D)
batch_normalization_1 (Batc (None, 64, 64, 128) 512
hNormalization)
dropout_1 (Dropout) (None, 64, 64, 128) 0
global_max_pooling2d (Globa (None, 128) 0
lMaxPooling2D)
dense (Dense) (None, 128) 16512
dense_1 (Dense) (None, 1) 129
=================================================================
Total params: 277,569
Trainable params: 277,185
Non-trainable params: 384
1) Conv2D Layer
컨볼루션 레이어의 파라미터 수는 필터의 크기, 입력 채널의 수, 그리고 필터의 수에 의해 결정된다. 파라미터수는 다음과 같은 공식으로 계산된다. 이때, 입력 채널 수는 입력 이미지의 채널 수에 따라 달라진다.
파라미터 수 = (필터 높이 × 필터 너비 × 입력 채널 수) × 필터 수 + 편향 값
파라미터 계산
- conv2d : kernel_size = 3, Input_channel = 3(RGB), filters = 64, bias = 64
- conv2d_1 : kernel_size = 3, Input_channel = 64, filters = 64, bias = 64
- conv2d_2 : kernel_size = 3, Input_channel = 64, filters = 128, bias = 128
- conv2d_3 : kernel_size = 3, Input_channel = 128, filters = 128, bias = 128
conv2d (Conv2D) (None, 256, 256, 64) (3x3x3) x 64 + 64 = 1792
conv2d_1 (Conv2D) (None, 256, 256, 64) (3x3x64) x 64 + 64 = 36928
conv2d_2 (Conv2D) (None, 128, 128, 128) (3x3x64) x 128 + 128 = 73856
conv2d_3 (Conv2D) (None, 128, 128, 128) (3x3x128) x 128 + 128 = 147584
2) BatchNormalization Layer
배치 정규화 레이어의 파라미터 수는 정규화되는 특성(또는 채널)의 수에 의해 결정된다. 특성에 대해 평균과 분산을 조정하는 데 사용되는 스케일링 인자와 이동 인자가 있으므로, 파라미터 수는 두 배가 된다.
파라미터 수 = 특성 수 x 2
※ 특성 수 : 해당 층에 입력되는 데이터의 차원 또는 특성의 개수
파라미터 계산
# 학습 가능한 파라미터(γ와 β 각각 64개씩, 총 128개)와 이동 평균과 분산(각각 64개씩, 총 128개)을 모두 포함
batch_normalization (BatchNormalization) (None, 128, 128, 64) 64 x 2 + 64 x 2 = 256
# 학습 가능한 파라미터(γ와 β 각각 128개씩, 총 256개)와 이동 평균과 분산(각각 128개씩, 총 256개)을 모두 포함
batch_normalization_1 (BatchNormalization) (None, 64, 64, 128) 128 x 2 + 128 x 2 = 512
3) Dropout Layer
드롭아웃 층은 과적합을 방지하기 위해 사용된다. 훈련 중에 무작위로 노드의 일부(이 경우 약 50%)를 "끄는" 방식으로 작동한다. 이는 네트워크가 입력 데이터의 작은 변화에 덜 민감하게 되도록 하여, 모델의 일반화 능력을 향상시킨다.
- layers.Dropout(0.5)
- layers.Dropout(0.3)
# 노드의 50% 사용x
dropout (Dropout) (None, 128, 128, 64) 0
# 노드의 30% 사용x
dropout_1 (Dropout) (None, 64, 64, 128) 0
4) Dense Layer
편향 값이 추가되는 방식은 Dense 층(완전 연결 층)에 의해 결정된다. Dense 층에서 각 노드는 입력 데이터의 모든 요소에 대해 가중치를 가지며, 추가적으로 자신만의 편향 값을 하나씩 갖는다. 따라서, 각 Dense 층의 파라미터 수는 입력 노드 수와 출력 노드 수를 기반으로 계산될 때, 출력 노드마다 하나의 편향을 추가하여 계산된다.
파라미터 계산
dense (Dense) (None, 128) 128 x 128 + 128 = 16512
dense_1 (Dense) (None, 1) 128 x 1 + 1 = 129
Total params
1792 + 36928 + 256 + 73856 + 147584 + 512 + 16512 + 129 = 277,569
Trainable params = 277,185
Non-trinable params
batch_normalization layer 에서 이동 평균과 분산 파라미터는 학습에 사용되지 않으므로 제외된다.
64 x 2 + 128 x 2 = 384