본문 바로가기
Study/머신러닝

[tensorflow] 텐서플로우 콜백함수(Callbacks)

by 투말치 2021. 1. 31.

목차

    반응형

    콜백함수란?

    모델을 학습시키는 도중에 어떤 작업을 할 수 있게 하는데 그 작업을 callback이라고 한다.

     

     

    텐서보드 열기

    - 우선 저장위치를 지정한다.

    logdir=os.path.join('logs',datetime.now().strftime('%Y%m%d-%H%M%S'))
    tensorboard=tf.keras.callbacks.TensorBoard(
        log_dir=logdir,
        write_graph=True,
        write_images=True, #weight 등 시각화 여부
        histogram_freq=1
    )

     

    LambdaCallback

    - TensorBoard에 customize한 이미지, 그래프를 넣을 수 있음

    www.tensorflow.org/tensorboard/image_summaries#setup

     

    TensorBoard에 이미지 데이터 표시  |  TensorFlow

    개요 TensorFlow Image Summary API를 사용하면 텐서와 임의의 이미지를 쉽게 기록하고 TensorBoard에서 볼 수 있습니다. 이는 입력 데이터를 샘플링 및 검사하거나 레이어 가중치 및 생성 된 텐서 를 시각

    www.tensorflow.org

     

    실시간으로 이미지가 어떻게 들어가는지 보게하는 작업

    - file_writer를 사용한다

    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+(step*epoch)) #몇번째 step인지 기록하기
            tf.summary.scalar('train_loss', train_accuracy.result(), step=step+(step*epoch))
        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))

     

    LearningRateScheduler

    - learning rate를 관리하는 함수를 정의한다.

    def scheduler(epoch):
        if epoch<10:
            return 0.001
        else:
            return 0.001*math.exp(0.1*(10-epoch))

     

    - verbose=1이면 로그를 보여줌

    learning_rate_scheduler=tf.keras.callbacks.LearningRateScheduler(scheduler, verbose=1) 
    
    
    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]
    )

     

    Checkpoint

    - 모델이 학습하다가 특정 조건을 만족하면 모델의 weight을 저장하는 것이다.

    - save_best_only : accuracy가 올라갔을 때만 저장하라는 뜻이다.
    - monitor 는 모니터하고 싶은 값으로 변경하면 된다
    - loss면 mode를 min으로 해야 한다. 지금은 accuracy라서 mode가 max인 상태다.

    checkpoint=tf.keras.callbacks.ModelCheckpoint(save_path, 
    monitor='val_accuracy', verbose=1, save_best_only=True, mode='max') 

    callbacks에 해당 checkpoint를 넣어주면 된다.

    model.fit_generator(
        train_dataset,
        steps_per_epoch=steps_per_epoch,
        validation_data=test_dataset,
        validation_steps=validation_steps,
        epochs=num_epochs,
        callbacks=[checkpoint]
    )

    다음과 같이 모델이 저장되었다고 나온다.

     

     

    모델 저장하는 방법

    model.save(save_path, include_optimizer=True)

     

    모델 불러오기

    model=tf.keras.models.load_model('my_model.h5')

     

    모델 저장 - 2 

    model.save_weights('model_weights.h5')

    모델 불러오기 - 2

    model.load_weights('model_weights.h5')

     

     

     

    반응형