혼공단/혼공단 5기

혼자 공부하는 머신러닝 + 딥러닝 7장 - 신경망 모델 훈련

하양훈 2021. 3. 6. 11:04
반응형

1. 손실 곡선과 검증 손실

 

- 에포크 횟수가 증가함에 따라 손실곡선이 어떻게 변화하는지 그래프로 그려보겠습니다.

#모델 생성
model = model_fn()
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

history = model.fit(train_scaled, train_target, epochs=20, verbose=0, 
                    validation_data=(val_scaled, val_target))
                    
#손실곡선 그리기
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-04', dpi=300)
plt.show()

 

- 초기에 검증손실이 감소하지만 곧바로 다시 상승하는것을 볼수 있습니다. 하지만 훈련손실은 계속 감소하기 때문에 과대적합 모델이 만들어집니다.

 

<과대 적합을 막는 방법>

 

1) 옵티마이저 조정

 

- 옵티마이저를 조정하는 것으로 과대적합을 줄일 수도 있습니다. 보통 Adam을 사용할 경우 적응적 학습률을 사용하므로 학습률의 크기를 조정할 수 있습니다.

 

[Adam 적용실습코드]

#모델 생성
model = model_fn()
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')

history = model.fit(train_scaled, train_target, epochs=20, verbose=0, 
                    validation_data=(val_scaled, val_target))
                    
#손실곡선 그리기
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-05', dpi=300)
plt.show()

- 이전보다 더 뒤의 에포크에서 감소추세가 이어지는 것을 볼 수 있습니다.

 

 

2) 다양한 규제 방법 이용 : 드롭아웃, 콜백 등

 

- 다양한 규제 방법에 대한 설명은 아래에서 계속 설명하도록 하겠습니다.

 

 

 

2. 드롭아웃

 

- 훈련과정에서 층에 있는 일부 뉴런을 랜덤하게 꺼서 과대적합을 막는 방법

 

 

- 일부 뉴런이 랜덤하게 꺼지면 특정뉴런에 과대하게 의존하는 것을 주릴 수 있고 모든 입력에 주의를 기울여야 합니다. 일부 뉴런의 출력이 없을 수 있다는 것을 감안하면 이 신경망은 더 안정적인 예측을 만들 수 있을 것입니다.

- 또한 드롭아웃을 적용된 신경망을 보면 마치 앙상블을 하는 것과 동일해 보이는데, 그러므로 앙상블처럼 과대적합을 막는 효과도 기대해 볼수 있습니다.

 

 

[드롭아웃 적용실습코드]

#드롭아웃 층 추가
model = model_fn(keras.layers.Dropout(0.3))

model.summary()

#손실곡선 그리기
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')

history = model.fit(train_scaled, train_target, epochs=20, verbose=0, 
                    validation_data=(val_scaled, val_target))
                    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-06', dpi=300)
plt.show()

- 아까보다 확실히 과대적합이 줄어든 것을 확인할 수 있습니다.

 

 

 

3. 콜백

 

- 케라스 모델을 훈련하는 도중에 어떤 작업을 수행할 수 있도록 도와주는 도구

- 대표적으로 최상의 모델을 자동으로 저장해주거난 검증점수가 더 이상 향상되지 않으면 일찍 종료할 수 있습니다.

 

 

<조기종료>

 

- 검증 점수가 더 이상 감소하지 않고 상승하여 과대적합이 일어나면 훈련을 계속 진행하지 않고 멈추는 기법

- 조기종료를 사용하면 계산비용과 시간을 절약할 수 있습니다.

 

[콜백 & 조기종료 실습코드]

#모델 생성
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')

# 최고모델 저장
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5')

# 조기종료 중단점 위치 저장
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

# 손실곡선 그리기
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()

+) 모델 저장과 복원

#모델 생성
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')

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

#모델 파라미터 저장하기
model.save_weights('model-weights.h5')

#모델 저장하기
model.save('model-whole.h5')

#새로운 모델 생성
model = model_fn(keras.layers.Dropout(0.3))

#모델 파라미터 불러오기
model.load_weights('model-weights.h5')

#모델 불러오기
model = keras.models.load_model('model-whole.h5')

# 텐서플로 2.3에서는 버그(https://github.com/tensorflow/tensorflow/issues/42890) 때문에 compile() 메서드를 호출해야 합니다.
# model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')

 


전체 실습 코드 : http://bit.ly/hg-07-3

 

 

반응형