minhui study
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]
)
'딥러닝,인공지능' 카테고리의 다른 글
Pytorch - Tensorboard, Learning Rate Schedule, save and load model (0) | 2021.01.28 |
---|---|
tensorflow 2.0 - post process & save and load model (0) | 2021.01.27 |
tensorflow 2.0 - tf.data (load image & make batch, fit with tf.data) (1) | 2021.01.24 |
tensorflow2.0 - flow_from_dataframe(dataframe 만들기) (0) | 2021.01.24 |
[이미지 분석으로배우는 tensorflow2.0 와 Pytorch] - tensorflow2.0 fit_generator (0) | 2021.01.24 |