[케라스] 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()
'노트 > Python : 프로그래밍' 카테고리의 다른 글
[케라스] 암 분류기 , 당뇨병 분류기 파이썬 코드 (0) | 2020.04.18 |
---|---|
[파이썬] 데이터변형 | 이항변수화 , 이산화 (0) | 2020.04.17 |
[텐서플로우] 다중회귀분석 (Multi-variable Linear Regression) 파이썬 코드 (0) | 2020.04.17 |
[텐서플로우] 로지스틱 회귀(Logistic Regression) 분류 파이썬 코드 (0) | 2020.04.16 |
[텐서플로우] 선형회귀분석(Linear Regression) 기본 구조 파이썬 코드 (0) | 2020.04.14 |