딥러닝을 맨 처음 테스트로 배우는 쉬운 예제로 mnist 데이터셋을 사용한다.
사람이 우편번호를 적은 숫자를 컴퓨터가 얼마나 잘 인식 하는지에 대한 문제이다. 복잡한 그림의 문제는 CNN의 Convolution filter를 이용해서 Network를 돌리지만, 이건은 이미 전처리가 다 된 데이터 셋이고, 데이터 건수도 많아서 CNN까지 안 돌리고, 그냥 Deep Learing Network를 돌렸다.
아래는 tensorflow를 import한 다음에 내장 데이터셋 mnlist를 train과 test set으로 나눈것이다.
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step
모델을 돌린다. keras모델인데, 입력을 28,28 이고, Dense 출력은 128개이고 Dropout(0.2)을 한다. 그리고 softmax 함수를 이용해서, 이미지를 분류 한다. 모델을 컴파일 할때는 옵티마이저는 adam 으로 하고 loss 는 크로스 엔트로피 매트릭은 accuracy로 한다.
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
모델을 돌린다. 원래 딥러닝 교육용에는 epochs를 5개를 하였지만, 이번 그래프 그리는 것은 30로 하였다. 그래프의 패턴을 보기 위해서이다.
history = model.fit(x_train, y_train, epochs=10, validation_data= (x_test,y_test))
poch 1/30 1875/1875 [==============================] - 2s 884us/step - loss: 0.4829 - accuracy: 0.8565 - val_loss: 0.1362 - val_accuracy: 0.9607 Epoch 2/30 1875/1875 [==============================] - 1s 750us/step - loss: 0.1504 - accuracy: 0.9560 - val_loss: 0.0993 - val_accuracy: 0.9691 Epoch 3/30 1875/1875 [==============================] - 1s 738us/step - loss: 0.1075 - accuracy: 0.9680 - val_loss: 0.0834 - val_accuracy: 0.9750 Epoch 4/30 1875/1875 [==============================] - 1s 741us/step - loss: 0.0851 - accuracy: 0.9734 - val_loss: 0.0807 - val_accuracy: 0.9752 Epoch 5/30 1875/1875 [==============================] - 1s 736us/step - loss: 0.0717 - accuracy: 0.9780 - val_loss: 0.0716 - val_accuracy: 0.9785 Epoch 6/30 1875/1875 [==============================] - 1s 742us/step - loss: 0.0634 - accuracy: 0.9795 - val_loss: 0.0720 - val_accuracy: 0.9783
처음 진입 할 때는 그냥 숫자만 보았는데, 무엇이 맞고 틀리는지 알 수 가 없었다. 구글링 해도 잘 나오지 않는 이유가 무엇인지 잘 몰랐다.
아래와 같이 학습 그래프를 그려본다. 그래프를 그릴 때, figsize를 정해서 그림을 그려야 한다.
정확도에 대한 학습 그래프, Loss에 대한 학습 그래프를 그리는데, 한 화면에 두장의 그래프가 그려져야 한다.
# figure size 정리 및 그래프 그리기
plt.figure(figsize=(12,4))
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['train', 'validation'])
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'validation']
딥러닝 학습곡선 |
# 잘못 그린 그래프
plt.plot(history.history['accuracy'])
plt.plot(history.history['loss'])
plt.legend(['train', 'loss'])
잘못 그린 학습 곡선 |
실제로 이렇게 그려 놓고, 학습 성능이 좋다고 발표 한 곳도 있었다. 이럴 경우에는 어느선에서 학습을 멈추어야 할지 몰라, Over-fitting의 오류를 범 할 수 있다.
댓글 없음:
댓글 쓰기