13. 신경망 모델 훈련

yellowsubmarine372·2024년 8월 2일
0

머신러닝

목록 보기
13/18

colab link
Training Neural Network.ipynb

사이킷런에서 제공하는 머신러닝 알고리즘들은 좋은 성능을 내기 위해 매개변수를 조정하고 훈련하는 과정을 반복한다. 반면에 딥러닝에서는 모델의 구조를 직접 만든다는 느낌이 훨씬 강하다 (층을 추가하고 층에 있는 뉴런의 개수와 활성화 함수를 결정하는 일들이 그렇다)

1. 손실 곡선

  • Histroy
    History 객체에는 훈련과정에서 계산한 지표(손실, 정확도) 값이 저장되어 있다.
history = model.fit(train_scaled, train_target, epochs=5, verbose=0)

신경망 모델 만들기

def model_fn(a_layer=None):
  model = keras.Sequential()
  model.add(keras.layers.Flatten(input_shape=(28, 28)))
  model.add(keras.layers.Dense(100, activation='relu'))
  if a_layer:
    model.add(a_layer)
  model.add(keras.layers.Dense(10, activation='softmax'))
  return model

신경망 모델을 만드는 것이 프로그래밍 하는 것 같음

  • 손실과 정확도 그래프 그리기

2. 검증 손실
에포크에 따른 과대적합과 과소적합을 파악하려면 훈련세트에 대한 점수뿐만 아니라 검증세트에 대한 점수도 필요하다. 손실(loss)을 이용해 과대/과소적합을 다룰 것이다.

fit(..., validation_data=(val_scaled, val_target)

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))

과대 적합된 결과가 나타남(검증 loss 증가 but 훈련 loss 감소)
옵티마이저 하이퍼파라미터를 조정해 과대적합을 완화 시킬 것 → RMSporp 대신 Adam 으로 변경


3. 드롭아웃
신경망에 특화된 규제방법, 드롭아웃을 사용할 것.

드롭아웃 dropout
훈련과정에서 층에 있는 일부 뉴런을 랜덤하게 꺼서(뉴런의 출력을 0으로 만들어) 과대 적합을 막는다.

(1) 특정 뉴런에 과대하게 의존하는 것을 줄이고
(2) 모든 입력에 대해 주의를 기울이게 됨.

훈련할 때만 적용하고 평가(evaluate)할 때는 모든 뉴런은 ON이어야 한다 (케라스는 자동으로 드롭아웃 적용하지 않음 )

model = model_fn(keras.layers.Dropout(0.3))
model.summary()
[Output]
Model: "sequential_4"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ flatten_4 (Flatten)                  │ (None, 784)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_8 (Dense)                      │ (None, 100)                 │          78,500 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout (Dropout)                    │ (None, 100)                 │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_9 (Dense)                      │ (None, 10)                  │           1,010 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 79,510 (310.59 KB)
 Trainable params: 79,510 (310.59 KB)
 Non-trainable params: 0 (0.00 B)

flatten 층과 유사하게 층으로는 취급되지만 전체 출력 배열의 크기를 바꾸지는 않는다.


4. 모델 저장과 복원

  • save_weights()
    가중치만 저장한다
model.save_weights('model.weights.h5')

load_weights() 와 짝궁


  • save()
    모델 구조와 모델 파라미터를 함께 저장한다.
model.save('model-whole.h5')

load_model() 와 짝궁


5. 콜백
훈련 과정 중간에 어떤 작업을 수행할 수 있게 하는 객체, ModelCheckPoint 콜백 은 기본적으로 에포크마다 모델을 저장한다. save_best_only=True 매개변수를 지정하여 가장 낮은 검증 점수를 만드는 모델을 저장할 수 있다.

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.keras', save_best_only=True)
model.fit(train_scaled, train_target, epochs=20, verbose=0, validation_data=(val_scaled, val_target),
          callbacks=[checkpoint_cb])
  • 조기 종료

조기 종료는 에포크 횟수를 제한하는 역할이지만 신경망 규제 방법 중 하나로 생각할 수도 있다. 케라스는 조기종료를 위한 EarlyStopping 콜백 을 제공한다.

(1) patience 매개변수
검증 점수가 향상되지 않더라도 참을 에포크 횟수를 지정한다(에포크 횟수 상한선)

(2) restor_best_weights 매개변수 = True
가장 낮은 검증 손실을 낸 모델 파라미터로 되돌린다.

# 조기 종료
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss = 'sparse_categorical_crossentropy', metrics=['accuracy'])
checkpoint_cv = keras.callbacks.ModelCheckpoint('best-model.h5.keras', 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])

ModelCheckPoint 콜백과 EarlyStopping 콜백을 함께 사용하면 가장 낮은 검증 손실의 모델을 저장하고 검증 손실이 다시 상승할때 훈련을 중지할 수 있으며 중지한 다음 현재 모델의 파라미터를 최상의 파라미터로 되돌릴 수 있다.


early_stopping_cb.stopped_epoch = 9이므로 10번째에서 에포크 훈련이 중지됐다. (0부터 시작하므로) 따라서, 8에서 최상의 검증점수를 냈다가 9에서부터 감소하고 10에서 훈련 중지 된 것이다.

profile
for well-being we need nectar and ambrosia

0개의 댓글