2021. 7. 8. 00:09ㆍICT 멘토링/혼자 공부하는 머신러닝+딥러닝
19강 - 신경망 모델 훈련 ▶️인경 신경망 모델 훈련의 모범 사례 학습하기

지난 시간에

손실 곡선
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()

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

더 많은 에포크
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
'ICT 멘토링 > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글
21강 - 합성곱 신경망을 사용한 이미지 분류 (0) | 2021.07.08 |
---|---|
20강 - 합성곱 신경망의 개념과 동작 원리 배우기 (0) | 2021.07.08 |
18강 - 심층 신경망 ▶️인공 신경망에 층을 추가하여 심층 신경망 만들어 보기 (0) | 2021.07.01 |
17강 - 인공 신경망 ▶️ 간단한 인공 신경망 모델 만들기 (0) | 2021.06.24 |
11강 - 로지스틱 회귀로 와인 분류하기 & 결정 트리 (0) | 2021.06.24 |