Esta página foi traduzida pela API Cloud Translation.
Switch to English

Migrando do TF1 para o TF2 com o 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. Ele complementa o guia geral de migração do TensorFlow.

Para o TF2, o TF Hub saiu da API hub.Module herdada para criar um tf.compat.v1.Graph tf.contrib.v1.layers . como faz o tf.contrib.v1.layers . Em vez disso, agora existe um hub.KerasLayer para uso em conjunto com outras camadas Keras para a construção de um tf.keras.Model (normalmente no novo ambiente de execução ansioso do TF2) e seu método subjacente hub.load() para o 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. Só pode carregar modelos no formato TF1 Hub .

A nova API de hub.load() e hub.KerasLayer funciona para o TensorFlow 1.15 (no modo ansioso e gráfico) e no TensorFlow 2. Essa nova API pode carregar os novos ativos TF2 SavedModel e, com as restrições estabelecidas no modelo guia de compatibilidade , os modelos herdados 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 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 no Keras juntamente com outras camadas do Keras. (Pode até ser um invólucro conveniente para os SavedModels carregados 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 estimador para treinar com servidores de parâmetros (ou de outra forma em uma sessão TF1 com variáveis ​​colocadas em dispositivos remotos), será necessário definir experimental.share_cluster_devices_in_session no ConfigProto da tf.Session, caso contrário, você receberá um erro como "Dispositivo atribuído '/ trabalho: ps / réplica: 0 / tarefa: 0 / dispositivo: 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, essa opção não é mais experimental e a peça .experimental pode ser descartada.

Carregando modelos herdados 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 da versão 0.7 do tensorflow_hub , é possível usar o modelo legado no formato TF1 Hub junto com o hub.KerasLayer como 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 herdados no formato TF1 Hub e no SavedModels herdado.

Para obter mais informações sobre a compatibilidade do formato do hub TF1, consulte o guia de compatibilidade do modelo .

Usando APIs de nível inferior

Os modelos de formato do hub TF1 legado 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)
 

é recomendável usar:

 # TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)
 

Nestes exemplos, m.signatures é um ditado das funções concretas do TensorFlow codificadas por nomes de assinaturas. Chamar essa função calcula todas as suas saídas, mesmo que não sejam usadas. (Isso é diferente da avaliação preguiçosa do modo gráfico do TF1.)