19강 - 신경망 모델 훈련 ▶️인경 신경망 모델 훈련의 모범 사례 학습하기

2021. 7. 8. 00:09ICT 멘토링/혼자 공부하는 머신러닝+딥러닝

19강 - 신경망 모델 훈련 ▶️인경 신경망 모델 훈련의 모범 사례 학습하기

 

학습 로드맵

지난 시간에

18강 복습

손실 곡선

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=5, verbose=0)
print(history.history.keys())

#//dict_keys(['loss', 'accuracy'])

 

fit 값의 객체를 받아서 key값을 확인.

loss, accuracy 있는 것 확인 가능.

metrics = 'accuracy' 해서 accuracy도 있는 것.

안 했다면 loss만 존재했을 것.

 

plt.plot(history.history['loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.savefig('7_3-01', dpi=300)
plt.show()

loss 결과

plt.plot(history.history['accuracy'])
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()

accuracy 결과

더 많은 에포크

history = model.fit(train_scaled, train_target, epochs=20, verbose=0)

plt.plot(history.history['loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

에포크를 늘리면 모델이 더 복잡해지고 훈련 세트에 잘 맞는 모델이 됨.

하지만 새로운 모델이 등장했을 때는 잘 맞지 않는 tradeoff 존재함.

훈련 세트의 정확도 vs 검증 세트 or 테스트 세트의 정확도

 

검증 손실

history = model.fit(train_scaled, train_target, epochs=20, verbose=0, 
                    validation_data=(val_scaled, val_target))
                    
print(history.history.keys())

결과

dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])

 

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

훈련 세트는 점점 낮아지지만 검증 세트는 점차 증가함.

이 모델은 훈련 세트엔 잘 맞지만 검증 세트엔 잘 맞지 않는 과대적합된 모델.

 

드롭아웃

신경망 모델만의 규제 방법

 

훈련 시 각 샘플을 은닉층 뉴런의 모델에서 일부 뉴런의 계산을 끄게 됨.

얼마나 끌지는 하이퍼 파라미터. 

어떤 것을 끌지는 랜덤.

테스트나 훈련 시에는 모든 뉴런 사용.

그러면 뉴런이 훈련 세트에 잘 맞지 않게 되고 일부 뉴런에 의존적인 경향을 줄일 수 있음.

 

model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dropout(0.3))
model.add(keras.layers.Dense(10, activation='softmax'))

model.summary()

#// Model: "sequential_4"
#// _________________________________________________________________
#// Layer (type)                 Output Shape              Param #   
#// =================================================================
#// flatten_4 (Flatten)          (None, 784)               0         
#// _________________________________________________________________
#// dense_8 (Dense)              (None, 100)               78500     
#// _________________________________________________________________
#// dropout (Dropout)            (None, 100)               0         
#// _________________________________________________________________
#// dense_9 (Dense)              (None, 10)                1010      
#// =================================================================
#// Total params: 79,510
#// Trainable params: 79,510
#// Non-trainable params: 0
#// _________________________________________________________________

모델 저장과 복원

최적의 모델을 저장하고 싶을 때, save나 save_weights 사용 가능.

weights는 가중치만 저장. 모델 파라미터 저장 X.

h5 - hdf5로 자동 저장.

불러오고 싶을 때는 load, load_weights 사용 가능.

모델 자체를 불러오기 위해서는 keras.models.load_model('model-whole.h5') 사용 가능.

모델을 아예 만들어줌. 모델 파일만 있으면 됨.

 

predict - 각 샘플마다 확률 값 출력.

가장 큰 확률값 인덱스 찾아냄.

axis = 0이면 행을 따라서 최대값의 인덱스 찾아줌.

axis = 1이면 열을 따라서 최대값의 인덱스 찾아줌.

axis = -1이면 마지막 인덱스. (axis = 1과 동일)

model.save_weights('model-weights.h5')
model.load_weights('model-weights.h5')

model.save('model-whole.h5')
model = keras.models.load_model('model-whole.h5')

val_labels = np.argmax(model.predict(val_scaled), axis=-1)
print(np.mean(val_labels == val_target))
#//0.8751666666666666

콜백

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5', 
                                                save_best_only=True)

model.fit(train_scaled, train_target, epochs=20, verbose=0, 
          validation_data=(val_scaled, val_target),
          callbacks=[checkpoint_cb])
          
model = keras.models.load_model('best-model.h5')

모델이 훈련하는 도중에 저장해둔 작업 수행.

ModelCheckpoint 콜백은 지정된 best-model.h5 파일에 fit 을 통해 훈련하는 도중 가장 낮은 손실값을 저장함.

 

epoch를 충분히 크게 해줌.

근데 epoch가 어느 지점에 도달해서는 검증이 의미가 없으므로 조기종료 필요!

조기종료

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5', 
                                                save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,
                                                  restore_best_weights=True)

history = model.fit(train_scaled, train_target, epochs=20, verbose=0, 
                    validation_data=(val_scaled, val_target),
                    callbacks=[checkpoint_cb, early_stopping_cb])
                    
print(early_stopping_cb.stopped_epoch)
#//11

ErarlyStopping - patience, restore_best_weights

증가했다가 다시 감소할 수 있으므로 몇 epoch까지 참을 것인지 의미함.

검증 세트 손실이 2 epoch 이상 증가하면 훈련을 멈추고 가장 낮은 손실로 되돌리라는 의미.

 

11 - 0 ~ 11 이므로 12번째 epoch 의미.

patience=2이므로 12 - 2 = 10번째 epoch가 최적.

즉, 9가 최적인데 그래프를 보면 9번째 epoch가 가장 낮은 손실값을 가짐. 

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.savefig('7_3-07', dpi=300)
plt.show()

 

참고자료

https://www.youtube.com/watch?v=2by0Fz3XC84&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=19