Esta página explica como continuar usando o TensorFlow Hub ao migrar seu código do TensorFlow do TensorFlow 1 para o TensorFlow 2. Ela complementa o guia geral de migração do TensorFlow.
Para o TF2, o TF Hub abandonou a API legada hub.Module
para construir um tf.compat.v1.Graph
como tf.contrib.v1.layers
faz. Em vez disso, agora existe um hub.KerasLayer
para uso junto com outras camadas Keras para construir um tf.keras.Model
(normalmente no novo ambiente de execução ansioso do TF2) e seu método hub.load()
subjacente para código TensorFlow de baixo nível.
A API hub.Module
permanece disponível na biblioteca tensorflow_hub
para uso no TF1 e no modo de compatibilidade TF1 do TF2. Ele só pode carregar modelos no formato TF1 Hub .
A nova API de hub.load()
e hub.KerasLayer
funciona para TensorFlow 1.15 (no modo ansioso e gráfico) e no TensorFlow 2. Esta nova API pode carregar os novos ativos TF2 SavedModel e, com as restrições estabelecidas no modelo guia de compatibilidade , os modelos legados no formato TF1 Hub.
Em geral, é recomendado usar uma nova API sempre que possível.
Resumo da nova API
hub.load()
é a nova função de baixo nível para carregar um SavedModel do TensorFlow Hub (ou serviços compatíveis). Ele envolve tf.saved_model.load()
do TF2; O Guia SavedModel do TensorFlow descreve o que você pode fazer com o resultado.
m = hub.load(handle)
outputs = m(inputs)
A classe hub.KerasLayer
chama hub.load()
e adapta o resultado para uso em Keras junto com outras camadas Keras. (Pode até ser um wrapper conveniente para SavedModels carregados e usados de outras maneiras.)
model = tf.keras.Sequential([
hub.KerasLayer(handle),
...])
Muitos tutoriais mostram essas APIs em ação. Veja em particular
Usando a nova API no treinamento do Estimator
Se você usar um TF2 SavedModel em um Estimator para treinamento com servidores de parâmetros (ou de outra forma em uma sessão TF1 com variáveis colocadas em dispositivos remotos), você precisará definir experimental.share_cluster_devices_in_session
no ConfigProto do tf.Session, caso contrário você receberá um erro como "O dispositivo atribuído '/job:ps/replica:0/task:0/device:CPU:0' não corresponde a nenhum dispositivo."
A opção necessária pode ser definida como
session_config = tf.compat.v1.ConfigProto()
session_config.experimental.share_cluster_devices_in_session = True
run_config = tf.estimator.RunConfig(..., session_config=session_config)
estimator = tf.estimator.Estimator(..., config=run_config)
A partir do TF2.2, esta opção não é mais experimental e a peça .experimental
pode ser descartada.
Carregando modelos legados no formato TF1 Hub
Pode acontecer que um novo TF2 SavedModel ainda não esteja disponível para o seu caso de uso e você precise carregar um modelo legado no formato TF1 Hub. A partir do tensorflow_hub
versão 0.7, você pode usar o modelo legado no formato TF1 Hub junto com hub.KerasLayer
conforme mostrado abaixo:
m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)
Além disso, KerasLayer
expõe a capacidade de especificar tags
, signature
, output_key
e signature_outputs_as_dict
para usos mais específicos de modelos legados no formato TF1 Hub e SavedModels legados.
Para obter mais informações sobre a compatibilidade do formato TF1 Hub, consulte o guia de compatibilidade de modelos .
Usando APIs de nível inferior
Modelos legados no formato TF1 Hub podem ser carregados via tf.saved_model.load
. Em vez de
# DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)
é recomendado usar:
# TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)
Nestes exemplos, m.signatures
é um ditado de funções concretas do TensorFlow codificadas por nomes de assinatura. Chamar tal função calcula todas as suas saídas, mesmo que não sejam utilizadas. (Isso é diferente da avaliação lenta do modo gráfico do TF1.)