Deep Learning::Callbacks para Salvar Resultados Intermediários e Visualizar na Web com TensorBoard

Nesta página você vai aprender a usar callbacks em Keras: funções que são chamadas por Model.fit() ao fim de cada época e podem fazer muitas coisas diferentes. Nós vamos ver dois exemplos: Salvar Resultados Intermediários e Visualizar o Andamento do Treinamento na Web com TensorBoard

tensorBoard-grafico

Exemplo: Callbacks podem alimentar os dados de um servidor de TensorBoard, permitindo visualizar o treinamento da rede enquanto ocorre

Callbacks em Keras

Um método de callback é um pedaço de código executável que é passado como parâmetro para algum método, geralmente através de um ponteiro para função. É esperado que o método (caller) execute o código do argumento em algum momento. A documentação de Keras para callbacks está aqui: https://keras.io/callbacks/.

Keras tem um framework para callbacks de dentro de um Modelo. Estes callbacks são executados ao final de cada época. Para trabalhar com callbacks em Keras, você necessita de algumas coisas em seu código:


# Importe a infra de callbacks do Keras
from keras.callbacks import ModelCheckpoint
 
# Se você deseja visualizar o progresso da sua rede no Browser,
# importe também a infra de suporte ao TensorBoard da Google
from keras.callbacks import TensorBoard

Salvar Resultados Intermediários

Agora é a hora de você criar uma função de callaback e associá-la a um vetor de callbacks:

# Crie um checkpoint na forma de um string parametrizável de nome de arquivo para uma rede.
# Os parâmetros entre {}s serão substituídos por valores da rede no momento de salvamento:
filepath = '~/minhaPastaDeRedes/nomeDaMinhaRede-model-improvement-{epoch:02d}-{val_acc:.2f}.hdf5'
 
# Crie um ponteiro para uma instância de uma função de callback com dados personalizados.
# Neste caso: Uma instância de ModelCheckpoint para salvar a rede ou os seus pesos:
# Faça salvar a rede inteira fazendo save_weights_only=False
# Faça salvar apenas se houver um ganho absoluto global com save_best_only=True
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1,
                             save_best_only=True, mode='max', save_weights_only=False)
 
# Crie uma lista com os ponteiros para as funções de callback.
# Neste caso será uma lsita unitária:
callbacks_list = [checkpoint]
 
# Inclua callbacks=callbacks_list, nos parâmetros de Model.fit() para que o callback funcione:
history = model.fit_generator(
   train_generator,
   steps_per_epoch=train_generator.samples/train_generator.batch_size ,
   epochs=args.epochs,
   validation_data=validation_generator,
   validation_steps=validation_generator.samples/validation_generator.batch_size,
   callbacks=callbacks_list,
   verbose=1)

A sua pasta de redes salvas vai ficar com a seguinte cara:

hdf5

Visualizar o Andamento do Treinamento na Web com TensorBoard

 Crie uma função de callback para alimentar um servidor de TensorBoard com o progresso da sua rede. Defina alguma pasta de log que seja global para todas as suas redes, assim você pode usar um enedereço de TensorBoard para monitorar todas as suas redes. No exemplo abaixo estamos direcionando as saídas de log (log_dir) para /home/seuUsuário/logs:

# Crie um ponteiro para uma instância de uma função de callback com dados personalizados.
# Neste caso: Uma instância de TensorBoard para escrever o sattus do treinamento no formato do TensorBoard.
# Indique o diretório de leitura e sintaxe do servidor de TensorBoard com log_dir="~/logs/{}".format(time())
tensorboard = TensorBoard(log_dir="~/logs/{}".format(time()))

# Se você estiver usando TensorBoard junto com o ModelCheckpoint do exemplo acima, a sua 
# lista de ponteiros para funções de callback terá dois elementos e será assim:
callbacks_list = [checkpoint, tensorboard]

Antes de iniciar a rede não esqueça de:

  • instalar o servidor de TensorBoard
  • iniciar o servidor, fazendo o monitorar o seu diretório de logs ~/logs/
# Instale TensorBoard:
pip3 -install TensorBoard
# Inicie o servidor de um terminal, indicando o diretório de leitura --logdir=~/logs/
# Observe que nesta chamada estamos:
# - redirecionando tanto stdio quanto stderr para ~/tensorboard.log,
#   o tensorboard fica soltando um monte de mensagens, é interessante guardar.
# - rodando como processo em background (não faz sentido ocupar um terminal)
tensorboard --logdir=~/logs/ >> ~/tensorboard.log 2>&1 &

Sua pasta de logs vai ficar com a seguinte cara:

awangenh@neuronio:~/logs$ ll
total 20
drwxrwxrwx 5 awangenh awangenh 4096 Out 1 11:07 ./
drwxrwxrwx 34 awangenh awangenh 4096 Out 1 08:32 ../
drwxr-xr-x 2 awangenh awangenh 4096 Out 1 08:35 1538352289.3467116/
drwxr-xr-x 2 awangenh awangenh 4096 Out 1 08:35 1538352492.3695638/
drwxr-xr-x 2 awangenh awangenh 4096 Out 1 10:37 1538401060.756871/

TensorBoard serve também para mostrar a arquitetura de sua rede e é ótimo para gerar imagens para documentar o seu trabalho:

tensorBoard-rede

Sobre o Autor

possui graduação em Ciências da Computação pela Universidade Federal de Santa Catarina (1989) e Doutorado Acadêmico (Dr. rer.nat.) em Ciências da Computação pela Universidade de Kaiserslautern (1996). Atualmente é professor Titular da Universidade Federal de Santa Catarina, onde é professor do Programa de Pós-graduação em Ciência da Computação e dos cursos de graduação em Ciências da Computação e Sistemas de Informação. Tem experiência nas áreas de Informática em Saúde, Processamento e Análise de Imagens e Engenharia Biomédica, com ênfase em Telemedicina, Telerradiologia, Sistemas de Auxílio ao Diagnóstico por Imagem e Processamento de Imagens Médicas, com foco nos seguintes temas: analise inteligente de imagens, DICOM, CBIR, informática médica, visão computacional e PACS. Coordena o Instituto Nacional de Ciência e Tecnologia para Convergência Digital - INCoD. Foi o criador e primeiro Coordenador do Núcleo de Telessaúde de Santa Catarina no âmbito do Programa Telessaúde Brasil do Ministério da Saúde e da OPAS - Organização Pan-Americana de Saúde e criador do Núcleo Santa Catarina da RUTE - Rede Universitária de Telemedicina.