TF1.x -> Panoramica sulla migrazione TF2

TensorFlow 2 è fondamentalmente diverso da TF1.x in diversi modi. Puoi comunque eseguire codice TF1.x non modificato ( ad eccezione di contrib ) su installazioni binarie TF2 in questo modo:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

Tuttavia, questo non esegue comportamenti e API TF2 e potrebbe non funzionare come previsto con il codice scritto per TF2. Se non stai eseguendo i comportamenti TF2 attivi, stai effettivamente eseguendo TF1.x sopra un'installazione TF2. Leggi la guida ai comportamenti TF1 e TF2 per maggiori dettagli su come TF2 è diverso da TF1.x.

Questa guida fornisce una panoramica del processo di migrazione del codice TF1.x su TF2. Ciò ti consente di trarre vantaggio dai miglioramenti delle funzionalità nuovi e futuri e anche di rendere il tuo codice più semplice, più performante e più facile da mantenere.

Se stai utilizzando le API di alto livello di tf.keras e ti alleni esclusivamente con model.fit , il tuo codice dovrebbe essere più o meno completamente compatibile con TF2 ad eccezione dei seguenti avvertimenti:

Processo di migrazione TF2

Prima della migrazione, scopri il comportamento e le differenze API tra TF1.x e TF2 leggendo la guida .

  1. Esegui lo script automatizzato per convertire parte dell'utilizzo dell'API TF1.x in tf.compat.v1 .
  2. Rimuovi i vecchi simboli tf.contrib (controlla TF Addons e TF-Slim ).
  3. Fai in modo che i passaggi forward del tuo modello TF1.x vengano eseguiti in TF2 con l'esecuzione entusiasta abilitata.
  4. Aggiorna il tuo codice TF1.x per i cicli di addestramento e il salvataggio/caricamento dei modelli sugli equivalenti TF2.
  5. (Facoltativo) Migra le tue API tf.compat.v1 compatibili con TF2 alle API TF2 idiomatiche.

Le sezioni seguenti espandono i passaggi sopra descritti.

Esegui lo script di conversione dei simboli

Questo esegue un passaggio iniziale alla riscrittura dei simboli del codice per l'esecuzione con i binari TF 2.x, ma non renderà il codice idiomatico per TF 2.x né renderà automaticamente il codice compatibile con i comportamenti TF2.

Molto probabilmente il tuo codice utilizzerà ancora gli endpoint tf.compat.v1 per accedere a segnaposto, sessioni, raccolte e altre funzionalità in stile TF1.x.

Leggi la guida per saperne di più sulle migliori pratiche per l'utilizzo dello script di conversione dei simboli.

Rimuovere l'utilizzo di tf.contrib

Il modulo tf.contrib è stato disattivato e molti dei suoi sottomoduli sono stati integrati nell'API TF2 principale. Gli altri sottomoduli vengono ora scorporati in altri progetti come TF IO e TF Addons .

Una grande quantità di codice TF1.x precedente utilizza la libreria Slim , che era inclusa in TF1.x come tf.contrib.layers . Durante la migrazione del codice Slim su TF2, cambia gli utilizzi dell'API Slim in modo che puntino al pacchetto pip tf-slim . Quindi, leggi la guida alla mappatura del modello per sapere come convertire il codice Slim.

In alternativa, se utilizzi modelli Slim pre-addestrati, potresti provare i modelli pre-addestrati di Keras da tf.keras.applications o TF2 SavedModel di TF Hub esportati dal codice Slim originale.

Fai in modo che i passaggi forward del modello TF1.x vengano eseguiti con i comportamenti TF2 abilitati

Tieni traccia delle variabili e delle perdite

TF2 non supporta le raccolte globali.

L'esecuzione anticipata in TF2 non supporta le API basate su raccolta tf.Graph . Ciò influisce sul modo in cui costruisci e tieni traccia delle variabili.

Per il nuovo codice TF2 utilizzeresti tf.Variable invece di v1.get_variable e utilizzeresti oggetti Python per raccogliere e tenere traccia delle variabili invece di tf.compat.v1.variable_scope . In genere questo sarebbe uno dei seguenti:

Elenchi aggregati di variabili (come tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ) con gli attributi .variables e .trainable_variables degli oggetti Layer , Module o Model .

Le classi Layer e Model implementano diverse altre proprietà che eliminano la necessità di raccolte globali. La loro proprietà .losses può sostituire l'utilizzo della raccolta tf.GraphKeys.LOSSES .

Leggi la guida alla mappatura dei modelli per saperne di più sull'utilizzo degli spessori di modellazione del codice TF2 per incorporare il codice esistente basato get_variable e variable_scope all'interno di Layers , Models e Modules . Ciò ti consentirà di eseguire passaggi in avanti con l'esecuzione entusiasta abilitata senza importanti riscritture.

Adattarsi ad altri cambiamenti di comportamento

Se la guida alla mappatura del modello da sola non è sufficiente per far sì che il tuo modello esegua altre modifiche al comportamento che potrebbero essere più dettagliate, consulta la guida sui comportamenti TF1.x e TF2 per conoscere le altre modifiche al comportamento e come adattarti ad esse . Controlla anche la creazione di nuovi livelli e modelli tramite la guida alle sottoclassi per i dettagli.

Convalidare i risultati

Consulta la guida alla convalida del modello per strumenti semplici e indicazioni su come verificare (numericamente) che il tuo modello si comporti correttamente quando è abilitata l'esecuzione impaziente. Potresti trovarlo particolarmente utile se abbinato alla guida alla mappatura del modello .

Aggiornamento della formazione, valutazione e codice di importazione/esportazione

I cicli di training TF1.x creati con tf.estimator.Estimator in stile v1.Session e altri approcci basati su raccolte non sono compatibili con i nuovi comportamenti di TF2. È importante eseguire la migrazione di tutto il codice di training TF1.x poiché la combinazione con il codice TF2 può causare comportamenti imprevisti.

Puoi scegliere tra diverse strategie per farlo.

L'approccio di livello più alto consiste nell'utilizzare tf.keras . Le funzioni di alto livello in Keras gestiscono molti dettagli di basso livello che potrebbero essere facili da perdere se si scrive il proprio ciclo di allenamento. Ad esempio, raccolgono automaticamente le perdite di regolarizzazione e impostano l'argomento training=True quando chiamano il modello.

Fare riferimento alla guida alla migrazione di Estimator per informazioni su come eseguire la migrazione del codice tf.estimator.Estimator per utilizzare i cicli di formazione vanilla e tf.keras personalizzati .

I cicli di addestramento personalizzati ti offrono un controllo più preciso sul tuo modello, ad esempio monitorando i pesi dei singoli strati. Leggi la guida sulla creazione di cicli di formazione da zero per scoprire come utilizzare tf.GradientTape per recuperare i pesi del modello e utilizzarli per aggiornare il modello.

Converti gli ottimizzatori TF1.x in ottimizzatori Keras

Gli ottimizzatori in tf.compat.v1.train , come l' ottimizzatore Adam e l' ottimizzatore della discesa del gradiente , hanno equivalenti in tf.keras.optimizers .

La tabella seguente riassume come convertire questi ottimizzatori legacy nei loro equivalenti Keras. È possibile sostituire direttamente la versione TF1.x con la versione TF2 a meno che non siano necessari passaggi aggiuntivi (come l'aggiornamento della velocità di apprendimento predefinita ).

Tieni presente che la conversione degli ottimizzatori potrebbe rendere incompatibili i vecchi checkpoint .

TF1.x TF2 Ulteriori passaggi
"tf.v1.train.GradientDescentOptimizer". tf.keras.optimizers.SGD Nessuno
"tf.v1.train.MomentumOptimizer". tf.keras.optimizers.SGD Includi l'argomento "slancio".
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Rinomina gli argomenti "beta1" e "beta2" in "beta_1" e "beta_2"
"tf.v1.train.RMSPropOptimizer". tf.keras.optimizers.RMSprop Rinominare l'argomento "decay" in "rho".
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Nessuno
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Nessuno
"tf.v1.train.FtrlOptimizer". tf.keras.optimizers.Ftrl Rimuovi gli argomenti "accum_name" e "linear_name".
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Rinominare gli argomenti "beta1" e "beta2" in "beta_1" e "beta_2"
`tf.contrib.Nadam` tf.keras.optimizers.Nadam Rinominare gli argomenti "beta1" e "beta2" in "beta_1" e "beta_2"

Aggiorna le pipeline di input dei dati

Esistono molti modi per fornire dati a un modello tf.keras . Accetteranno generatori Python e array Numpy come input.

Il modo consigliato per fornire dati a un modello è utilizzare il pacchetto tf.data , che contiene una raccolta di classi ad alte prestazioni per la manipolazione dei dati. I dataset appartenenti a tf.data sono efficienti, espressivi e si integrano bene con TF2.

Possono essere passati direttamente al metodo tf.keras.Model.fit .

model.fit(dataset, epochs=5)

Possono essere iterati direttamente su Python standard:

for example_batch, label_batch in dataset:
    break

Se stai ancora utilizzando tf.queue , questi ora sono supportati solo come strutture dati, non come pipeline di input.

Dovresti anche eseguire la migrazione di tutto il codice di preelaborazione delle funzionalità che utilizza tf.feature_columns . Leggi la guida alla migrazione per maggiori dettagli.

Salvataggio e caricamento dei modelli

TF2 utilizza checkpoint basati su oggetti. Leggi la guida alla migrazione dei checkpoint per ulteriori informazioni sulla migrazione dai checkpoint TF1.x basati sul nome. Leggi anche la guida ai checkpoint nella documentazione principale di TensorFlow.

Non esistono problemi di compatibilità significativi per i modelli salvati. Leggi la guida SavedModel per ulteriori informazioni sulla migrazione di SavedModel da TF1.x a TF2. Generalmente,

  • TF1.x save_models funziona in TF2.
  • TF2 save_models funziona in TF1.x se tutte le operazioni sono supportate.

Fare riferimento anche alla sezione GraphDef nella guida alla migrazione SavedModel per ulteriori informazioni sull'utilizzo degli oggetti Graph.pb e Graph.pbtxt .

(Facoltativo) Migrazione dei simboli tf.compat.v1

Il modulo tf.compat.v1 contiene l'API TF1.x completa, con la sua semantica originale.

Anche dopo aver seguito i passaggi precedenti e aver ottenuto un codice completamente compatibile con tutti i comportamenti TF2, è probabile che vengano menzionate molte API compat.v1 che risultano compatibili con TF2. Dovresti evitare di utilizzare queste API legacy compat.v1 per qualsiasi nuovo codice che scrivi, anche se continueranno a funzionare per il tuo codice già scritto.

Tuttavia, puoi scegliere di migrare gli utilizzi esistenti su API TF2 non legacy. Le docstring dei singoli simboli compat.v1 spiegheranno spesso come migrarli su API TF2 non legacy. Inoltre, anche la sezione della guida alla mappatura dei modelli sulla migrazione incrementale alle API TF2 idiomatiche può essere d'aiuto.

Risorse e ulteriori letture

Come accennato in precedenza, è buona norma migrare tutto il codice TF1.x su TF2. Leggi le guide nella sezione Migrazione a TF2 della guida TensorFlow per saperne di più.

,

TensorFlow 2 è fondamentalmente diverso da TF1.x in diversi modi. Puoi comunque eseguire codice TF1.x non modificato ( ad eccezione di contrib ) su installazioni binarie TF2 in questo modo:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

Tuttavia, questo non esegue comportamenti e API TF2 e potrebbe non funzionare come previsto con il codice scritto per TF2. Se non stai eseguendo i comportamenti TF2 attivi, stai effettivamente eseguendo TF1.x sopra un'installazione TF2. Leggi la guida ai comportamenti TF1 e TF2 per maggiori dettagli su come TF2 è diverso da TF1.x.

Questa guida fornisce una panoramica del processo di migrazione del codice TF1.x su TF2. Ciò ti consente di trarre vantaggio dai miglioramenti delle funzionalità nuovi e futuri e anche di rendere il tuo codice più semplice, più performante e più facile da mantenere.

Se stai utilizzando le API di alto livello di tf.keras e ti alleni esclusivamente con model.fit , il tuo codice dovrebbe essere più o meno completamente compatibile con TF2 ad eccezione dei seguenti avvertimenti:

Processo di migrazione TF2

Prima della migrazione, scopri il comportamento e le differenze API tra TF1.x e TF2 leggendo la guida .

  1. Esegui lo script automatizzato per convertire parte dell'utilizzo dell'API TF1.x in tf.compat.v1 .
  2. Rimuovi i vecchi simboli tf.contrib (controlla TF Addons e TF-Slim ).
  3. Fai in modo che i passaggi forward del tuo modello TF1.x vengano eseguiti in TF2 con l'esecuzione entusiasta abilitata.
  4. Aggiorna il tuo codice TF1.x per i cicli di addestramento e il salvataggio/caricamento dei modelli sugli equivalenti TF2.
  5. (Facoltativo) Migra le tue API tf.compat.v1 compatibili con TF2 alle API TF2 idiomatiche.

Le sezioni seguenti espandono i passaggi sopra descritti.

Esegui lo script di conversione dei simboli

Questo esegue un passaggio iniziale alla riscrittura dei simboli del codice per l'esecuzione con i binari TF 2.x, ma non renderà il codice idiomatico per TF 2.x né renderà automaticamente il codice compatibile con i comportamenti TF2.

Molto probabilmente il tuo codice utilizzerà ancora gli endpoint tf.compat.v1 per accedere a segnaposto, sessioni, raccolte e altre funzionalità in stile TF1.x.

Leggi la guida per saperne di più sulle migliori pratiche per l'utilizzo dello script di conversione dei simboli.

Rimuovere l'utilizzo di tf.contrib

Il modulo tf.contrib è stato disattivato e molti dei suoi sottomoduli sono stati integrati nell'API TF2 principale. Gli altri sottomoduli vengono ora scorporati in altri progetti come TF IO e TF Addons .

Una grande quantità di codice TF1.x precedente utilizza la libreria Slim , che era inclusa in TF1.x come tf.contrib.layers . Durante la migrazione del codice Slim su TF2, cambia gli utilizzi dell'API Slim in modo che puntino al pacchetto pip tf-slim . Quindi, leggi la guida alla mappatura del modello per sapere come convertire il codice Slim.

In alternativa, se utilizzi modelli Slim pre-addestrati, potresti provare i modelli pre-addestrati di Keras da tf.keras.applications o TF2 SavedModel di TF Hub esportati dal codice Slim originale.

Fai in modo che i passaggi forward del modello TF1.x vengano eseguiti con i comportamenti TF2 abilitati

Tieni traccia delle variabili e delle perdite

TF2 non supporta le raccolte globali.

L'esecuzione anticipata in TF2 non supporta le API basate su raccolta tf.Graph . Ciò influisce sul modo in cui costruisci e tieni traccia delle variabili.

Per il nuovo codice TF2 utilizzeresti tf.Variable invece di v1.get_variable e utilizzeresti oggetti Python per raccogliere e tenere traccia delle variabili invece di tf.compat.v1.variable_scope . In genere questo sarebbe uno dei seguenti:

Elenchi aggregati di variabili (come tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ) con gli attributi .variables e .trainable_variables degli oggetti Layer , Module o Model .

Le classi Layer e Model implementano diverse altre proprietà che eliminano la necessità di raccolte globali. La loro proprietà .losses può sostituire l'utilizzo della raccolta tf.GraphKeys.LOSSES .

Leggi la guida alla mappatura dei modelli per saperne di più sull'utilizzo degli spessori di modellazione del codice TF2 per incorporare il codice esistente basato get_variable e variable_scope all'interno di Layers , Models e Modules . Ciò ti consentirà di eseguire passaggi in avanti con l'esecuzione entusiasta abilitata senza importanti riscritture.

Adattarsi ad altri cambiamenti di comportamento

Se la guida alla mappatura del modello da sola non è sufficiente per far sì che il tuo modello esegua altre modifiche al comportamento che potrebbero essere più dettagliate, consulta la guida sui comportamenti TF1.x e TF2 per conoscere le altre modifiche al comportamento e come adattarti ad esse . Controlla anche la creazione di nuovi livelli e modelli tramite la guida alle sottoclassi per i dettagli.

Convalidare i risultati

Consulta la guida alla convalida del modello per strumenti semplici e indicazioni su come verificare (numericamente) che il tuo modello si comporti correttamente quando è abilitata l'esecuzione impaziente. Potresti trovarlo particolarmente utile se abbinato alla guida alla mappatura del modello .

Aggiornamento della formazione, valutazione e codice di importazione/esportazione

I cicli di training TF1.x creati con tf.estimator.Estimator in stile v1.Session e altri approcci basati su raccolte non sono compatibili con i nuovi comportamenti di TF2. È importante eseguire la migrazione di tutto il codice di training TF1.x poiché la combinazione con il codice TF2 può causare comportamenti imprevisti.

Puoi scegliere tra diverse strategie per farlo.

L'approccio di livello più alto consiste nell'utilizzare tf.keras . Le funzioni di alto livello in Keras gestiscono molti dettagli di basso livello che potrebbero essere facili da perdere se si scrive il proprio ciclo di allenamento. Ad esempio, raccolgono automaticamente le perdite di regolarizzazione e impostano l'argomento training=True quando chiamano il modello.

Fare riferimento alla guida alla migrazione di Estimator per informazioni su come eseguire la migrazione del codice tf.estimator.Estimator per utilizzare i cicli di formazione vanilla e tf.keras personalizzati .

I cicli di addestramento personalizzati ti offrono un controllo più preciso sul tuo modello, ad esempio monitorando i pesi dei singoli strati. Leggi la guida sulla creazione di cicli di formazione da zero per scoprire come utilizzare tf.GradientTape per recuperare i pesi del modello e utilizzarli per aggiornare il modello.

Converti gli ottimizzatori TF1.x in ottimizzatori Keras

Gli ottimizzatori in tf.compat.v1.train , come l' ottimizzatore Adam e l' ottimizzatore della discesa del gradiente , hanno equivalenti in tf.keras.optimizers .

La tabella seguente riassume come convertire questi ottimizzatori legacy nei loro equivalenti Keras. È possibile sostituire direttamente la versione TF1.x con la versione TF2 a meno che non siano necessari passaggi aggiuntivi (come l'aggiornamento della velocità di apprendimento predefinita ).

Tieni presente che la conversione degli ottimizzatori potrebbe rendere incompatibili i vecchi checkpoint .

TF1.x TF2 Ulteriori passaggi
"tf.v1.train.GradientDescentOptimizer". tf.keras.optimizers.SGD Nessuno
"tf.v1.train.MomentumOptimizer". tf.keras.optimizers.SGD Includi l'argomento "slancio".
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Rinomina gli argomenti "beta1" e "beta2" in "beta_1" e "beta_2"
"tf.v1.train.RMSPropOptimizer". tf.keras.optimizers.RMSprop Rinominare l'argomento "decay" in "rho".
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Nessuno
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Nessuno
"tf.v1.train.FtrlOptimizer". tf.keras.optimizers.Ftrl Rimuovi gli argomenti "accum_name" e "linear_name".
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Rinominare gli argomenti "beta1" e "beta2" in "beta_1" e "beta_2"
`tf.contrib.Nadam` tf.keras.optimizers.Nadam Rinominare gli argomenti "beta1" e "beta2" in "beta_1" e "beta_2"

Aggiorna le pipeline di input dei dati

Esistono molti modi per fornire dati a un modello tf.keras . Accetteranno generatori Python e array Numpy come input.

Il modo consigliato per fornire dati a un modello è utilizzare il pacchetto tf.data , che contiene una raccolta di classi ad alte prestazioni per la manipolazione dei dati. I dataset appartenenti a tf.data sono efficienti, espressivi e si integrano bene con TF2.

Possono essere passati direttamente al metodo tf.keras.Model.fit .

model.fit(dataset, epochs=5)

Possono essere iterati direttamente su Python standard:

for example_batch, label_batch in dataset:
    break

Se stai ancora utilizzando tf.queue , questi ora sono supportati solo come strutture dati, non come pipeline di input.

Dovresti anche eseguire la migrazione di tutto il codice di preelaborazione delle funzionalità che utilizza tf.feature_columns . Leggi la guida alla migrazione per maggiori dettagli.

Salvataggio e caricamento dei modelli

TF2 utilizza checkpoint basati su oggetti. Leggi la guida alla migrazione dei checkpoint per ulteriori informazioni sulla migrazione dai checkpoint TF1.x basati sul nome. Leggi anche la guida ai checkpoint nella documentazione principale di TensorFlow.

Non esistono problemi di compatibilità significativi per i modelli salvati. Leggi la guida SavedModel per ulteriori informazioni sulla migrazione di SavedModel da TF1.x a TF2. Generalmente,

  • TF1.x save_models funziona in TF2.
  • TF2 save_models funziona in TF1.x se tutte le operazioni sono supportate.

Fare riferimento anche alla sezione GraphDef nella guida alla migrazione SavedModel per ulteriori informazioni sull'utilizzo degli oggetti Graph.pb e Graph.pbtxt .

(Facoltativo) Migrazione dei simboli tf.compat.v1

Il modulo tf.compat.v1 contiene l'API TF1.x completa, con la sua semantica originale.

Anche dopo aver seguito i passaggi precedenti e aver ottenuto un codice completamente compatibile con tutti i comportamenti TF2, è probabile che vengano menzionate molte API compat.v1 che risultano compatibili con TF2. Dovresti evitare di utilizzare queste API legacy compat.v1 per qualsiasi nuovo codice che scrivi, anche se continueranno a funzionare per il tuo codice già scritto.

Tuttavia, puoi scegliere di migrare gli utilizzi esistenti su API TF2 non legacy. Le docstring dei singoli simboli compat.v1 spiegheranno spesso come migrarli su API TF2 non legacy. Inoltre, anche la sezione della guida alla mappatura dei modelli sulla migrazione incrementale alle API TF2 idiomatiche può essere d'aiuto.

Risorse e ulteriori letture

Come accennato in precedenza, è buona norma migrare tutto il codice TF1.x su TF2. Leggi le guide nella sezione Migrazione a TF2 della guida TensorFlow per saperne di più.