Path: blob/master/site/pt-br/guide/effective_tf2.ipynb
25115 views
Copyright 2020 The TensorFlow Authors.
TensorFlow 2 efetivo
Visão geral
Este guia apresenta uma lista de práticas recomendadas ao escrever código usando o TensorFlow 2 (TF2) e é destinado a usuários que tenham mudado recentemente do TensorFlow 1 (TF1) para o TF2. Confira mais informações sobre como migrar código do TF1 para o TF2 na seção de migração do guia.
Configuração
Importe o TensorFlow e outras dependências para os exemplos deste guia.
Recomendações para o TensorFlow 2 idiomático
Refatore seu código em módulos menores
Uma boa prática é refatorar seu código em funções menores que são chamadas conforme necessário. Para ter o melhor desempenho, tente decorar os maiores blocos de computação que você puder em uma tf.function
(as funções do Python aninhadas chamadas por uma tf.function
não requerem suas próprias decorações separadas, a menos que você deseje usar configurações diferentes de jit_compile
para a tf.function
). Dependendo do seu caso de uso, podem ser diversos passos de treinamento ou até mesmo seu loop de treinamento inteiro. Para inferência, talvez seja um único passo para frente do modelo.
Ajuste a taxa de aprendizado padrão para alguns tf.keras.optimizer
s
Alguns otimizadores do Keras têm taxas de aprendizados diferentes no TF2. Se você notar uma alteração no comportamento de convergências dos seus modelos, verifique as taxas de aprendizado padrão.
Não há mudanças nos otimizadores optimizers.SGD
, optimizers.Adam
ou optimizers.RMSprop
.
As seguintes taxas de aprendizado padrão mudaram:
optimizers.Adagrad
: de0.01
para0.001
optimizers.Adadelta
: de1.0
para0.001
optimizers.Adamax
: de0.002
para0.001
optimizers.Nadam
: de0.002
para0.001
Use tf.Module
s e camadas do Keras para gerenciar variáveis
tf.Module
s e tf.keras.layers.Layer
s do Keras oferecem as convenientes propriedades variables
e trainable_variables
, que reúnem recursivamente todas as variáveis dependentes. Assim, fica mais fácil gerenciar variáveis localmente, no lugar onde estão sendo usadas.
Os modelos/camadas do Keras herdam de tf.train.Checkpointable
e estão integrados a @tf.function
, o que permite fazer o checkpoint ou exportar SavedModels diretamente a partir de objetos do Keras. Você não precisa necessariamente usar a API Model.fit
do Keras para aproveitar essas integrações.
Confira a seção sobre aprendizado por transferência e ajustes finos no guia do Keras para aprender a coletar um subconjunto de variáveis relevantes usando o Keras.
Combine tf.data.Dataset
s e tf.function
O pacote TensorFlow Datasets (tfds
) contém utilitários para carregar datasets pré-definidos como objetos tf.data.Dataset
. Neste exemplo, você pode carregar o dataset MNIST usando tfds
:
Em seguida, prepare os dados para o treinamento:
Redimensione cada imagem.
Misture a ordem dos exemplos.
Colete lotes de imagens e rótulos.
Para manter o exemplo curto, corte o dataset para retornar somente 5 lotes:
Use a iteração comum do Python ao iterar dados de treinamento que cabem na memória, Caso contrário, tf.data.Dataset
é a melhor maneira de transmitir dados de treinamento a partir do disco. Os datasets são iteráveis (e não iteradores) e funcionam como qualquer outro iterável do Python na execução adiantada (eager). Você pode utilizar totalmente os recursos assíncronos de pré-busca/streaming dos datasets ao encapsular seu código em tf.function
, que substitui uma iteração do Python pelas operações equivalentes de grafo usando o AutoGraph.
Se você usar a API Model.fit
do Keras, não precisará se preocupar com a iteração de datasets.
Use os loops de treinamento do Keras
Se você não precisar de um controle de baixo nível do processo de treinamento, é recomendável usar os métodos integrados do Keras fit
, evaluate
e predict
, que oferecem uma interface uniforme para treinar o modelo, independentemente da implementação (sequencial, funcional ou de subclasse).
Veja algumas vantagens desses métodos:
Aceitam matrizes Numpy, geradores Python e
tf.data.Datasets
.Aplicam regularização e perdas de ativação atuomaticamente.
Têm suporte a
tf.distribute
, em que o código de treinamento permanece o mesmo independentemente da configuração de hardware.Têm suporte a callables arbitrários, como perdas e métricas.
Têm suporte a callbacks, como
tf.keras.callbacks.TensorBoard
, e a callbacks personalizados.Têm bom desempenho usando automaticamente os grafos do TensorFlow.
Veja um exemplo de treinamento de um modelo usando um Dataset
. Confira mais detalhes de como isso funciona nos tutoriais.
Personalize o treinamento e escreva seu próprio loop
Se os modelos do Keras funcionarem para você, mas você precisar de mais flexibilidade e controle do passo de treinamento ou dos loops de treinamento externos, você pode implementar seus próprios passos de treinamento ou até mesmo loops de treinamento inteiros. Saiba mais no guia do Keras sobre como personalizar fit
.
Você também pode implementar diversas coisas como um tf.keras.callbacks.Callback
.
Este método tem muitas das vantagens mencionadas anteriormente, mas te dá controle do passo de treinamento e até mesmo do loop externo.
Existem três passos em um loop de treinamento padrão:
Fazer a interação de um gerador do Python ou de
tf.data.Dataset
para obter lotes de exemplos.Usar
tf.GradientTape
para coletar gradientes.Usar um dos otimizadores
tf.keras.optimizers
para aplicar atualizações de peso às variáveis do modelo.
Lembre-se:
Sempre inclua um argumento
training
no métodocall
de modelos e camadas que são uma subclasse.Você deve chamar o modelo com o argumento
training
definido corretamente.Dependendo do uso, as variáveis do modelo podem não existir até que ele seja executado em um lote de dados.
Você precisa tratar alguns aspectos manualmente, como perdas de regularização do modelo.
Não há necessidade de executar inicializadores de variáveis ou de adicionar dependências de controle manual. tf.function
trata as dependências de controle automático e a inicialização de variáveis durante a criação para você.
Use tf.function
com fluxo de controle do Python
tf.function
fornece uma maneira de converter fluxos de controle dependentes de dados em equivalentes no modo grafo, como tf.cond
e tf.while_loop
.
Um caso comum de uso de fluxos de controle dependentes de dados são os modelos sequenciais. tf.keras.layers.RNN
encapsula uma célula de RNN, permitindo que você desdobre a recorrência de maneira estática ou dinâmica. Por exemplo, você poderia implementar novamente o desdobramento dinâmico da seguinte maneira:
Confira mais informações no guia de tf.function
.
Métricas e perdas com estilo novo
As métricas e perdas são objetos que funcionam em modo adiantado (eager) e em tf.function
s.
Um objeto de perda é chamável e espera (y_true
, y_pred
) como argumentos:
Use métricas para coletar e exibir dados
Você pode usar tf.metrics
para agregar dados e tf.summary
para criar um log de resumos e redirecioná-lo para um writer usando um gerenciador de contexto. Os resumos são enviados diretamente para o writer, ou seja, você precisa fornecer o valor step
no local da chamada.
Use tf.metrics
para agregar os dados antes de criar os logs resumos. As métricas são stateful: elas acumulam valores e retornam um resultado cumulativo quando você chama o método result
(como Mean.result
). Use Model.reset_states
para limpar os valores acumulados.
Visualize os resumos gerados apontando o TensorBoard para o diretório de logs de resumos:
Use a API tf.summary
para gravar dados de resumo para visualização no TensorBoard. Confira mais informações no guia de tf.summary
.
Nomes de métricas do Keras
Os modelos do Keras são consistentes no tratamento de nomes de métricas. Quando você passa uma string na lista de métricas, essa string exata é usada como o name
(nome) da métrica. Esses nomes ficam visíveis no objeto de histórico retornado por model.fit
e nos logs passados para keras.callbacks
, que é definido como a string que você passou na lista de métricas.
Depuração
Use a execução adiantada (eager) para executar o código passo a passo a fim de inspecionar formatos, tipos de dados e valores. Determinadas APIs, como tf.function
, tf.keras
, etc., foram concebidas para usar a execução de grafo por questões de desempenho e portabilidade. Ao depurar, use tf.config.run_functions_eagerly(True)
para utilizar a execução adiantada dentro desse código.
Por exemplo:
Isso também funciona dentro dos modelos do Keras e de outras APIs que têm suporte à execução adiantada (eager):
Observações:
Os métodos de
tf.keras.Model
, comofit
,evaluate
epredict
, são executados como grafos comtf.function
por baixo dos panos.Ao usar
tf.keras.Model.compile
, definarun_eagerly = True
para desativar a lógica deModel
de encapsulamento em umatf.function
.Use
tf.data.experimental.enable_debug_mode
para ativar o modo de depuração paratf.data
. Confira mais detalhes na documentação da API.
Não mantenha tf.Tensors
em seus objetos
Esses objetos tensores podem ser criados em uma tf.function
ou no contexto eager e se comportam de maneira diferente. Sempre use tf.Tensor
s somente para valores intermediários.
Para monitorar o estado, use tf.Variable
s, pois elas sempre podem ser usadas em ambos os contextos. Confira mais informações no guia de tf.Variable
.
Recursos e leitura adicional
Se você estava usando o TF1.x anteriormente, é altamente recomendável migrar seu código para o TF2. Saiba mais nos guias de migração.