반응형
1. 데이터 전처리
import tensorflow as tf
from tensorflow.keras import layers, utils
from tensorflow.keras.datasets import mnist
# data loading
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 60000*(28*28) -> 60000*(784) (28*28 2차원 metrix를 784 1차원으로 바꿈)
X_train = X_train.reshape(60000, 784)
# float로 바꿈
X_train = X_train.astype('float32')
X_test = X_test.reshape(10000,784).astype('float')
# data를 0과 1사이값으로 normalize
X_train /= 255
X_test /= 255
# 자동 one hot coding 가능
y_train = utils.to_categorical(y_train, 10)
y_test = utils.to_categorical(y_test, 10)
2. 전처리된 데이터 확인
import math
# 10번째 샘플의 실제 숫자 모양확인
for i in range(784):
if i%28==0:
print()
print(math.ceil(X_train[10][i]),end=" ")
print()
print(y_train[10])
출력값
3. 모델링
# Sequential 시작
model = tf.keras.Sequential()
# 첫번째 input layer
# dropout : mini batch마다 랜덤하게 적용한다.
# node의 개수 : 512개, input node : 784개
model.add(layers.Dense(512, input_shape=(784,)))
model.add(layers.Activation('relu'))
model.add(layers.Dropout(0.2))
# 두번째 hidden layer
model.add(layers.Dense(512))
model.add(layers.Activation('relu'))
model.add(layers.Dropout(0.2))
# 세번째 output layer
# classification에서 activation함수는 softmax를 주로쓴다.
# 아웃풋은 10개 (숫자 0~9)
model.add(layers.Dense(10))
model.add(layers.Activation('softmax'))
# compile model
model.compile(loss='categorical_crossentropy',
optimizer='Adam',
metrics=['accuracy'])
# train model
'''
batch_size : 몇번의 학습마다 weight를 개선할것인지 판단
epochs : train을 총 몇번 반복할 것인가 (과도하게 하면 overfitting 발생)
validation_split : train set 중 몇프로를 validation으로 정할것인가. (매 epochs마다 확인)
early_stop : 조기 종료조건, val_loss가 10번까지 개선되지 않으면 종료.
shuffle : 매 epoch마다 데이터 순서 섞음
verbose : 학습의 과정을 보여줌. ( 0:표시x, 1:진척도표시, loss, accuracy변화표시, 2:매epoch마다)
'''
early_stop = tf.keras.callbacks.EarlyStopping(
monitor='val_loss', patience=10)
hist = model.fit(X_train, y_train,
batch_size=100, epochs=50,
validation_split=0.2, callbacks=[early_stop],
shuffle=True, verbose=1)
# evaluate model
score = model.evaluate(X_test, y_test, verbose=1)
print('loss=', score[0])
print('accuracy=', score[1])
4. 학습과정
ㄴ60000개 중 validation으로 0.2를 제외했으므로 48000만을 가지고 최대 50번 학습
ㄴ5번째 Epoch에서 val_loss는 0.078, 이후 10번동안 val_loss 개선없으므로 15번째 Epoch에서 종료
5. 학습결과
model.summary()
input layer :
(784+1)*512 = 401920
hiddn layer :
(512+1)*(512)=262656
output layer:
(512+1)*10=5130
6. 시각화
import matplotlib.pyplot as plt
fig, loss_ax = plt.subplots(figsize=(10, 5))
acc_ax = loss_ax.twinx()
loss_ax.plot(hist.history['loss'], 'y', label='train loss')
loss_ax.plot(hist.history['val_loss'], 'r', label='val loss')
acc_ax.plot(hist.history['accuracy'], 'b', label='train acc')
acc_ax.plot(hist.history['val_accuracy'], 'g', label='val acc')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
acc_ax.set_ylabel('accuray')
loss_ax.legend(loc='upper left')
acc_ax.legend(loc='lower left')
plt.show()
반응형