tensorflow 2.0 - Callbacks
Callback이란?
모델을 훈련시키는 일은 대체적으로 오랜 시간이 걸린다. Tensorflow가 기본적인 Log를 출력해주기는 하지만 훈련이 끝날 때까지 기다리기만 하지 않고 모델을 훈련시키는 동안 어떤 이벤트들이 발생하면 개발자가 원하는 동작을 수행할 수 있는 방법을 Tensorflow가 제공하고 있다. 이 때 개발자가 원하는 동작을 Callback이라고 부른다.
즉,
TensorFlow 2.0 → Hyperparameter Tunning → Build Model → Data Preprocess
먼저 필요한 모듈들을 호출하고 파라미터 값들을 지정해준 후에 model 빌드한다.
그 후 데이터 전처리 과정을 거친 후 training을 시키면서 다음의 callbacks 코드를 실행시켜 TensorBoard를 통해 확인해보자.
▶ 현재 날짜 및 시간을 구해주는 함수
datetime.now().strftime("%Y%m%d-%H%M%S")
▶ Callback
tensorboard = tf.keras.callbacks.TensorBoard(
log_dir=logdir,
write_graph=True,
write_images=True,
histogram_freq=1
)
%tensorboard --logdir logs --port 8008
▶ Training
steps_per_epoch = len(train_paths) // batch_size
validation_steps = len(test_paths) // batch_size
model.fit_generator(
train_dataset,
steps_per_epoch=steps_per_epoch,
validation_data=test_dataset,
validation_steps=validation_steps,
epochs=num_epochs,
callbacks=[tensorboard]
)
▶ Tensorboard
Expert
loss_object = tf.keras.losses.SparseCategoricalCrossentropy()
optimizer = tf.keras.optimizers.Adam()
train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')
test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')
@tf.function
def train_step(images, labels):
with tf.GradientTape() as tape:
predictions = model(images)
loss = loss_object(labels, predictions) # Loss 계산
gradients = tape.gradient(loss, model.trainable_variables) # 모델의 trainable_variable을 하여금 loss를 통해 기울기를 얻음
optimizer.apply_gradients(zip(gradients, model.trainable_variables)) # 구한 최적화된 값을 variable에 적용
train_loss(loss)
train_accuracy(labels, predictions)
@tf.function
def test_step(images, labels):
predictions = model(images)
t_loss = loss_object(labels, predictions)
test_loss(t_loss)
test_accuracy(labels, predictions)
logdir = os.path.join('logs', datetime.now().strftime("%Y%m%d-%H%M%S"))
file_writer = tf.summary.create_file_writer(logdir)
for epoch in range(num_epochs):
for step, (images, labels) in enumerate(train_dataset):
train_step(images, labels)
with file_writer.as_default():
tf.summary.image('input_image', images, step=step)
tf.summary.scalar('loss', train_loss.result(), step=step)
for test_images, test_labels in test_dataset:
test_step(test_images, test_labels)
template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
print (template.format(epoch+1,
train_loss.result(),
train_accuracy.result()*100,
test_loss.result(),
test_accuracy.result()*100))
Callbacks_learning_rate_schedule
딥러닝 모델을 학습할 때 더 낮은 loss로 수렴하기 위해서 학습률을 감소시키는 방법이 자주 사용된다. Keras에서 제공하는 loss주 일부는 입력값으로 학습률 감소율을 정해줄 수 있지만 그것만으로는 부족하다. 학습률 감소를 지수적으로 하는 경우(exponential decay), 계단 모양을 뚝뚝 떨어뜨리는 경우도 있다.(step decay). 이렇듯 자기가 원하는 대로 학습률을 조정하기 위해 제공되는 callback함수가 있는데 그게 바로 LearningRateScheduler이다. learning_rate는 너무 빨라도 너무 느려도 안좋다.
TensorFlow 2.0 → Hyperparameter Tunning → Build Model → Data Preprocess → Learning Rate Scheduler → Training
Learning Rate Scheduler
import math
for epoch in range(10,20):
print(0.001 * math.exp(0.1 * ( 10 - epoch)))
# 점점 폭이 작아짐
def scheduler(epoch):
if epoch < 10:
return 0.001
else:
return 0.001 * math.exp(0.1 * (10 - epoch))
learning_rate_scheduler = tf.keras.callbacks.LearningRateScheduler(scheduler)
Training
steps_per_epoch = len(train_paths) // batch_size
validation_steps = len(test_paths) // batch_size
model.fit_generator(
train_dataset,
steps_per_epoch=steps_per_epoch,
validation_data=test_dataset,
validation_steps=validation_steps,
epochs=num_epochs,
callbacks=[learning_rate_scheduler]
)
Callbacks_model_checkpoint
Model Checkpoint Callback 클래스를 사용하면 모델 가중치를 확인할 위치, 파일 이름 지정 방법 및 모델의 체크포인트를 만들 상황을 정의할 수 있다. API를 사용하면 교육 또는 검증 데이터 세트의 손실이나 정확성 등 모니터링할 Metric(척도)을 지정할 수 있다.
TensorFlow 2.0 → Hyperparameter Tunning → Build Model → Data Preprocess → Checkpoint → Training
▶ Checkpoint
save_path = 'checkpoints'
checkpoint = tf.keras.callbacks.ModelCheckpoint(save_path, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')
▶ ModelCheckpoint의 속성
filepath : 문자열, 모델 파일을 저장할 경로
monitor : 관찰할 수량
verbose : 해당 함수의 진행 사항의 출력 여부(1이면 출력)
save_best_only : 모델의 정확도가 최고값을 갱신했을 때만 저장하도록 하는 옵션이다.
mode : { auto, min, max } 중 하나, save_best_only가 true이면 현재 저장 파일을 덧씌울지는 관찰하는 수량의 최대화 혹은 최소화를 기준으로 결정한다. val_accuracy의 경우 이는 max가 되어야 하며, val_loss라면 min이 되어야 한다. auto의 경우 관찰하는 수량의 이름에서 방향성이 자동적으로 유추된다.
▶ Training
steps_per_epoch = len(train_paths) // batch_size
validation_steps = len(test_paths) // batch_size
model.fit_generator(
train_dataset,
steps_per_epoch=steps_per_epoch,
validation_data=test_dataset,
validation_steps=validation_steps,
epochs=num_epochs,
callbacks=[checkpoint]
)