Path: blob/master/site/pt-br/tutorials/keras/save_and_load.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Salvar e carregar modelos
O progresso dos modelos pode ser salvo durante e após o treinamento. Portanto, um modelo pode ser retomado de onde parou e evitar tempos de treinamento longos. Ao salvar, você também pode compartilhar o modelo, e outras pessoas podem recriar o seu trabalho. Ao publicar modelos e técnicas e pesquisa, a maioria dos pesquisadores de aprendizado de máquina compartilham:
O código para criar o modelo.
Os pesos treinados, ou parâmetros, do modelo.
Compartilhar esses dados ajuda outras pessoas a entenderem como o modelo funciona e testá-lo com novos dados.
Atenção: os modelos do TensorFlow são códigos, e é importante ter cuidado com código não confiável. Confira mais detalhes em Como usar o TensorFlow com segurança.
Opções
Existem diferentes maneiras de salvar modelos do TensorFlow, dependendo da API usada. Este guia usa tf.keras, uma API de alto nível para criar e treinar modelos no TensorFlow. O novo formato de alto nível .keras
usado neste tutorial é recomendado para salvar objetos do Keras, pois oferece um salvamento robusto e eficiente baseado em nomes, que geralmente é mais fácil de depurar do que formatos legados ou de baixo nível. Para workflows de salvamento e serialização mais avançados, especialmente quando envolverem objetos personalizados, confira o guia Salvar e carregar modelos do Keras. Para outras estratégias, confira o guia Como usar o formato SavedModel.
Configuração
Instalações e importações
Instale e importe o TensorFlow, além das dependências:
Obter um dataset de exemplo
Para demonstrar como salvar e carregar pesos, você usará o dataset MNIST. Para acelerar as execuções, use os primeiros mil exemplos:
Definir um modelo
Comece criando um modelo sequencial simples:
Salvar checkpoints durante o treinamento
Você pode usar um modelo treinado sem precisar treiná-lo novamente ou pode retomar o treinamento de onde parou caso o processo de treinamento tenha sido interrompido. O callback tf.keras.callbacks.ModelCheckpoint
permite salvar continuamente o modelo tanto durante quanto no término do treinamento.
Uso do callback de checkpoint
Crie um callback tf.keras.callbacks.ModelCheckpoint
que salve os pesos somente durante o treinamento:
É criada uma coleção única de arquivos de checkpoint do TensorFlow, atualizados no final de cada época:
Desde que os dois modelos tenham a mesma arquitetura, você pode compartilhar pesos entre eles. Portanto, ao restaurar um modelo somente a partir dos pesos, crie um modelo com a mesma arquitetura do modelo original e depois defina os pesos.
Agora, crie novamente um modelo novo, não treinado, e faça a avaliação com o conjunto de teste. Um modelo não treinado será treinado ao acaso (exatidão de cerca de 10%):
Em seguida, carregue os pesos do checkpoint e refaça a avaliação:
Opções do callback de checkpoint
O callback oferece várias opções para fornecer nomes exclusivos para os checkpoints e ajustar a frequência de criação de checkpoints.
Treine um novo modelo e depois salve checkpoints com nomes exclusivos após cada cinco épocas:
Agora, confira os checkpoints resultantes e escolha o último:
Observação: o formato padrão do TensorFlow salva somente os cinco checkpoints mais recentes.
Para testar, redefina o modelo e carregue o último checkpoint:
O que são esses arquivos?
O código acima armazena os pesos em uma coleção de arquivos com formato de checkpoint que contêm somente os pesos treinados em um formato binário. Os checkpoints contêm:
Um ou mais fragmentos que contêm os pesos do seu modelo.
Um arquivo de índice que indica quais pesos são armazenados em qual fragmento.
Se você estiver treinando um modelo em uma única máquina, terá um fragmento com o sufixo: .data-00000-of-00001
Salvar os pesos manualmente
Para salvar os pesos manualmente, use tf.keras.Model.save_weights
. Por padrão, tf.keras
— e especificamente o método Model.save_weights
— usa o formato de Checkpoint do TensorFlow com extensão .ckpt
. Para salvar no formato HDF5 com extensão .h5
, confira o guia Salvar e carregar modelos.
Salvar o modelo inteiro
Faça uma chamada a tf.keras.Model.save
para salvar a arquitetura, os pesos e a configuração de treinamento de um modelo em um único arquivo zip model.keras
.
Um modelo inteiro pode ser salvo em três formatos de arquivo diferentes (o novo formato .keras
e dois formatos legados: SavedModel
e HDF5
). Ao salvar um modelo como path/to/model.keras
, ele é salvo no formato mais recente automaticamente.
Observação: para objetos do Keras, recomenda-se usar o novo formato de alto nível .keras
, pois ele oferece tarefas de salvar e carregar com base em nomes com mais recursos, além de ser mais fácil de depurar. O formato de baixo nível SavedModel e o formato legado H5 continuam com suporte para códigos existentes.
Para mudar para o formato SavedModel, você pode:
Passar
save_format='tf'
parasave()
.Passar um nome de arquivo sem extensão.
Para mudar para o formato H5, você pode:
Passar
save_format='h5'
parasave()
.Passar um nome de arquivo que termine em
.h5
.
É muito útil salvar um modelo totalmente funcional: você pode carregá-lo no TensorFlow.js (Saved Model, HDF5), depois treiná-lo e executá-lo em navegadores web, ou convertê-lo para ser executado em dispositivos móveis usando o TensorFlow Lite (Saved Model, HDF5).
*Objetos personalizados (por exemplo, modelos ou camadas que sejam uma subclasse) exigem atenção especial ao salvar e carregar. Confira a seção Como salvar objetos personalizados abaixo.
O novo formato de alto nível .keras
O novo formato de salvamento do Keras v3, indicado pela extensão .keras
, é um formato mais simples e eficiente que implementa salvamento baseado em nomes, garantindo que aquilo que você carregue seja exatamente o que foi salvo pela perspectiva do Python. Dessa forma, a depuração fica muito mais fácil, e ele é o formato recomendado para o Keras.
A seção abaixo ilustra como salvar e restaurar o modelo no formato .keras
.
Recarregue um novo modelo do Keras pelo arquivo zip .keras
:
Tente executar a avaliação e a previsão com o modelo carregado:
Formato SavedModel
O formato SavedModel é outra forma de serializar modelos. Os modelos salvos nesse formato podem ser restaurados usando tf.keras.models.load_model
e são compatíveis com o TensorFlow Serving. O Guia do SavedModel detalha como serve/inspect
(servir/inspecionar) o SavedModel. A seção abaixo ilustra as etapas para salvar e restaurar o modelo.
O formato SavedModel é um diretório que contém um binário protobuf e um checkpoint do TensorFlow. Avalie o diretório do modelo salvo:
Recarregue um novo modelo do Keras a partir do modelo salvo:
O modelo restaurado é compilado com os mesmos argumentos do original. Tente executar a avaliação e previsão com o modelo carregado:
Formato HDF5
O Keras oferece um formato de salvamento de alto nível básico e legado usando o padrão HDF5.
Agora, recrie o modelo a partir desse arquivo:
Confira a exatidão:
O Keras salva modelos avaliando suas arquiteturas. Essa técnica salva tudo:
Os valores de pesos.
A arquitetura do modelo.
A configuração de treinamento do modelo (o que você passa para o método
.compile()
).O otimizador e seu estado, se houver (isso permite que você reinicie o treinamento de onde parou).
O Keras não consegue salvar os otimizadores v1.x
(de tf.compat.v1.train
), pois eles não são compatíveis com checkpoints. Para otimizadores v1.x, você precisa recompilar o modelo após carregá-lo, perdendo o estado do otimizador.
Como salvar objetos personalizados
Se você estiver usando o formato SavedModel, pode ignorar esta seção. A diferença principal entre os formatos de alto nível .keras
/HDF5 e o formato de baixo nível SavedModel é que os formatos .keras
/HDF5 usam configurações de objetos para salvar a arquitetura do modelo, enquanto o formato SavedModel salva o grafo da execução. Portanto, os SavedModels conseguem salvar objetos personalizados, como modelos e camadas personalizadas que são uma subclasse, sem exigir o código original. Porém, uma consequência é que a depuração de SavedModels de baixo nível pode ser mais difícil, e recomendamos usar o formato de alto nível .keras
por ser nativo do Keras e baseado em nomes.
Para salvar objetos personalizados como .keras
e HDF5, você precisa:
Definir um método
get_config
no seu objeto e, opcionalmente, um método de classefrom_config
.get_config(self)
retorna um dicionário de parâmetros serializável em JSON, necessário para recriar o objeto.from_config(cls, config)
usa a configuração retornada porget_config
para criar um novo objeto. Por padrão, essa função usará a configuração como kwargs de inicialização (return cls(**config)
).
Passar os objetos personalizados para o modelo de uma dentre três formas:
Registrar o objeto personalizado com o decorador
@tf.keras.utils.register_keras_serializable
(recomendado).Passar o objeto diretamente para o argumento
custom_objects
ao carregar o modelo. O argumento precisa ser um dicionário que mapeie o nome da classe de string para a classe Python. Por exemplo:tf.keras.models.load_model(path, custom_objects={'CustomLayer': CustomLayer})
.Usar um
tf.keras.utils.custom_object_scope
com o objeto incluído no argumento de dicionáriocustom_objects
e colocar uma chamada atf.keras.models.load_model(path)
dentro do escopo.
Confira o tutorial Como escrever camadas e modelos do zero para ver exemplos de objetos personalizados e get_config
.