딥러닝

[딥러닝] Validation 설정: validation_split, validation_data

eyoo 2022. 6. 13. 12:26

딥러닝에서 validation은 학습하는 중에 에포크가 한번 끝날때마다 검증하는 것이다.

 

또한 벨리데이션은 train_test_split으로 train데이터와 test데이터를 나누었던 것처럼

 

train 데이터를 학습할 데이터와 벨리데이션 데이터로 나누어 사용한다.

# 학습이 끝난 후 검증하는 evaluate와 개념을 혼동할수있으므로 주의한다.

 

벨리데이션 설정은 fit으로 학습할 때 설정해야 한다.

 

파라미터인 validation_split으로 벨리데이션에 사용할 데이터를 0.2로 설정한다.
 
in:
epoch_history = model.fit(X_train,y_train, epochs= 1000, validation_split=0.2)
out:
Epoch 1/1000
8/8 [==============================] - 1s 31ms/step - loss: 582.1860 - mse: 582.1860 - mae: 22.8983 - val_loss: 591.5149 - val_mse: 591.5149 - val_mae: 22.8674

# 벨리데이션을 설정하니 검증한 데이터의 오차와 mse, mae인 val_loss, val_mse, val_mae가 나타난다.

 

 

에포크 히스토리를 차트로 시각화 해보자.

 

in:

import matplotlib.pyplot as plt
def plot_history(history) :
  hist = pd.DataFrame(history.history)
  hist['epoch'] = history.epoch

  plt.figure(figsize = (8, 12))

  plt.subplot(2, 1, 1)
  plt.xlabel('Eopoch')
  plt.ylabel('Mean Abs Error [MPG]')
  plt.plot(hist['epoch'], hist['mae'], label = 'Train Error')
  plt.plot(hist['epoch'], hist['val_mae'], label = 'Val Error')
  plt.ylim([0,5])
  plt.legend()

  plt.subplot(2, 1, 2)
  plt.xlabel('Eopoch')
  plt.ylabel('Mean Squared Error [MPG]')
  plt.plot(hist['epoch'], hist['mse'], label = 'Train Error')
  plt.plot(hist['epoch'], hist['val_mse'], label = 'Val Error')
  plt.ylim([0,20])
  plt.legend()

  plt.show()
  
plot_history(epoch_history)

out:

# validation error가 train error보다 더 높아지면 좋은 학습방향이 아니다.

 

 

학습 데이터의 일부를 사용하는 validation_split과 달리 validation_data는 따로 데이터를 지정할수있다.

 

epoch_history = model.fit(X_train, y_train, epochs = 10, validation_data = (X_test, y_test))

# validation용 데이터로 검증용 데이터를 사용하고 따로 튜플에 지정하여 학습시킨다.