def build_model(tm):
inputs = Input(shape=(28, 28, 1))
x = inputs
x = Conv2D(32, 3, strides=(1, 1), padding='same', kernel_initializer='he_normal',
activation='relu')(x)
x = MaxPooling2D(strides=(2, 2))(x)
x = Dropout(0.25)(x)
x = Conv2D(64, 3, activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
x = Dropout(0.25)(x)
x = Conv2D(128, 3, activation='relu')(x)
x = Dropout(0.4)(x)
x = Flatten()(x)
print(x.shape)
x = Dense(128, activation='relu')(x)
x = Dropout(0.3)(x)
x = Dense(tm.param_info['num_classes'], activation='softmax')(x)
model = Model(inputs=inputs, outputs=x)
model.compile(optimizer=Adam(),
loss='categorical_crossentropy',
metrics=['acc'])
# categorical_crossentropy -> y_train, y_test -> to_categorical
model.summary()
return model
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 28, 28, 1)] 0
_________________________________________________________________
conv2d (Conv2D) (None, 28, 28, 32) 320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 14, 14, 32) 0
_________________________________________________________________
dropout (Dropout) (None, 14, 14, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 12, 12, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 6, 6, 64) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 6, 6, 64) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 4, 4, 128) 73856
_________________________________________________________________
dropout_2 (Dropout) (None, 4, 4, 128) 0
_________________________________________________________________
flatten (Flatten) (None, 2048) 0
_________________________________________________________________
dense (Dense) (None, 128) 262272
_________________________________________________________________
dropout_3 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 1290
=================================================================
Total params: 356,234
Trainable params: 356,234
Non-trainable params: 0
_________________________________________________________________
- Conv2D에서
pad=same
이면 입력과 출력의 모양이 같다.
28_28_1 → 28_28_32 - Conv2D에서
pad=valid
이면pad=0
이다. - Conv2D의 output_shape는
이다. 다만 `패딩=valid`이면 0이고, `패딩=same`이면 계산할 필요가 없다.
Conv2D에서 3x3을 사용할 경우, 원래 크기에서 3을 빼주고 1을 더해주므로 결과적으로 2를 빼준 것이 된다. 패딩이 없다면 단순히 크기를 빼고 1을 더해준다.
Conv2D에서 1x1을 사용할 경우, 원래 크기에서 1을 빼주고 1을 더해주고, strides가 1이므로 원래의 크기와 같다.
MaxPool2D에서 parameter 없이 (2,2)만 입력하면 pool_size이다.
MaxPool2D에서 strides를 입력하지 않아서
strides=None
이면strides=(pool_size)
이다.MaxPool2D에서 output_shape는
이다. 윗 식에서 padding이 없다.
- MaxPool2D에서 (2,2)를 이용할 경우, pool_size=2, strides=2가 되므로, 2를 빼주고 2를 나누고 1을 더한 값이 된다.
'Python > Python 딥러닝' 카테고리의 다른 글
L1 L2 Norm의 세계: 맨해튼부터 유클리드, 무한대까지 (0) | 2024.01.20 |
---|---|
[Keras]무슨옷-무슨색? ImageGenerator를 이용한 Multi-label Class Classification (0) | 2020.07.15 |
Keras를 이용한 보스턴 주택가격 예측 + K-Fold (0) | 2020.07.15 |
keras를 이용한 mnist 숫자 데이터 분류(2) (0) | 2020.07.13 |
Keras를 이용한 mnist 숫자 데이터 분류(1) (0) | 2020.07.13 |