import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784',version=1,cache=True)
from tensorflow.keras.utils import to_categorical
X = (mnist.data.values/255).reshape(len(mnist.data),28,28,1)
y = to_categorical(mnist.target.astype(np.int),10)
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1)
tensorflow와 keras를 import 하고 mnist data를 fetch_openml에서 불러온다.
mnist.data에 feature가, mnist.target에 정답 레이블이 들어 있다.
mnist.data는 (70000, 784)로, 70000개의 흑백의 손글씨 이미지가 들어있고, 한 이미지는 28*28의 픽셀로 이루어져 있는데 28*28 = 784개의 픽셀이 한 행에 일렬로 놓인다. 각 픽셀은 0부터 255까지의 정수로 흑백을 나타낸다.
mnist.data.values/255로 모든 픽셀이 0~1사이의 값을 갖도록 정규화를 해주었다.
또한, CNN에 넣는 이미지 데이터는 4차원이어야 한다. (행의 개수, width, height, channel)이고, mnist data는 28*28 픽셀로 이루어져있으므로 width = 28, height = 28으로, 흑백 이미지이므로 channel = 1로 넣어준다.
mnist.target은 0~9까지의 정답 라벨이 들어있는데, str 형식으로 되어있기 때문에 astype(np.int)로 정수 형태로 바꿔주고, one hot encoding을 위해 to_categorical 함수를 적용해준다.
from keras.models import Sequential
from keras.layers import Dense,Flatten,Dropout
from keras.layers.convolutional import Conv2D,MaxPooling2D
model = Sequential()
model.add(Conv2D(filters=32,kernel_size=(3,3),strides=(1,1),padding='Same',activation='relu',input_shape=(28,28,1)))
model.add(Conv2D(filters=32,kernel_size=(3,3),strides=(1,1),padding='Same',activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=64, kernel_size=(3,3),strides=(1,1),padding='Same',activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3,3),strides=(1,1),padding='Same',activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(units=128,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(units=10,activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
model.summary()

keras.layers.convolutional에서 Conv2D, Maxpooling2D를 import 하여 layer을 쌓았다.

hist = model.fit(X_train,y_train,epochs =5 , batch_size=1000,verbose=2)
fit으로 train set을 학습시키고 이를 hist 변수에 저장했다.
loss,acc = model.evaluate(X_test,y_test)
print('손실값:',round(loss,3))
print('정확도:',round(acc,3))
손실값: 0.032 정확도: 0.994
train 된 model에 test set을 넣고 평가했을 때 정확도가 매우 높은 수준으로 나왔다.
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.subplot(1,2,1)
plt.plot(hist.history['loss'],color='blue',linestyle='--',label='train')
plt.plot(hist.history['val_loss'],color='red',label='validation')
plt.xlabel('epoch',fontsize=15)
plt.ylabel('loss',fontsize=15)
plt.title('LOSS',fontsize=18)
plt.grid(linestyle='--')
plt.legend(fontsize=15,loc="best")
plt.ylim(0,0.2)
plt.subplot(1,2,2)
plt.plot(hist.history['accuracy'],color='blue',linestyle='--',label='train')
plt.plot(hist.history['val_accuracy'],color='red',label='validation')
plt.xlabel('epoch',fontsize=15)
plt.ylabel('accuracy',fontsize=15)
plt.title('ACCURACY',fontsize=18)
plt.grid(linestyle='--')
plt.legend(fontsize=15,loc="best")
plt.ylim(0.9,1)
plt.show()
모델 학습 결과를 변수에 저장하면 epoch 별 loss와 accuracy를 알 수 있다. 이를 통해 epoch에 따라 loss와 accuracy의 변화를 train set과 test set으로 나눠 시각화 했다.

'딥러닝 > 인공신경망' 카테고리의 다른 글
LSTM 실습: reuters 예제 (0) | 2021.07.27 |
---|---|
LSTM 실습: imdb 예제 (0) | 2021.07.26 |
CNN 실습: fashion mnist 예제 (0) | 2021.07.23 |
tensorflow, keras 실습: mnist 예제 (2) | 2021.07.22 |
tensorflow, keras 실습: Iris data (0) | 2021.07.22 |