Exportando modelos no formato TF1 Hub

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Você pode ler mais sobre este formato no formato TF1 Hub

Nota de compatibilidade

O formato TF1 Hub é voltado para o TensorFlow 1. Ele é apenas parcialmente suportado pelo TF Hub no TensorFlow 2. Considere publicar no novo formato TF2 SavedModel seguindo o guia Exportar um modelo .

O formato TF1 Hub é semelhante ao formato SavedModel do TensorFlow 1 em um nível sintático (mesmos nomes de arquivo e mensagens de protocolo), mas semanticamente diferente para permitir a reutilização, composição e retreinamento do módulo (por exemplo, armazenamento diferente de inicializadores de recursos, marcação diferente convenções para metagrafias). A maneira mais fácil de diferenciá-los no disco é a presença ou ausência do arquivo tfhub_module.pb .

Abordagem geral

Para definir um novo módulo, um publicador chama hub.create_module_spec() com uma função module_fn . Esta função constrói um gráfico representando a estrutura interna do módulo, usando tf.placeholder() para entradas a serem fornecidas pelo chamador. Em seguida, ele define assinaturas chamando hub.add_signature(name, inputs, outputs) uma ou mais vezes.

Por exemplo:

def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)

O resultado de hub.create_module_spec() pode ser usado, em vez de um caminho, para instanciar um objeto de módulo em um gráfico específico do TensorFlow. Nesse caso, não há ponto de verificação e a instância do módulo usará os inicializadores de variáveis.

Qualquer instância de módulo pode ser serializada em disco por meio de seu método export(path, session) . A exportação de um módulo serializa sua definição junto com o estado atual de suas variáveis ​​na session no caminho passado. Isso pode ser usado ao exportar um módulo pela primeira vez, bem como ao exportar um módulo ajustado.

Para compatibilidade com TensorFlow Estimators, hub.LatestModuleExporter exporta módulos do último checkpoint, assim como tf.estimator.LatestExporter exporta todo o modelo do último checkpoint.

Os editores de módulos devem implementar uma assinatura comum quando possível, para que os consumidores possam facilmente trocar módulos e encontrar o melhor para seu problema.

Exemplo real

Dê uma olhada em nosso exportador de módulos de incorporação de texto para obter um exemplo real de como criar um módulo a partir de um formato de incorporação de texto comum.

Conselhos para editores

Para facilitar o ajuste fino para os consumidores, lembre-se do seguinte:

  • O ajuste fino precisa de regularização. Seu módulo é exportado com a coleção REGULARIZATION_LOSSES , que é o que coloca sua escolha de tf.layers.dense(..., kernel_regularizer=...) etc. no que o consumidor obtém de tf.losses.get_regularization_losses() . Prefira esta forma de definir as perdas de regularização L1/L2.

  • No modelo do editor, evite definir a regularização L1/L2 por meio dos parâmetros l1_ e l2_regularization_strength de tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer e outros otimizadores proximais. Eles não são exportados juntamente com o módulo, e definir os pontos fortes de regularização globalmente pode não ser apropriado para o consumidor. Exceto para regularização L1 em ​​modelos amplos (ou seja, lineares esparsos) ou amplos e profundos, deve ser possível usar perdas de regularização individuais.

  • Se você usar dropout, normalização em lote ou técnicas de treinamento semelhantes, defina seus hiperparâmetros para valores que façam sentido em muitos usos esperados. A taxa de abandono pode ter que ser ajustada à propensão do problema-alvo ao overfitting. Na normalização em lote, o momento (também conhecido como coeficiente de decaimento) deve ser pequeno o suficiente para permitir o ajuste fino com pequenos conjuntos de dados e/ou grandes lotes. Para consumidores avançados, considere adicionar uma assinatura que exponha o controle sobre hiperparâmetros críticos.