본 포스팅은 다음 과정을 정리 한 글입니다.
Custom Models, Layers, and Loss Functions with TensorFlow
www.coursera.org/specializations/tensorflow-advanced-techniques
지난 시간 리뷰
Built-in Callbacks, TensorBoard visualization toolkit
Callbacks은 학습 프로세스를 제어할 수 있는 Tensorflow의 유용한 기능입니다.
Callback에는 두 가지 주요 특징이 있습니다.
미리 정의된 내장 콜백이 있는데 이 것은 checkpoint들을 저장하거나 조기 중지하거나 하는 것들을 사용할 수 있습니다. 또한 callback class를 override 하여 custom callbacks를 만들 수도 있습니다.
우선 기본 제공 callbacks을 살펴본 다음 나중에 custom callbacks을 수행하는 방법에 대해 살펴보겠습니다.
요약하면, callbacks은 어떤 유형의 기능을 제공하도록 설계되었으며, 모든 epoch을 훈련하는 동안 작업을 수행하기 위해 실행되는 코드를 효과적으로 가질 수 있습니다.
tf.keras.callbacks.Callback 클래스가 있는데 이 Callback class를 subclassing 하여 기존에 배웠던 패턴들을 적용해 볼 수 도 있습니다.
이 것을 통해 학습 중에 모델 상태를 이해하는데 유용하게 사용할 수 있고 모델을 최적화하는 시간을 절약할 수 있습니다.
다음은 파이썬의 모든 클래스와 마찬가지로 Callback클래스의 구조입니다.
기존 클래스를 확장하도록 정의하고 init함수에서 로컬 변수를 초기화했습니다.
Callback의 경우 재정의 할 수 있는 on_epoch_begin함수가 있으며, 이름에서 알 수 있듯이 모든 epoch 시작 시 호출됩니다.
또한 비슷하게 각 epoch가 끝날 때 호출되는 on_epoch_end 함수가 있습니다.
이미 보거나 사용한 적이 있을 수 있는데, 모델을 사용하여 예측을 학습, 테스트 또는 실행할 때 사용할 수 있는 것들을 포함하여 많은 함수들이 있습니다.
예를 들어 예측을 실행할 때 on_predict_begin 함수 또는 on_predict_end 함수를 각각 호출하여 시작 또는 끝에서 발생하는 callback을 가질 수 있습니다.
학습 및 테스트에서도 비슷한 작업을 수행할 수 있습니다.
또한 batch단위로 실행할 때 on_predict_batch_begin또는 on_predict_batch_end를 사용하여 예측하는 동안 batch별로 이 코드를 실행 할 수 있으며 물론 학습 및 테스트에 대해서도 유사하게 수행할 수 있습니다.
그럼 이 callback을 어디에 등록할 수 있을까요? 학습, 예측 평가를 포함하는 모델 메서드는 callbacks 매개 변수를 사용하여 간단히 지정할 수 있습니다.
이제 내장 callback 중 일부를 살펴보겠습니다. Tensorflow 용 시각화 도구 모음을 제공하는 TensorBoard부터 살펴봅시다.
학습을 시각화하고 loss 및 accuracy와 같은 metrics를 추적할 수 있고, model의 graph를 볼 수 있습니다.
더 자세한 정보는 tensorflow.org/tensorboard에서 확인하실 수 있습니다.
TensorBoard callback을 사용하는 것은 매우 간단합니다.
간단히 정의한 다음 훈련을 시작하면 TensorBoard callback instance를 만들고 원하는 로그 디렉터리를 지정하여 정의합니다.
그런 다음 Tensorflow는 세부 저장 정보를 해당 디렉터리에 저장 한 다음,
tensorboard가 logs 디렉터리를 가리키면 accuarcy, loss와 같은 것들을 plotting 하는 작업을 수행합니다.
여기에서 볼 수 있듯이 확장으로 load 하여 colab에서 사용할 수도 있습니다.
다음으로 ModelCheckpoint를 살펴봅시다.
ModelCheckpoint는 모델 세부 정보를 저장할 수 있고, 이후 검사를 위해 epoch별로 저장하거나 진행 상황을 모니터링할 수 있습니다.
ModelCheckpoint class는 미세 조정에 사용할 수 있는 많은 매개 변수와 함께 모델 세부 사항을 저장합니다.
그래서 몇 가지 예를 살펴보겠습니다.
여기에 model fit 메서드에서 사용하는 예가 있습니다.
callbacks 매개 변수를 사용하여 "model.h5"이라는 모델링 된 모델 파일을 사용하겠다고 ModelCheckpoint에 지정해줬습니다.
그런 다음 train과정에서 모델이 epoch단위로 저장되고 있음을 아래에서 확인할 수 있습니다.
전체 모델 구조가 아니라 가중치만 원하는 경우 아래 매개 변수를 true로 지정하면 됩니다.
save_weights_only=true
또는 최적의 값에 도달했을 때만 저장하려면 최적의 값만 저장하도록 지정하여 저장할 수 있습니다.
save_best_only=True
그러면 모니터 매개 변수에 지정한 값이 최적화될 때마다 저장됩니다.
아래 첫 번째 epoch 결과를 봅시다.
val_loss가 무한대(inf)에서 시작하여 0.65278에서 끝났으므로 해당 값을 저장하고
두 번째 epoc에서는 0.65278에서 0.62279로 개선되어 저장되었습니다.
어떤 시점에서 val_loss가 증가하기 시작하면 모델 체크 포인트는 물론 저장되지 않습니다.
이 예제에서는 기본 keras의 .h5 포맷을 사용하였지만 표준 tensorflow format도 저장 모델로 사용할 수 있습니다.
saved.model이라고 저장 시 pb파일이 저장되는 것을 볼 수 있습니다.
또한 model.h5라고 저장 시 model.h5파일이 생성됨을 확인할 수 있습니다.
그리고 파일의 이름이 텍스트를 사용하여 지정되기 때문에, 이름 안에 값을 사용할 할 수 있으므로 두 쌍의 epoch에 별개의 weight가 저장된 h5 파일을 저장할 수 있습니다.
epoch 값 또는 validation loss 값은 다른 metric을 사용하여 파일 이름에 쓸 수도 있습니다. {epoch:02d}, {val_loss:.2f} 같은 형식으로 저장하면 epoch은 두 자리 정수, val_loss는 소수점 둘째 자리가 사용되어 weights.01-0.63.h5, weights.02-0.60.h5 같은 이름을 만들 수 있습니다.
다음으로 살펴볼 내장 callback은 조기 중지를 할 수 있는 EarlyStopping입니다. 이는 원하는 지표에 도달했을 때 훈련을 중지하는 데 유용합니다.
예를 들어 10번의 epoch만 돌면 충분한데 100 epoch을 학습하는 경우가 있을 수 있습니다.
또한 다르게 사용할 수도 있습니다. 눈에 띄는 개선이 없어지면 조기 중단으로 훈련을 종료하여 많은 시간을 절약할 수도 있습니다.
예를 들어, 과적 합을 방지하는 데 사용할 수 있는 시나리오를 살펴보겠습니다. 여기서는 val_loss가 계속 감소하는지를 확인하려고 합니다.
그래서 우리는 monitor의 속성을 'val_loss'로 설정 한 다음 patience를 3으로 설정합니다.
여기서는 최상의 값에 도달하면 이를 기록하고 epoch을 3번 돌 때까지 val_loss가 줄어들지 않아도 참고 기다린다는 의미입니다.
patience, 곧 참는다는 의미입니다.
여기에서 epoch 15가 가장 val_loss가 작다는 것을 알 수 있는데요. 그 후 epoch 18까지 3 epoch동안 기다렸지만 epoch 15의 val_loss 보다 더 높은 val_loss 값이 나왔기 때문에 training이 중지됩니다.
설정할 수 있는 최상의 epoch의 가중치 값(val_loss가 가장 낮은 epoch)을 유지하려면 restore_best_weights=True로 설정해 줍니다. 그러면 epoch 18에서 멈췄더라도 weight가 epoch 15로 복원이 됩니다.
여기서 mode를 세팅하는 것이 굉장히 중요합니다.
val_loss는 최소화하는 것이 중요하므로 mode='min'으로 설정을 해주셔야 합니다.
반대로 val_accuracy 같은 경우 높을수록 좋은 것이므로 mode='max'로 설정을 해야 합니다. 이 부분에 대해서 신경을 잘 써주셔야 학습이 제대로 될 수 있습니다.
또 다른 매우 유용한 callback은 이름에서 알 수 있듯이 훈련 결과를 CSV 파일에 기록하는 CSVlogger입니다.
예를 들어 이와 같이 사용하면 epoch, accuracy, loss, val_accuracy, val_loss 등등이 파일에 저장됩니다.
이것으로 다양한 내장 callback에 대해 간략하게 살펴보았습니다.
다음 시간에는 사용자 정의 callback을 생성하는 방법을 살펴본 후 코드를 직접 짜 보겠습니다.
감사합니다.
댓글