colab link
Image Classification Using Convolutional Neural Networks.ipynb
1. 패션 MNIST 데이터 불러오기
train_scaled = train_input.reshape(-1, 28, 28, 1) / 255.0
2. 합성곱 신경망 만들기
(1번째 합성곱 신경망층)
model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape = (28,28,1)))
model.add(keras.layers.MaxPooling2D(2))
2번째 합성곱층 & 완전 연결층
1번째 합성곱층과 마찬가지로 세임페딩을 사용하고, 풀링 층에서 이 크기를 절반으로 줄일 것임
따라서, 최종 특성 맵의 크기는 (7, 7, 64)
model.add(keras.layers.Conv2D(64, kernel_size=3, activation = 'relu', padding='same'))
model.add(keras.layers.MaxPooling2D(2))
완전 연결층
3차원 특성 맵을 일렬로 펼쳐야됨(마지막 10개의 뉴런(출력층)이 확률을 계산하도록)
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(10, activation='softmax'))
<br/ >
[참고] 모델 구조 설명
(1)summary()
Model: "sequential" ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ conv2d (Conv2D) │ (None, 28, 28, 32) │ 320 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ max_pooling2d (MaxPooling2D) │ (None, 14, 14, 32) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ max_pooling2d_1 (MaxPooling2D) │ (None, 7, 7, 32) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ conv2d_1 (Conv2D) │ (None, 7, 7, 64) │ 18,496 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ max_pooling2d_2 (MaxPooling2D) │ (None, 3, 3, 64) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ flatten (Flatten) │ (None, 576) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense (Dense) │ (None, 100) │ 57,700 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dropout (Dropout) │ (None, 100) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_1 (Dense) │ (None, 10) │ 1,010 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘ Total params: 77,526 (302.84 KB) Trainable params: 77,526 (302.84 KB) Non-trainable params: 0 (0.00 B)
(2)
plot_model()
3. 모델 컴파일과 훈련
딥러닝 모델의 종류나 구성방식에 상관없이 컴파일과 훈련 과정이 항상 동일하다
model.compile(optimizer='adam', loss= 'sparse_categorical_crossentropy', metrics = ['accuracy'])
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-cnn-model.h5.keras', save_best_only= True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2, restore_best_weights= True)
history = model.fit(train_scaled, train_target, epochs=20, validation_data=(val_scaled, val_target),
callbacks = [checkpoint_cb, early_stopping_cb])
8번째 에포크가 최적, 10번째에서 조기중단함을 확인할 수 있음.
preds = model.predict(val_scaled[0:1]) #슬라이싱
print(preds)
[Output]
[[7.1790615e-11 1.9371986e-16 3.0953423e-14 7.3020035e-13 3.2941784e-13
2.9614533e-11 1.7263002e-11 4.9220489e-12 1.0000000e+00 8.7399997e-14]]
9번째 클래스에 해당(1)하고 나머지 클래스에 대한 확률은 0이나 다름없음
test_scaled = test_input.reshape(-1, 28, 28, 1) / 255.0
model.evaluate(test_scaled, test_target)
accuracy는 0.9116으로, 모델을 실전에 투입하여 분류한다면 91%의 성능을 기대해볼 수 있을 것