Migrando de TF1 para TF2 com TensorFlow Hub

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. Aqui estão alguns exemplos:

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.)