O TensorBoard é uma ferramenta de visualização poderosa integrada ao TensorFlow, projetada para auxiliar na compreensão e depuração de modelos de aprendizado de máquina. Ele oferece uma representação gráfica intuitiva da estrutura da rede neural, facilitando a identificação de gargalos e a análise do comportamento do modelo durante o treinamento.
Recursos e Documentação:
- Guia de Sumários e TensorBoard: https://www.tensorflow.org/guide/summaries_and_tensorboard
- Visualização de Grafos: https://www.tensorflow.org/guide/graph_viz
- Análise de Histogramas: https://www.tensorflow.org/guide/tensorboard_histograms
Iniciando o TensorBoard
Para executar o TensorBoard, utilize o seguinte comando no seu terminal:
tensorboard --logdir=caminho/para/diretorio/de/logs
O parâmetro --logdir especifica o diretório onde o FileWriter salva os eventos do treinamento. É recomendado executar este comando a partir do diretório pai do local de logs. Após o TensorBoard ser iniciado, acesse localhost:6006 no seu navegador para visualizar os painéis.
Obtendo Ajuda
Para visualizar todas as opções e parâmetros disponíveis para o TensorBoard, execute:
tensorboard --help
Exemplo de Implementação
Código Fonte
import tensorflow as tf
import numpy as np
import os
# Configura o nível de log do TensorFlow para exibir apenas erros críticos
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
def criar_camada(entradas, tam_entrada, tam_saida, nome_camada, funcao_ativacao=None):
"""
Adiciona uma camada a uma rede neural TensorFlow com sumarização para TensorBoard.
Args:
entradas: Tensor de entrada para a camada.
tam_entrada: Dimensão da entrada da camada.
tam_saida: Dimensão da saída da camada.
nome_camada: Nome base para a camada e seus componentes no grafo.
funcao_ativacao: Função de ativação a ser aplicada (padrão: None).
Returns:
Tensor de saída da camada.
"""
with tf.name_scope(nome_camada):
# Camada de pesos
with tf.name_scope('pesos'):
pesos = tf.Variable(tf.random.normal([tam_entrada, tam_saida]), name='W')
# Cria um histograma para os pesos
tf.summary.histogram(f"{nome_camada}/pesos", pesos)
# Camada de bias
with tf.name_scope('bias'):
bias = tf.Variable(tf.zeros([1, tam_saida]) + 0.1, name='b')
# Cria um histograma para os biases
tf.summary.histogram(f"{nome_camada}/bias", bias)
# Operação linear Wx + b
with tf.name_scope('operacao_linear'):
operacao = tf.matmul(entradas, pesos) + bias
# Aplica a função de ativação, se especificada
if funcao_ativacao is None:
saidas = operacao
else:
saidas = funcao_ativacao(operacao)
# Cria um histograma para as saídas da camada
tf.summary.histogram(f"{nome_camada}/saidas", saidas)
return saidas
# --- Geração de Dados Sintéticos ---
# Cria 300 pontos de dados no intervalo [-1, 1]
x_dados = np.linspace(-1, 1, 300, dtype=np.float32)[:, np.newaxis]
# Adiciona ruído Gaussiano aos dados
ruido = np.random.normal(0, 0.05, x_dados.shape).astype(np.float32)
y_dados = np.square(x_dados) - 0.5 + ruido
# --- Construção da Rede Neural ---
with tf.name_scope('entradas'):
# Placeholder para as entradas do modelo
x_input = tf.placeholder(tf.float32, [None, 1], name='x_entrada')
y_input = tf.placeholder(tf.float32, [None, 1], name='y_entrada')
# Camada oculta com 10 neurônios e ativação ReLU
camada_oculta1 = criar_camada(x_input, 1, 10, nome_camada='camada_oculta1', funcao_ativacao=tf.nn.relu)
# Camada de saída com 1 neurônio e sem ativação
predicao = criar_camada(camada_oculta1, 10, 1, nome_camada='camada_saida', funcao_ativacao=None)
# --- Definição da Função de Perda e Otimizador ---
with tf.name_scope('perda'):
# Calcula o erro quadrático médio
perda = tf.reduce_mean(tf.reduce_sum(tf.square(y_input - predicao), reduction_indices=[1]))
# Cria um resumo escalar para a perda
tf.summary.scalar('perda_total', perda)
with tf.name_scope('treinamento'):
# Otimizador de Gradiente Descendente
otimizador = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(perda)
# --- Inicialização da Sessão e do TensorBoard ---
sessao = tf.Session()
# Combina todas as operações de resumo definidas
resumo_combinado = tf.summary.merge_all()
# Cria um escritor para salvar os eventos do TensorBoard no diretório 'logs'
escritor_logs = tf.summary.FileWriter("logs/", sessao.graph)
# Inicializa todas as variáveis globais
sessao.run(tf.global_variables_initializer())
# --- Treinamento do Modelo ---
for i in range(1001):
# Executa o passo de treinamento e a operação de perda
sessao.run(otimizador, feed_dict={x_input: x_dados, y_input: y_dados})
if i % 50 == 0:
# Calcula e imprime a perda a cada 50 passos
perda_atual = sessao.run(perda, feed_dict={x_input: x_dados, y_input: y_dados})
print(f"Passo: {i} | Perda: {perda_atual:.8f}")
# Executa a operação de merge de resumos para obter os dados de visualização
resumo_executado = sessao.run(resumo_combinado, feed_dict={x_input: x_dados, y_input: y_dados})
# Adiciona os resumos ao arquivo de eventos do TensorBoard
escritor_logs.add_summary(resumo_executado, i)
# --- Visualização do TensorBoard ---
# Para visualizar, navegue até o diretório onde o script foi executado e execute:
# tensorboard --logdir=logs
# Em seguida, acesse http://localhost:6006 no seu navegador.
# Exemplo de como visualizar os dados de predição (opcional, para fins de comparação)
# predicao_valor = sessao.run(predicao, feed_dict={x_input: x_dados})
# plt.scatter(x_dados, y_dados)
# plt.plot(x_dados, predicao_valor, 'r-', lw=5)
# plt.show()
Exemplo de Saída do Console Durante o Treinamento
Passo: 0 | Perda: 0.19870563
Passo: 50 | Perda: 0.00631481
Passo: 100 | Perda: 0.00508564
Passo: 150 | Perda: 0.00482231
Passo: 200 | Perda: 0.00461716
Passo: 250 | Perda: 0.00442936
Passo: 300 | Perda: 0.00426062
Passo: 350 | Perda: 0.00409369
Passo: 400 | Perda: 0.00393298
Passo: 450 | Perda: 0.00381784
Passo: 500 | Perda: 0.00372229
Passo: 550 | Perda: 0.00366051
Passo: 600 | Perda: 0.00361109
Passo: 650 | Perda: 0.00357169
Passo: 700 | Perda: 0.00353621
Passo: 750 | Perda: 0.00349751
Passo: 800 | Perda: 0.00346524
Passo: 850 | Perda: 0.00343188
Passo: 900 | Perda: 0.00339302
Passo: 950 | Perda: 0.00336653
Passo: 1000 | Perda: 0.00334952
Estrutura de Diretório Pós-Execução (Exemplo)
logs/
└── events.out.tfevents.1551022894.nome_do_host
Iniciando e Explorando o TensorBoard
Execute o comando tensorboard --logdir=logs no terminal, dentro do diretório onde o script foi executado. Em seguida, abra seu navegador e acesse http://localhost:6006.
Painel Scalars
Este painel exibe gráficos de séries temporais para métricas escalares, como a perda do modelo ao longo das épocas de treinamento.
Painel Graphs
Visualize a estrutura computacional completa do seu modelo TensorFlow. Você pode navegar pelo grafo, expandir nós e inspecionar detalhes das operações e variáveis. Use a roda do mouse para ajustar o zoom e arraste para mover o gráfico. Dê um duplo clique no ícone '+' para descer nos níveis do grafo.
Painel Distributions
Mostra a distribuição de valores de tensores ao longo do tempo, útil para observar como os pesos e ativações mudam durante o treinamento.
Painel Histograms
Apresenta histogramas dos valores de tensores (como pesos e biases) em diferentes etapas do treinamento, permitindo uma análise mais detalhada da distribuição desses parâmetros.