Como uso o retorno de chamada do Tensorboard do Keras?


143

Eu construí uma rede neural com Keras. Eu visualizaria seus dados pelo Tensorboard, portanto, utilizei:

keras.callbacks.TensorBoard(log_dir='/Graph', histogram_freq=0,
                            write_graph=True, write_images=True)

como explicado em keras.io . Quando executo o retorno de chamada, recebo <keras.callbacks.TensorBoard at 0x7f9abb3898>, mas não recebo nenhum arquivo na minha pasta "Gráfico". Há algo de errado em como eu usei esse retorno de chamada?


3
Eu sugeriria definir histogram_freqcomo 1. "histogram_freq: frequência (em épocas) na qual calcular histogramas de ativação para as camadas do modelo. Se definido como 0, os histogramas não serão computados."
Matt Kleinsmith

10
Cuidado: "/ Graph" cria um diretório no diretório raiz, enquanto "./Graph" cria um diretório no diretório de trabalho.
Matt Kleinsmith

@MattKleinsmith Se definido como 0, apenas os histogramas de ativação e peso para as camadas do modelo não serão computados pelos dados de Validação, as métricas ainda serão registradas.
precisa saber é o seguinte

Eu acho que é melhor dar nome exclusivo para logdir olhada stackoverflow.com/a/54949146/1179925
mrgloom

Respostas:


219
keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0,  
          write_graph=True, write_images=True)

Essa linha cria um objeto Tensorboard de retorno de chamada. Você deve capturar esse objeto e atribuí-lo à fitfunção do seu modelo.

tbCallBack = keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)
...
model.fit(...inputs and parameters..., callbacks=[tbCallBack])

Dessa forma, você deu seu objeto de retorno de chamada para a função. Ele será executado durante o treinamento e produzirá arquivos que podem ser usados ​​com o tensorboard.

Se você deseja visualizar os arquivos criados durante o treinamento, execute no seu terminal

tensorboard --logdir path_to_current_dir/Graph 

Espero que isto ajude !


Eu usei isso com o seguinte erro quando write_images = False
abdul qayyum

InvalidArgumentError (veja acima para rastreamento): o tensor deve ser 4-D com a última dim 1, 3 ou 4, não [1,3,3,256,256,1] [[Nó: conv_3.2_2 / kernel_0_1 = ImageSummary [T = DT_FLOAT, bad_color = Tensor <tipo: uint8 formato: [4] valores: 255 0 0 ...>, max_images = 3, _device = "/ trabalho: localhost / réplica: 0 / tarefa: 0 / cpu: 0"] (conv_3. 2_2 / kernel_0_1 / tag, ExpandDims_50)]]
abdul qayyum

E alguma coisa dizendo espaço reservado está faltando dtype = float quando True Any Idea?
abdul qayyum

2
A guia Escalares ainda está vazia, embora eu possa ver minha arquitetura de modelo na guia Gráficos?
21417 iratzhash

1
isso produz apenas escalares para perda e precisão do treinamento. como você faz o mesmo para os dados de validação que são passados ​​para a função de ajuste?
Utku Ufuk 27/03

46

É assim que você usa o retorno de chamada TensorBoard :

from keras.callbacks import TensorBoard

tensorboard = TensorBoard(log_dir='./logs', histogram_freq=0,
                          write_graph=True, write_images=False)
# define model
model.fit(X_train, Y_train,
          batch_size=batch_size,
          epochs=nb_epoch,
          validation_data=(X_test, Y_test),
          shuffle=True,
          callbacks=[tensorboard])

2
Existe uma maneira de estruturar melhor a saída do tensorboard? Keras faz alguma otimização nesse sentido?
Nickpick

2
@ickpick Eu não sei o que você quer dizer. Mas acho que isso pode ser um candidato para outra pergunta.
Martin Thoma


importante notar é que histogram_freq=0é definido se o tensorboard não registrar nenhum histograma por tf.summary.histogram- caso contrário histogram_freq, NÃO será igual a 0!
Agile Bean

20

mudança

keras.callbacks.TensorBoard(log_dir='/Graph', histogram_freq=0,  
          write_graph=True, write_images=True)

para

tbCallBack = keras.callbacks.TensorBoard(log_dir='Graph', histogram_freq=0,  
          write_graph=True, write_images=True)

e defina seu modelo

tbCallback.set_model(model)

Corra no seu terminal

tensorboard  --logdir Graph/

Eu tenho AttributeError: 'TensorBoard' object has no attribute 'set_model'.
Fábio Perez

15

Se você estiver trabalhando com a biblioteca Keras e quiser usar o tensorboard para imprimir seus gráficos de precisão e outras variáveis, a seguir estão as etapas a seguir.

Etapa 1: inicialize a biblioteca de retorno de chamada keras para importar o tensorboard usando o comando abaixo

from keras.callbacks import TensorBoard

Etapa 2: inclua o comando abaixo em seu programa imediatamente antes do comando "model.fit ()".

tensor_board = TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)

Nota: Use "./graph". Ele irá gerar a pasta do gráfico no seu diretório de trabalho atual, evite usar "/ graph".

Etapa 3: inclua o retorno de chamada da Tensorboard em "model.fit ()". A amostra é fornecida abaixo.

model.fit(X_train,y_train, batch_size=batch_size, epochs=nb_epoch, verbose=1, validation_split=0.2,callbacks=[tensor_board])

Etapa 4: Execute o seu código e verifique se a sua pasta gráfica está no seu diretório de trabalho. se os códigos acima funcionarem corretamente, você terá a pasta "Graph" em seu diretório de trabalho.

Etapa 5: Abra o Terminal no seu diretório de trabalho e digite o comando abaixo.

tensorboard --logdir ./Graph

Etapa 6: Agora abra o seu navegador e digite o endereço abaixo.

http://localhost:6006

Depois de entrar, a página Tensorbaord será aberta, onde você poderá ver seus gráficos de diferentes variáveis.


importante notar é que histogram_freq=0é definido se o tensorboard não registrar nenhum histograma por tf.summary.histogram- caso contrário histogram_freq, NÃO será igual a 0!
Agile Bean

9

Aqui está um código:

K.set_learning_phase(1)
K.set_image_data_format('channels_last')

tb_callback = keras.callbacks.TensorBoard(
    log_dir=log_path,
    histogram_freq=2,
    write_graph=True
)
tb_callback.set_model(model)
callbacks = []
callbacks.append(tb_callback)

# Train net:
history = model.fit(
    [x_train],
    [y_train, y_train_c],
    batch_size=int(hype_space['batch_size']),
    epochs=EPOCHS,
    shuffle=True,
    verbose=1,
    callbacks=callbacks,
    validation_data=([x_test], [y_test, y_test_coarse])
).history

# Test net:
K.set_learning_phase(0)
score = model.evaluate([x_test], [y_test, y_test_coarse], verbose=0)

Basicamente, histogram_freq=2é o parâmetro mais importante a ser sintonizado ao chamar esse retorno de chamada: ele define um intervalo de épocas para chamar o retorno de chamada, com o objetivo de gerar menos arquivos em discos.

Então, aqui está um exemplo de visualização da evolução dos valores para a última convolução durante o treinamento, uma vez vista no TensorBoard, na guia "histogramas" (e eu achei a guia "distribuições" contendo gráficos muito semelhantes, mas invertidos):

monitoramento de pesos do tensorboard

Caso queira ver um exemplo completo no contexto, consulte este projeto de código aberto: https://github.com/Vooban/Hyperopt-Keras-CNN-CIFAR-100


Eu diminuí a votação porque uma grande parte disso é na verdade perguntas e não uma resposta para a pergunta. Não faça novas perguntas nas respostas, se é parte ou o objetivo inteiro de uma resposta.
Zoe

Editei a pergunta para remover o que você mencionou. De fato, esse retorno de chamada é muito difícil de usar corretamente da documentação no momento em que respondi.
Guillaume Chevalier

Para responder "Como uso o retorno de chamada do TensorBoard da Keras?", Todas as outras respostas estão incompletas e respondem apenas ao pequeno contexto da pergunta - ninguém aborda os casamentos, por exemplo. Pelo menos, eu havia documentado possíveis erros ou coisas a evitar na minha resposta. Acho que levantei questões importantes que ninguém considera pensar ainda. Ainda estou esperando por uma resposta completa. Esse retorno de chamada também é mal documentado, como o câncer.
Guillaume Chevalier

4

Se você estiver usando o google-colab, a visualização simples do gráfico seria:

import tensorboardcolab as tb

tbc = tb.TensorBoardColab()
tensorboard = tb.TensorBoardColabCallback(tbc)


history = model.fit(x_train,# Features
                    y_train, # Target vector
                    batch_size=batch_size, # Number of observations per batch
                    epochs=epochs, # Number of epochs
                    callbacks=[early_stopping, tensorboard], # Early stopping
                    verbose=1, # Print description after each epoch
                    validation_split=0.2, #used for validation set every each epoch
                    validation_data=(x_test, y_test)) # Test data-set to evaluate the model in the end of training

2

Você escreveu log_dir='/Graph', você quis dizer em ./Graphvez disso? Você enviou /home/user/Graphno momento.


1
Por que /Graphcriar uma pasta no diretório inicial do usuário em vez de apenas usar /Graphdiretamente?
Michael Mior

2

Você deve conferir o Losswise ( https://losswise.com ), ele possui um plug-in para o Keras que é mais fácil de usar do que o Tensorboard e possui alguns recursos extras interessantes. Com o Losswise, você apenas usa from losswise.libs import LosswiseKerasCallbacke então callback = LosswiseKerasCallback(tag='my fancy convnet 1')está pronto (consulte https://docs.losswise.com/#keras-plugin ).


7
Disclaimer: OP é o fundador da Losswise, que é um produto pago (embora com um muito generoso nível gratuito)
Michael Mior

@MichaelMior está correta, embora não seja um produto pago ainda e nunca pode ser (com excepção das licenças prem no futuro talvez)
nicodjimenez

2

Existem poucas coisas.

Primeiro, não /Graphmas./Graph

Segundo, quando você usa o retorno de chamada TensorBoard, sempre passe dados de validação, porque sem ele, ele não seria iniciado.

Terceiro, se você quiser usar qualquer coisa, exceto resumos escalares, use o fitmétodo apenas porque fit_generatornão funcionará. Ou você pode reescrever o retorno de chamada para trabalhar fit_generator.

Para adicionar retornos de chamada, basta adicioná-lo a model.fit(..., callbacks=your_list_of_callbacks)



2

Crie o retorno de chamada do Tensorboard:

from keras.callbacks import TensorBoard
from datetime import datetime
logDir = "./Graph/" + datetime.now().strftime("%Y%m%d-%H%M%S") + "/"
tb = TensorBoard(log_dir=logDir, histogram_freq=2, write_graph=True, write_images=True, write_grads=True)

Passe o retorno de chamada da Tensorboard para a chamada de ajuste:

history = model.fit(X_train, y_train, epochs=200, callbacks=[tb])

Ao executar o modelo, se você receber um erro Keras de

"Você deve alimentar um valor para o tensor do espaço reservado"

tente redefinir a sessão Keras antes da criação do modelo, fazendo:

import keras.backend as K
K.clear_session()

Corrigiu o problema You must feed a value for placeholder tensor. Alguma idéia do porquê?
Ruthvik Vaila
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.