minhui study

tensorflow 2.0 - Callbacks 본문

딥러닝,인공지능

tensorflow 2.0 - Callbacks

minhui 2021. 1. 27. 18:36

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

 

Comments