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의 오류를 범 할 수 있다. 




댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...