Participe do Simpósio Women in ML em 7 de dezembro Inscreva-se agora

Como migrar do TF1 para o TF2 com o TensorFlow Hub

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

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 mudou da API hub.Module legada para construir um tf.compat.v1.Graph como tf.contrib.v1.layers fazem. Em vez disso, agora há um hub.KerasLayer para uso junto com outras camadas Keras para construir um tf.keras.Model (normalmente no novo ambiente de execução ansiosa 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. Essa nova API pode carregar os novos ativos SavedModel do TF2 e, com as restrições estabelecidas no modelo guia de compatibilidade , os modelos legados no formato TF1 Hub.

Em geral, é recomendável usar a 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 o 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 usados ​​de outras maneiras.)

model = tf.keras.Sequential([
    hub.KerasLayer(handle),
    ...])

Muitos tutoriais mostram essas APIs em ação. Veja em particular

Como usar a nova API no treinamento do Estimator

Se você usar um TF2 SavedModel em um Estimator para treinar com servidores de parâmetros (ou de outra forma em uma Sessão TF1 com variáveis ​​colocadas em dispositivos remotos), você precisa definir experimental.share_cluster_devices_in_session no ConfigProto do tf.Session, ou então 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 parte .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 seu caso de uso e você precise carregar um modelo legado no formato TF1 Hub. A partir da versão 0.7 do tensorflow_hub , 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, o 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 do modelo .

Usando APIs de nível inferior

Modelos de formato legado TF1 Hub podem ser carregados via tf.saved_model.load . Ao invés 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=...)

Nesses exemplos m.signatures é um dict de funções concretas do TensorFlow codificados por nomes de assinatura. Chamar tal função calcula todas as suas saídas, mesmo se não forem utilizadas. (Isso é diferente da avaliação preguiçosa do modo gráfico do TF1.)