TensorBoard é um conjunto de aplicativos da web para inspecionar e compreender execuções e gráficos do TensorFlow.
Este README fornece uma visão geral dos principais conceitos do TensorBoard, bem como como interpretar as visualizações que o TensorBoard fornece. Para obter um exemplo detalhado de uso do TensorBoard, consulte o tutorial: TensorBoard: primeiros passos. A documentação sobre como usar o TensorBoard para trabalhar com imagens, gráficos, hiperparâmetros e muito mais está vinculada a partir daí, junto com tutoriais passo a passo no Colab.
O TensorBoard foi projetado para funcionar totalmente offline, sem exigir acesso à Internet. Por exemplo, isso pode estar na sua máquina local, atrás de um firewall corporativo ou em um datacenter.
Antes de executar o TensorBoard, certifique-se de ter gerado dados de resumo em um diretório de log criando um gravador de resumo:
# sess.graph contains the graph definition; that enables the Graph Visualizer.
file_writer = tf . summary . FileWriter ( '/path/to/logs' , sess . graph )
Para obter mais detalhes, consulte o tutorial do TensorBoard. Depois de ter os arquivos de eventos, execute o TensorBoard e forneça o diretório de log. Se você estiver usando um pacote TensorFlow pré-compilado (por exemplo, instalado via pip), execute:
tensorboard --logdir path/to/logs
Ou, se você estiver construindo a partir do código-fonte:
bazel build tensorboard:tensorboard
./bazel-bin/tensorboard/tensorboard --logdir path/to/logs
# or even more succinctly
bazel run tensorboard -- --logdir path/to/logs
Isso deve imprimir que o TensorBoard foi iniciado. Em seguida, conecte-se a http://localhost:6006.
O TensorBoard requer um logdir
para ler os logs. Para obter informações sobre como configurar o TensorBoard, execute tensorboard --help
.
O TensorBoard pode ser usado no Google Chrome ou Firefox. Outros navegadores podem funcionar, mas podem haver bugs ou problemas de desempenho.
A primeira etapa no uso do TensorBoard é adquirir dados da execução do TensorFlow. Para isso, você precisa de operações resumidas. Operações de resumo são operações, assim como tf.matmul
e tf.nn.relu
, o que significa que elas absorvem tensores, produzem tensores e são avaliadas em um gráfico do TensorFlow. No entanto, as operações de resumo têm uma diferença: os tensores que eles produzem contêm protobufs serializados, que são gravados no disco e enviados ao TensorBoard. Para visualizar os dados de resumo no TensorBoard, você deve avaliar a operação de resumo, recuperar o resultado e, em seguida, gravar esse resultado no disco usando um summary.FileWriter. Uma explicação completa, com exemplos, está no tutorial.
As operações de resumo suportadas incluem:
tf.summary.scalar
tf.summary.image
tf.summary.audio
tf.summary.text
tf.summary.histogram
Ao fazer uma operação de resumo, você também atribuirá uma tag
a ela. A tag é basicamente um nome para os dados registrados por aquela operação, e será utilizada para organizar os dados no frontend. Os painéis escalar e histograma organizam os dados por tag e agrupam as tags em pastas de acordo com um diretório/like/hierarquia. Se você tiver muitas tags, recomendamos agrupá-las com barras.
summary.FileWriters
pegam dados resumidos do TensorFlow e os gravam em um diretório especificado, conhecido como logdir
. Especificamente, os dados são gravados em um dump de registro somente anexado que terá "tfevents" no nome do arquivo. O TensorBoard lê dados de um diretório completo e os organiza no histórico de uma única execução do TensorFlow.
Por que ele lê o diretório inteiro, em vez de um arquivo individual? Você pode estar usando supervisor.py para executar seu modelo. Nesse caso, se o TensorFlow travar, o supervisor o reiniciará a partir de um ponto de verificação. Ao reiniciar, ele começará a gravar em um novo arquivo de eventos e o TensorBoard unirá os vários arquivos de eventos para produzir um histórico consistente do que aconteceu.
Você pode comparar visualmente várias execuções do seu modelo; por exemplo, suponha que você alterou os hiperparâmetros e deseja ver se está convergindo mais rapidamente. O TensorBoard permite isso por meio de diferentes "execuções". Quando o TensorBoard recebe um logdir
na inicialização, ele percorre recursivamente a árvore de diretórios com raiz no logdir
procurando subdiretórios que contenham dados tfevents. Cada vez que encontra esse subdiretório, ele o carrega como um novo run
e o frontend organizará os dados de acordo.
Por exemplo, aqui está um diretório de log do TensorBoard bem organizado, com duas execuções, "run1" e "run2".
/some/path/mnist_experiments/
/some/path/mnist_experiments/run1/
/some/path/mnist_experiments/run1/events.out.tfevents.1456525581.name
/some/path/mnist_experiments/run1/events.out.tfevents.1456525585.name
/some/path/mnist_experiments/run2/
/some/path/mnist_experiments/run2/events.out.tfevents.1456525385.name
/tensorboard --logdir /some/path/mnist_experiments
Você também pode passar uma lista separada por vírgulas de diretórios de log e o TensorBoard monitorará cada diretório. Você também pode atribuir nomes a diretórios de log individuais colocando dois pontos entre o nome e o caminho, como em
tensorboard --logdir_spec name1:/path/to/logs/1,name2:/path/to/logs/2
Este sinalizador ( --logdir_spec
) é desencorajado e geralmente pode ser evitado . O TensorBoard percorre os diretórios de log recursivamente; para um controle mais refinado, prefira usar uma árvore de links simbólicos. Alguns recursos podem não funcionar ao usar --logdir_spec
em vez de --logdir
.
O painel escalar do TensorBoard visualiza estatísticas escalares que variam ao longo do tempo; por exemplo, você pode querer acompanhar a perda ou a taxa de aprendizagem do modelo. Conforme descrito em Conceitos-chave , você pode comparar várias execuções e os dados são organizados por tag. Os gráficos de linhas têm as seguintes interações:
Clicar no pequeno ícone azul no canto inferior esquerdo de cada gráfico irá expandi-lo
Arrastar uma região retangular no gráfico aumentará o zoom
Clicar duas vezes no gráfico diminuirá o zoom
Passar o mouse sobre o gráfico produzirá uma mira, com valores de dados registrados no seletor de execução à esquerda.
Além disso, você pode criar novas pastas para organizar tags escrevendo expressões regulares na caixa no canto superior esquerdo do painel.
O Painel do Histograma mostra como a distribuição estatística de um Tensor variou ao longo do tempo. Ele visualiza os dados registrados via tf.summary.histogram
. Cada gráfico mostra “fatias” temporais de dados, onde cada fatia é um histograma do tensor em uma determinada etapa. É organizado com o passo de tempo mais antigo atrás e o passo de tempo mais recente na frente. Ao alterar o modo de histograma de "offset" para "overlay", a perspectiva irá girar para que cada fatia do histograma seja renderizada como uma linha e sobreposta uma à outra.
O Painel de Distribuição é outra maneira de visualizar os dados do histograma de tf.summary.histogram
. Ele mostra algumas estatísticas de alto nível sobre uma distribuição. Cada linha no gráfico representa um percentil na distribuição dos dados: por exemplo, a linha inferior mostra como o valor mínimo mudou ao longo do tempo e a linha no meio mostra como a mediana mudou. Lendo de cima para baixo, as linhas têm o seguinte significado: [maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]
Esses percentis também podem ser vistos como limites de desvio padrão em uma distribuição normal: [maximum, μ+1.5σ, μ+σ, μ+0.5σ, μ, μ-0.5σ, μ-σ, μ-1.5σ, minimum]
de modo que as regiões coloridas, lidas de dentro para fora, tenham larguras [σ, 2σ, 3σ]
respectivamente.
O Image Dashboard pode exibir pngs que foram salvos por meio de um tf.summary.image
. O painel é configurado para que cada linha corresponda a uma tag diferente e cada coluna corresponda a uma execução. Como o painel de imagens suporta pngs arbitrários, você pode usá-lo para incorporar visualizações personalizadas (por exemplo, gráficos de dispersão matplotlib) no TensorBoard. Este painel sempre mostra a imagem mais recente para cada tag.
O Audio Dashboard pode incorporar widgets de áudio reproduzíveis para áudio salvo por meio de um tf.summary.audio
. O painel é configurado para que cada linha corresponda a uma tag diferente e cada coluna corresponda a uma execução. Este painel sempre incorpora o áudio mais recente para cada tag.
O Graph Explorer pode visualizar um gráfico do TensorBoard, permitindo a inspeção do modelo do TensorFlow. Para obter o melhor uso do visualizador de gráfico, você deve usar escopos de nomes para agrupar hierarquicamente as operações em seu gráfico - caso contrário, o gráfico poderá ser difícil de decifrar. Para obter mais informações, incluindo exemplos, consulte o tutorial de exame do gráfico do TensorFlow.
O Embedding Projector permite visualizar dados de alta dimensão; por exemplo, você pode visualizar seus dados de entrada depois de terem sido incorporados em um espaço de alta dimensão pelo seu modelo. O projetor de incorporação lê dados do arquivo de ponto de verificação do modelo e pode ser configurado com metadados adicionais, como um arquivo de vocabulário ou imagens de sprites. Para obter mais detalhes, consulte o tutorial de incorporação do projetor.
O Painel de Texto exibe trechos de texto salvos via tf.summary.text
. Recursos de Markdown, incluindo hiperlinks, listas e tabelas, são todos suportados.
O painel de série temporal mostra uma interface unificada contendo todos os seus escalares, histogramas e imagens salvas via tf.summary.scalar
, tf.summary.image
ou tf.summary.histogram
. Ele permite visualizar seu gráfico de linhas de 'precisão' lado a lado com histogramas de ativação e imagens de exemplo de treinamento, por exemplo.
Os recursos incluem:
Cores de corrida personalizadas: clique nos círculos coloridos no seletor de corrida para alterar a cor de uma corrida.
Cartões fixados: clique no ícone ‘fixar’ em qualquer cartão para adicioná-lo à seção fixada na parte superior para comparação rápida.
Configurações: o painel direito oferece configurações para gráficos e outras visualizações. Configurações importantes persistirão nas sessões do TensorBoard, quando hospedadas na mesma origem de URL.
Preenchimento automático no filtro de tags: pesquise gráficos específicos com mais facilidade.
Primeiro, verifique se o diretório passado para --logdir
está correto. Você também pode verificar isso navegando até o painel do Scalars (no menu “Inativo”) e procurando o caminho do diretório de log na parte inferior da barra lateral esquerda.
Se você estiver carregando do caminho correto, certifique-se de que os arquivos de eventos estejam presentes. O TensorBoard percorrerá recursivamente seu logdir, tudo bem se os dados estiverem aninhados em um subdiretório. Certifique-se de que o seguinte mostre pelo menos um resultado:
find DIRECTORY_PATH | grep tfevents
Você também pode verificar se os arquivos de eventos realmente contêm dados executando o tensorboard no modo de inspeção para inspecionar o conteúdo de seus arquivos de eventos.
tensorboard --inspect --logdir DIRECTORY_PATH
A saída de um arquivo de evento correspondente a um TensorBoard em branco ainda pode, às vezes, mostrar algumas etapas, representando alguns eventos iniciais que não são mostrados pelo TensorBoard (por exemplo, ao usar o retorno de chamada Keras TensorBoard):
tensor
first_step 0
last_step 2
max_step 2
min_step 0
num_steps 2
outoforder_steps [(2, 0), (2, 0), (2, 0)]
Por outro lado, a saída de um arquivo de evento com mais dados pode ser semelhante a esta:
tensor
first_step 0
last_step 55
max_step 250
min_step 0
num_steps 60
outoforder_steps [(2, 0), (2, 0), (2, 0), (2, 0), (50, 9), (100, 19), (150, 29), (200, 39), (250, 49)]
Atualização: após a versão 2.3.0, o TensorBoard não é mais recarregado automaticamente a cada 30 segundos. Para reativar o comportamento, abra as configurações clicando no ícone de engrenagem no canto superior direito da interface da web do TensorBoard e ative "Recarregar dados".
Atualização: a opção experimental
--reload_multifile=true
agora pode ser usada para pesquisar todos os arquivos "ativos" em um diretório em busca de novos dados, em vez do mais recente, conforme descrito abaixo. Um arquivo está "ativo" desde que tenha recebido novos dados dentro de--reload_multifile_inactive_secs
segundos atrás, o padrão é 86400.
Esse problema geralmente ocorre devido à forma como o TensorBoard itera pelos arquivos tfevents
: ele avança pelo arquivo de eventos na ordem do carimbo de data e hora e lê apenas um arquivo por vez. Suponhamos que temos arquivos com carimbos de data/hora a
e b
, onde a . Depois que o TensorBoard tiver lido todos os eventos em
a
, ele nunca retornará a ele, porque assume que novos eventos estão sendo gravados no arquivo mais recente. Isso pode causar um problema se, por exemplo, você tiver dois FileWriters
gravando simultaneamente no mesmo diretório. Se você tiver vários redatores de resumos, cada um deverá gravar em um diretório separado.
Atualização: a opção experimental
--reload_multifile=true
agora pode ser usada para pesquisar todos os arquivos "ativos" em um diretório em busca de novos dados, definido como qualquer arquivo que recebeu novos dados dentro de--reload_multifile_inactive_secs
segundos atrás, padrão para 86400.
O TensorBoard espera que apenas um arquivo de eventos seja gravado por vez, e vários redatores de resumo significam vários arquivos de eventos. Se você estiver executando uma instância distribuída do TensorFlow, recomendamos designar um único trabalhador como o "chefe" responsável por todo o processamento de resumo. Veja supervisor.py para ver um exemplo.
Se você estiver vendo dados que parecem retroceder no tempo e se sobreporem a si mesmos, existem algumas explicações possíveis.
Você pode ter várias execuções do TensorFlow, todas gravadas no mesmo diretório de log. Faça com que cada execução do TensorFlow grave em seu próprio logdir.
Atualização: a opção experimental
--reload_multifile=true
agora pode ser usada para pesquisar todos os arquivos "ativos" em um diretório em busca de novos dados, definido como qualquer arquivo que recebeu novos dados dentro de--reload_multifile_inactive_secs
segundos atrás, padrão para 86400.
Você pode ter um bug no seu código onde a variável global_step (passada para FileWriter.add_summary
) está sendo mantida incorretamente.
Pode ser que seu trabalho do TensorFlow tenha travado e sido reiniciado a partir de um ponto de verificação anterior. Consulte Como lidar com reinicializações do TensorFlow abaixo.
Como solução alternativa, tente alterar a exibição do eixo x no TensorBoard de steps
para wall_time
. Isso frequentemente resolverá o problema.
O TensorFlow foi projetado com um mecanismo para recuperação suave se um trabalho travar ou for interrompido: o TensorFlow pode gravar periodicamente arquivos de ponto de verificação de modelo, que permitem reiniciar o TensorFlow sem perder todo o progresso do treinamento.
No entanto, isso pode complicar as coisas para o TensorBoard; imagine que o TensorFlow escreveu um ponto de verificação na etapa a
e continuou em execução até a etapa b
e depois travou e reiniciou no carimbo de data/hora a
. Todos os eventos escritos entre a
e b
ficaram "órfãos" pelo evento de reinicialização e devem ser removidos.
Para facilitar isso, temos uma mensagem SessionLog
em tensorflow/core/util/event.proto
que pode registrar SessionStatus.START
como um evento; como todos os eventos, pode ter uma step
associada. Se o TensorBoard detectar um evento SessionStatus.START
com a etapa a
, ele assumirá que cada evento com uma etapa maior que a
ficou órfão e descartará esses eventos. Este comportamento pode ser desabilitado com a flag --purge_orphaned_data false
(em versões posteriores a 0.7).
O Scalar Dashboard oferece suporte à exportação de dados; você pode clicar na opção “ativar links de download” na barra esquerda. Em seguida, cada gráfico fornecerá links para download dos dados que contém.
Se precisar de acesso ao conjunto de dados completo, você pode ler os arquivos de eventos que o TensorBoard consome usando o método summary_iterator
.
Sim! Você pode clonar e mexer em um dos exemplos e criar suas próprias visualizações incríveis. Mais documentação sobre o sistema de plugins está descrita no guia ADDING_A_PLUGIN. Sinta-se à vontade para enviar solicitações de recursos ou perguntas sobre a funcionalidade do plugin.
Quando estiver satisfeito com seu novo plugin inovador, consulte a seção de distribuição sobre como publicar no PyPI e compartilhá-lo com a comunidade.
Usando o plug-in escalares personalizados, você pode criar gráficos escalares com linhas para pares run-tag personalizados. No entanto, no painel escalar original, cada gráfico escalar corresponde aos dados de uma tag específica e contém linhas para cada execução que inclui essa tag.
Gráficos de margem (que visualizam os limites inferior e superior) podem ser criados com o plugin escalar personalizado. O plugin escalar original não suporta visualização de margens.
Isso ainda não é possível. Como solução alternativa, você pode criar seu gráfico personalizado em seu próprio código (por exemplo, matplotlib) e, em seguida, escrevê-lo em um SummaryProto
( core/framework/summary.proto
) e adicioná-lo ao seu FileWriter
. Em seguida, seu gráfico personalizado aparecerá na guia de imagem do TensorBoard.
O TensorBoard usa amostragem de reservatório para reduzir a resolução de seus dados para que possam ser carregados na RAM. Você pode modificar o número de elementos que serão mantidos por tag usando o argumento de linha de comando --samples_per_plugin
(ex: --samples_per_plugin=scalars=500,images=20
). Consulte esta pergunta do Stack Overflow para obter mais informações.
Versões do TensorBoard anteriores ao TensorBoard 2.0 serviriam por padrão no host 0.0.0.0
, que é acessível publicamente. Para essas versões do TensorBoard, você pode interromper os pop-ups especificando --host localhost
na inicialização.
No TensorBoard 2.0 e superior, --host localhost
é o padrão. Use --bind_all
para restaurar o antigo comportamento de servir à rede pública em IPv4 e IPv6.
tensorboard
sem uma instalação do TensorFlow?O TensorBoard 1.14+ pode ser executado com um conjunto de recursos reduzido se você não tiver o TensorFlow instalado. A principal limitação é que a partir da versão 1.14, apenas os seguintes plug-ins são suportados: escalares, escalares personalizados, imagem, áudio, gráfico, projetor (parcial), distribuições, histogramas, texto, curvas PR, malha. Além disso, não há suporte para diretórios de registros no Google Cloud Storage.
Consulte DESENVOLVIMENTO.md.
Primeiro, tente pesquisar nossos problemas do GitHub e Stack Overflow. Pode ser que outra pessoa já tenha tido o mesmo problema ou dúvida.
Perguntas gerais sobre uso (ou problemas que podem ser específicos da sua configuração local) devem ir para Stack Overflow.
Se você encontrou um bug no TensorBoard, registre um problema no GitHub com o máximo de informações de suporte que puder fornecer (por exemplo, anexando arquivos de eventos, incluindo a saída de tensorboard --inspect
, etc.).