matplotlib 그래프 그리기 DNN 딥러닝 Line chart

 딥러닝을 맨 처음 테스트로 배우는  쉬운 예제로 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의 오류를 범 할 수 있다. 




댓글 없음:

댓글 쓰기

[주식 클로드 자동매매 프로젝트] 제2편. 데이터 인프라 구축 — 모델보다 데이터가 먼저다

 머신러닝 모델을 이야기하기 전에, 그 모델이 먹는 데이터가 어디서 어떻게 왔는지부터 정직하게 밝혀야 한다. 이 프로젝트에서 가장 많은 시간이 들어간 부분은 화려한 모델 튜닝이 아니라, "내가 정말 그 데이터를 갖고 있는가"를 확인하...