Path: blob/master/site/pt-br/guide/basic_training_loops.ipynb
25115 views
Copyright 2020 The TensorFlow Authors.
Loops de treinamento básicos
Nos guias anteriores, você aprendeu sobre tensores, variáveis, fitas de gradiente e módulos. Neste guia, você usará tudo isso para treinar modelos.
O TensorFlow também inclui a API tf.Keras, uma API de redes neurais de alto nível que fornece abstrações úteis para reduzir o uso de código boilerplate. No entanto, neste guia, você usará classes básicas.
Configuração
Solucionando problemas de aprendizado de máquina
A resolução de um problema de aprendizado de máquina geralmente consiste nas seguintes etapas:
Obtenção de dados de treinamento.
Definição do modelo
Definição de uma função de perda
Percorrer os dados de treinamento, calculando a perda a partir do valor ideal
Calcular gradientes para essa perda e usar um otimizador para ajustar as variáveis para que os dados caibam.
Avaliação dos resultados.
Para fins de ilustração, neste guia você desenvolverá um modelo linear simples, , que possui duas variáveis: (pesos) e (bias).
Este é o mais básico dos problemas de aprendizado de máquina: dados e , tente encontrar a inclinação e o deslocamento de uma linha por meio da regressão linear simples.
Dados
O aprendizado supervisionado usa entradas (geralmente denotadas como x) e saídas (denotadas como y, geralmente chamadas de rótulos). O objetivo é aprender com entradas e saídas emparelhadas para que você possa prever o valor de uma saída a partir de uma entrada.
Cada entrada de dados, no TensorFlow, quase sempre é representada por um tensor e geralmente é um vetor. No treinamento supervisionado, a saída (ou valor que você gostaria de prever) também é um tensor.
Aqui estão alguns dados sintetizados pela adição de ruído gaussiano (normal) a pontos ao longo de uma linha.
Os tensores geralmente são reunidos em lotes ou grupos de entradas e saídas empilhadas. O lote pode conferir alguns benefícios ao treinamento e funciona bem com aceleradores e computação vetorizada. Dado o tamanho desse dataset, você pode tratar todo o dataset como um único lote.
Definição do modelo
Use tf.Variable
para representar todos os pesos em um modelo. Um tf.Variable
armazena um valor e o fornece na forma de tensor conforme necessário. Consulte o guia de variáveis para mais detalhes.
Use tf.Module
para encapsular as variáveis e a computação. Você pode usar qualquer objeto Python, mas dessa forma ele pode ser salvo com facilidade.
Aqui, você define como variáveis tanto w como b.
As variáveis iniciais são definidas aqui de forma fixa, mas o Keras vem com diversos inicializadores que você pode usar, com ou sem o restante do Keras.
Definição de uma função de perda
Uma função de perda mede o quanto a saída de um modelo para uma determinada entrada corresponde à saída-alvo. O objetivo é minimizar essa diferença durante o treinamento. Defina a perda L2 padrão, também conhecida como erro "quadrado médio":
Antes de treinar o modelo, você pode prever o valor da perda plotando as previsões do modelo em vermelho e os dados de treinamento em azul:
Definição de um loop de treinamento
O loop de treinamento consiste em fazer repetidamente três tarefas em ordem:
Enviar um lote de entradas através do modelo para gerar saídas
Calcular a perda comparando as saídas com a saída (ou rótulo)
Usar fitas de gradiente para encontrar os gradientes
Otimizar as variáveis com esses gradientes
Para este exemplo, você pode treinar o modelo usando o método do gradiente descendente.
Existem muitas variantes do esquema do método do gradiente descendente que são capturadas em tf.keras.optimizers
. Mas no espírito de construir a partir dos princípios básicos, aqui você mesmo vai implementar a matemática básica com a ajuda de tf.GradientTape
para diferenciação automática e tf.assign_sub
para decrementar um valor (que combina tf.assign
e tf.sub
):
Para dar uma olhada no treinamento, você pode enviar o mesmo lote de x e y através do loop de treinamento e ver como W
e b
evoluem.
Faça o treinamento
Plote a evolução dos pesos ao longo do tempo:
Visualize o desempenho do modelo treinado
A mesma solução, mas com Keras
É útil comparar o código acima com o equivalente em Keras.
A definição do modelo parece exatamente igual se você usar uma subclasse de tf.keras.Model
. Lembre-se que os modelos Keras herdam, em última instância, de module.
Em vez de escrever novos loops de treinamento sempre que criar um modelo, você pode usar os recursos integrados do Keras como um atalho. Isso pode ser útil quando você não quiser escrever ou depurar loops de treinamento no Python.
Se fizer isso, você precisará usar model.compile()
para definir os parâmetros e model.fit()
para treinar. Pode ter menos código para usar as implementações Keras de perda de L2 e método do gradiente descendente, novamente como um atalho. As perdas e otimizadores do Keras também podem ser usados fora dessas funções de conveniência, e o exemplo anterior poderia tê-los usado.
O Keras fit
espera dados em lote ou um dataset completo como um array NumPy. As matrizes NumPy são divididas em lotes e padronizadas para um tamanho de lote de 32.
Nesse caso, para corresponder ao comportamento do loop escrito à mão, você deve passar x
como um único lote de tamanho 1000.
Observe que Keras imprime a perda após o treinamento, não antes, então a primeira perda parece menor, mas, caso contrário, isso mostra essencialmente o mesmo desempenho de treinamento.
Próximos passos
Neste guia, você viu como usar as classes principais de tensores, variáveis, módulos e fitas de gradiente para construir e treinar um modelo e, além disso, como essas ideias são implementadas no Keras.
Este é, no entanto, um problema extremamente simples. Para uma introdução mais prática, consulte Passo a passo de treinamento personalizado.
Para saber mais sobre o uso de loops de treinamento integrados no Keras, consulte este guia. Para saber mais sobre loops de treinamento e Keras, consulte este guia. Para escrever loops de treinamento distribuídos personalizados, consulte este guia.