Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Migrazione da TF1 a TF2 con l'hub TensorFlow

Questa pagina spiega come continuare a utilizzare TensorFlow Hub durante la migrazione del codice TensorFlow da TensorFlow 1 a TensorFlow 2. Completa la guida generale alla migrazione di TensorFlow.

Per TF2, TF Hub si è allontanato hub.Module legacy hub.Module API del hub.Module per la creazione di un tf.compat.v1.Graph come fanno tf.contrib.v1.layers . Invece, ora hub.KerasLayer un hub.KerasLayer da utilizzare insieme ad altri layer Keras per la creazione di un tf.keras.Model (in genere nel nuovo ambiente di esecuzione desideroso di TF2) e il suo metodo hub.load() sottostante per il codice TensorFlow di basso livello.

L'API hub.Module rimane disponibile nella libreria tensorflow_hub per l'uso in TF1 e nella modalità di compatibilità TF1 di TF2. Può caricare solo modelli nel formato Hub TF1 .

La nuova API di hub.load() e hub.KerasLayer funziona per TensorFlow 1.15 (in modalità hub.KerasLayer e Graph) e in TensorFlow 2. Questa nuova API può caricare i nuovi asset TF2 SavedModel e, con le restrizioni stabilite nel modello guida alla compatibilità , i modelli legacy in formato TF1 Hub.

In generale, si consiglia di utilizzare la nuova API ove possibile.

Riepilogo della nuova API

hub.load() è la nuova funzione di basso livello per caricare un SavedModel dall'hub TensorFlow (o servizi compatibili). Contiene tf.saved_model.load() di TF2; La Guida ai modelli salvati di TensorFlow descrive cosa puoi fare con il risultato.

 m = hub.load(handle)
outputs = m(inputs)
 

La classe hub.KerasLayer chiama hub.load() e adatta il risultato per l'uso in Keras insieme ad altri livelli di Keras. (Può anche essere un comodo wrapper per i modelli Saved caricati utilizzati in altri modi.)

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

Molti tutorial mostrano queste API in azione. Vedi in particolare

Utilizzo della nuova API nella formazione su Estimator

Se si utilizza un SavedModel TF2 in uno stimatore per l'addestramento con i server dei parametri (o comunque in una sessione TF1 con variabili posizionate su dispositivi remoti), è necessario impostare experimental.share_cluster_devices_in_session nella ConfigProto di tf.Session, altrimenti si otterrà un errore come "Dispositivo assegnato '/ lavoro: ps / replica: 0 / compito: 0 / dispositivo: CPU: 0' non corrisponde a nessun dispositivo."

L'opzione necessaria può essere impostata come

 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 partire da TF2.2, questa opzione non è più sperimentale e il pezzo .experimental può essere lasciato cadere.

Caricamento di modelli legacy in formato TF1 Hub

Può succedere che un nuovo modello Saved TF2 non sia ancora disponibile per il tuo caso d'uso e che sia necessario caricare un modello legacy nel formato Hub TF1. A partire tensorflow_hub versione 0.7 di tensorflow_hub , è possibile utilizzare il modello legacy in formato TF1 Hub insieme a hub.KerasLayer come mostrato di seguito:

 m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)
 

Inoltre KerasLayer espone la possibilità di specificare tags , signature , output_key e signature_outputs_as_dict per usi più specifici di modelli legacy nel formato Hub TF1 e SavedModels legacy.

Per ulteriori informazioni sulla compatibilità del formato hub TF1, consultare la guida alla compatibilità dei modelli .

Utilizzo di API di livello inferiore

I modelli di formato TF1 legacy dell'hub possono essere caricati tramite tf.saved_model.load . Invece di

 # DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)
 

si consiglia di utilizzare:

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

In questi esempi m.signatures è un m.signatures delle funzioni concrete di TensorFlow codificate dai nomi delle firme. La chiamata a tale funzione calcola tutte le sue uscite, anche se inutilizzate. (Questo è diverso dalla valutazione pigra della modalità grafica di TF1.)