Explorando o TensorBoard para Visualização de Modelos TensorFlow

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:

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.

Tags: tensorflow tensorboard visualização deep learning machine learning

Publicado em 8-2 17:26