티스토리 뷰
합성곱 신경망의 구조와 구성 요소에 대하여 다뤘으니, 이번에는 본격적으로 합성곱 신경망을 직접 설계하고 이용하여 이미지 분류를 해보자.
우선, 동일하게 데이터를 준비해주자.
from tensorflow import keras
from sklearn.model_selection import train_test_split
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
train_scaled = train_input.reshape(-1, 28, 28, 1) / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42
)
Conv2D 층을 사용하기 위해 reshape를 사용하여 2차원 배열로 만들었다.
이제 합성곱 신경망을 만들어주자.
32개의 필터를 사용하며, 커널의 크기는 (3, 3), 세임 패딩을 사용하는 합성곱 층을 하나 신경망에 추가한다.
model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape=(28, 28, 1)))
필터의 크기가 32이기 때문에 이 합성곱 층을 통과한 특성 맵은 32개의 깊이(채널)을 가지게 되며, 그 크기는 (28, 28, 32)가 될 것이다.
이제 최대 풀링 층을 추가한다.
model.add(keras.layers.MaxPooling2D(2))
전형적인 (2, 2) 크기의 풀링을 추가하여 특성 맵의 크기를 줄였다. 단, 채널의 크기는 동일하다. 이제 특성 맵의 크기는
(14, 14, 32) 이다.
두번째 합성곱 - 풀링 층을 추가해보자. 이번에는 필터를 64개로 늘렸다.
model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu', padding='same'))
model.add(keras.layers.MaxPooling2D(2))
마찬가지로 세임 패딩을 사용하고, (2, 2) 크기의 풀링을 통과한다.
이 두개의 층을 통과한 특성 맵의 크기는 이제 (7, 7, 64) 가 된다.
이제 100개의 뉴런을 가진 은닉층과 10개의 뉴런을 가진 출력층에 특성 맵을 매칭시켜야 하니, Flatten 층을 사용하여 일렬로 펼치고 드롭아웃으로 규제도 추가해주자.
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'))
이렇게 하면 합성곱 신경망을 모두 완성한 것이다!
이제 summary로 확인해보면,
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 28, 28, 32) 320
max_pooling2d (MaxPooling2D (None, 14, 14, 32) 0
)
conv2d_1 (Conv2D) (None, 14, 14, 64) 18496
max_pooling2d_1 (MaxPooling (None, 7, 7, 64) 0
2D)
flatten (Flatten) (None, 3136) 0
dense (Dense) (None, 100) 313700
dropout (Dropout) (None, 100) 0
dense_1 (Dense) (None, 10) 1010
=================================================================
Total params: 333,526
Trainable params: 333,526
Non-trainable params: 0
위와 같이 신경망이 잘 구성된 것을 확인할 수 있다.
이를 그림으로 나타내면 아래와 같다.
합성곱 신경망을 성공적으로 구성했으니, 이제 이 신경망을 compile한 뒤에 콜백을 넣고 훈련을 시키자.
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-cnn-model.h5', 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])
Epoch 1/20
1500/1500 [==============================] - 24s 16ms/step - loss: 0.5369 - accuracy: 0.8109 - val_loss: 0.3429 - val_accuracy: 0.8706
Epoch 2/20
1500/1500 [==============================] - 23s 15ms/step - loss: 0.3540 - accuracy: 0.8734 - val_loss: 0.2805 - val_accuracy: 0.8957
Epoch 3/20
1500/1500 [==============================] - 23s 15ms/step - loss: 0.3041 - accuracy: 0.8898 - val_loss: 0.2586 - val_accuracy: 0.9021
Epoch 4/20
1500/1500 [==============================] - 23s 15ms/step - loss: 0.2694 - accuracy: 0.9007 - val_loss: 0.2381 - val_accuracy: 0.9112
Epoch 5/20
1500/1500 [==============================] - 23s 15ms/step - loss: 0.2456 - accuracy: 0.9101 - val_loss: 0.2415 - val_accuracy: 0.9116
Epoch 6/20
1500/1500 [==============================] - 24s 16ms/step - loss: 0.2262 - accuracy: 0.9170 - val_loss: 0.2327 - val_accuracy: 0.9154
Epoch 7/20
1500/1500 [==============================] - 23s 15ms/step - loss: 0.2100 - accuracy: 0.9223 - val_loss: 0.2292 - val_accuracy: 0.9201
Epoch 8/20
1500/1500 [==============================] - 23s 15ms/step - loss: 0.1989 - accuracy: 0.9264 - val_loss: 0.2319 - val_accuracy: 0.9178
Epoch 9/20
1500/1500 [==============================] - 23s 15ms/step - loss: 0.1807 - accuracy: 0.9326 - val_loss: 0.2514 - val_accuracy: 0.9129
훈련 세트의 정확도가 일반 인공 신경망을 구성했을 때 보다 훨씬 좋아진 것을 확인할 수 있다.
이제 그래프를 그려 검증 손실과 한번 비교해보고, 조기 종료가 잘 이뤄졌는 지 확인하자.
import matplotlib.pyplot as plt
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
최적의 에포크 또한 잘 찾은 것으로 보인다.
이제 검증 점수를 확인하고, 검증 세트 1번 샘플을 잘 맞췄는 지 한번 보자.
model.evaluate(val_scaled, val_target)
# 375/375 [==============================] - 1s 4ms/step - loss: 0.2292 - accuracy: 0.9201
preds = model.predict(val_scaled[0:1])
print(preds)
# [[8.8279276e-17 7.9278036e-25 3.1394994e-20 3.2037830e-17 2.3804953e-17
# 4.0013773e-15 2.9250701e-15 5.3349407e-16 1.0000000e+00 9.8920915e-17]]
검증 점수도 상당히 높을 뿐더러 1번 샘플에 대한 예측 또한 거의 100%의 확률로 확신하고 있다!
마지막으로 테스트 세트에 대한 점수를 확인해보면,
test_scaled = test_input.reshape(-1, 28, 28, 1) / 255.0
model.evaluate(test_scaled, test_target)
# 313/313 [==============================] - 1s 4ms/step - loss: 0.2528 - accuracy: 0.9139
약 0.91 정도로 굉장히 높은 걸 볼 수 있다.
이렇게 합성곱 신경망이 이미지 처리에 얼마나 특화되어 있는 지 알 수 있다!
끝!
'[Python] > Machine learning' 카테고리의 다른 글
[ML] Deep Learning 4: 합성곱 신경망(CNN)의 구조 (0) | 2023.03.07 |
---|---|
[ML] Deep Learning 3: 신경망 모델 훈련과 최상의 신경망 모델 얻기 (0) | 2023.03.06 |
[ML] Deep Learning 2: 심층 신경망 (0) | 2023.03.06 |
[ML] Deep Learning 1: 인공 신경망 (1) | 2023.03.05 |
[ML] 비지도 학습 3: 주성분 분석 (0) | 2023.03.02 |
- AsyncStorage
- 정보보안기사 #실기 #정리
- 이탈리안 레스토랑
- react-native
- await
- 파니노구스토
- 맛집
- redux
- react
- redux-thunk
- Async
- 인천 구월동 맛집
- 인천 구월동 이탈리안 맛집
- Promise
- javascript
- Total
- Today
- Yesterday