[케라스] Keras 모델 생성 기본 구조

2020. 4. 17. 10:03노트/Python : 프로그래밍

케라스 모델 생성 기본 구조

 

1. 데이터 셋 생성 

  • 훈련을 위한 데이터  

  • 검증을 위한 데이터 

  • 테스트를 위한 데이터

2. 모델 구성 

  • 시퀀스 모델 생성한 다음 레이어를 추가( 간단한 모델 )  

  • 복잡한 모델은 케라스 함수API를 사용.  

3. 모델 학습과정 설정 

  • Cost 함수 정의, 최적화 방법 정의  

  • Compile 함수 사용

4. 모델 학습

  • 트레이닝 데이터로 모델 학습  

  • Fit 함수 사용됌 

5. 훈련 셋, 검증 셋의 COST 측정, 정확도 측정 

 

6. 모델 평가 

  • 테스트 데이터셋으로 평가  

  • Evaluate 함수가 사용됌  

7. 모델 사용 

  • 입력 -> 모델 -> 출력 (예측 .. ) 

  • Predict 함수가 사용됌

 

코드 

 

import tensorflow as tf

from keras.datasets import mnist 
from keras.models import Sequential 
from keras.layers import Dense, Activation
from keras.utils import np_utils 

#1 데이터셋 생성하기
(xTrain,yTrain),(xTest,yTest) = mnist.load_data()

#1-1. 데이터 전처리

xTrain = xTrain.reshape(60000,784).astype('float32')/255.0
xTest = xTest.reshape(10000,784).astype('float32')/255.0
yTrain = np_utils.to_categorical(yTrain) # 원핫인코딩 
yTest = np_utils.to_categorical(yTest) # 원핫인코딩 

#2 모델 구성

model = Sequential()
model.add(Dense(units = 64, input_dim = 28*28, activation = 'relu'))
model.add(Dense(units = 10, activation = 'softmax'))

#3 모델 학습과정 설정
model.compile(loss = 'categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy'])
#4. 모델 학습
hist = model.fit(xTrain, yTrain, epochs = 5, batch_size = 32)

# batch_size : 몇개의 샘플로 가중치를 갱신할 것인가 ? 

  • 배치 사이즈가 작을 수록 가중치 갱신이 빈번하게 이루어진다. 
  • 적정한 epoch을 찾아야 함. 
#5 검증셋으로 검증
print("loss:"+ str(hist.history['loss']))
print("accuracy:"+ str(hist.history['accuracy']))

>>>
loss:[2.3006652993520103, 2.300147863006592, 2.2998749731699624, 2.2995195706685383, 2.2992626391092936]
accuracy:[0.112116665, 0.11236667, 0.11236667, 0.11236667, 0.11236667]

#6 모델평가
res = model.evaluate(xTest, yTest, batch_size=32)
print(res)

>>>
10000/10000 [==============================] - 0s 20us/step
[2.2168232261657717, 0.14990000426769257]

#7 모델 예측
xhat = xTest[0:1]
yhat = model.predict(xhat)
print(yhat)

>>>
[[0.14697593 0.14140968 0.11688565 0.10240809 0.07993215 0.07988432
  0.05206802 0.0894298  0.09375894 0.09724738]]

훈련 셋과 데이터 셋을 분리하여 Training 

# 5-1. 훈련데이터 셋 검증 데이터셋 분리 
xVal=xTrain[50000:]
yVal=yTrain[50000:]
xTrain=xTrain[:50000]
yTrain=yTrain[:50000]

# 데이터 전처리 
xTrain=xTrain.reshape(50000,784).astype('float32')/255.0
xVal=xVal.reshape(10000,784).astype('float32')/255.0
xTest=xTest.reshape(10000,784).astype('float32')/255.0

#, 훈련 검증 데이터 선택
tri = np.random.choice(50000,700)
vri = np.random.choice(10000,300)

xTrain = xTrain[tri] #700건 
yTrain = yTrain[tri]
xVal = xVal[vri]  #300건 
yVal = yVal[vri]

yTrain=np_utils.to_categorical(yTrain)
yVal=np_utils.to_categorical(yVal)
yTest=np_utils.to_categorical(yTest)
# 2-1 . 각각 모델 구성 

model=Sequential()
model.add(Dense(input_dim = 28*28, units = 2, activation = 'relu'))
model.add(Dense( units = 10, activation = 'softmax'))

model.compile(loss = "categorical_crossentropy", optimizer = 'sgd', metrics = ['accuracy'])

#3-1. 모델 학습

# 모델 학습 : train data
hist = model.fit(xTrain, yTrain, epochs=3000, batch_size =10, validation_data=(xVal, yVal))

import matplotlib.pyplot as plt 
figs, loss_ax = plt.subplots()
loss_ax.plot(hist.history['loss'],'y',label='train loss')
loss_ax.plot(hist.history['val_loss'],'r',label='val loss')

loss_ax.legend(loc='upper left')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')

plt.show()

 

figs, loss_ax = plt.subplots()
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')

acc_ax.set_ylabel('accuracy')

loss_ax.legend(loc='upper left')
acc_ax.legend(loc='lower left')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')


plt.show()

 

# 6-1. 모델 평가
res=model.evaluate(xTest, yTest, batch_size=32)
print("cost:"+str(res[0]))
print("accuracy:"+str(res[1]))

>>>
10000/10000 [==============================] - 0s 17us/step
cost:3.706244239425659
accuracy:0.2597000002861023

 

 

 

학습 조기종료 earlystopping 

 

손실값이 떨어졌다가 다시 올라가기 시작하는 시점 부터는 더이상 학습을 진행할 필요가 없어서 트레이닝 조기종료를 할 수 있다. 

 

콜백(callback)(함수): 어떤 상황이 되었을 때 (val loss가 떨어지다가 다시 올라가기 시작하는 시점 ) 함수 내에서 또 다른 어떤 함수를 호출하는 것 

 

코드 

Tip 조기종료시에는 원래 트레이닝 했던 데이터에 또 트레이닝 시키지 말고,

아에 첨부터 데이터를 불러와서 조기종료해야 예쁜 그래프가 나온다!

from keras.callbacks import EarlyStopping

# 학습 조기종료 클래스 
es = EarlyStopping(patience=30)

# 모델학습
hist = model.fit(xTrain, yTrain, epochs=3000, batch_size =10, 
                 validation_data=(xVal, yVal), callbacks=[es])


###################  시각화  #######################

figs, loss_ax = plt.subplots()
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')

acc_ax.set_ylabel('accuracy')

loss_ax.legend(loc='upper left')
acc_ax.legend(loc='lower left')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')

plt.show()