TensorFlow 2 zasadniczo różni się od TF1.x pod kilkoma względami. Nadal możesz uruchamiać niezmodyfikowany kod TF1.x ( z wyjątkiem contrib ) w przypadku instalacji binarnych TF2 w następujący sposób:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
Nie jest to jednak działanie polegające na uruchamianiu zachowań i interfejsów API TF2 i może nie działać zgodnie z oczekiwaniami z kodem napisanym dla TF2. Jeśli nie używasz aktywnych zachowań TF2, w rzeczywistości uruchamiasz TF1.x na instalacji TF2. Przeczytaj przewodnik dotyczący zachowań TF1 i TF2, aby uzyskać więcej szczegółów na temat tego, czym TF2 różni się od TF1.x.
Ten przewodnik zawiera przegląd procesu migracji kodu TF1.x do TF2. Dzięki temu możesz korzystać z nowych i przyszłych ulepszeń funkcji, a także sprawić, że Twój kod będzie prostszy, wydajniejszy i łatwiejszy w utrzymaniu.
Jeśli używasz wysokiego poziomu API tf.keras
i trenujesz wyłącznie z model.fit
, Twój kod powinien być mniej więcej w pełni kompatybilny z TF2, z wyjątkiem następujących zastrzeżeń:
- TF2 ma nowe domyślne współczynniki uczenia się dla optymalizatorów Keras.
- TF2 mógł zmienić „nazwę”, pod którą logowane są metryki.
Proces migracji TF2
Przed migracją poznaj różnice w zachowaniu i interfejsach API pomiędzy TF1.x i TF2, czytając przewodnik .
- Uruchom automatyczny skrypt, aby przekonwertować część użycia interfejsu API TF1.x na
tf.compat.v1
. - Usuń stare symbole
tf.contrib
(sprawdź TF Addons i TF-Slim ). - Spraw, aby Twoje przebiegi do przodu modelu TF1.x działały w TF2 z włączoną opcją szybkiego wykonywania.
- Zaktualizuj swój kod TF1.x do pętli szkoleniowych i zapisywania/ładowania modeli do odpowiedników TF2.
- (Opcjonalnie) Przeprowadź migrację interfejsów API
tf.compat.v1
zgodnych z TF2 do idiomatycznych interfejsów API TF2.
Poniższe sekcje stanowią rozwinięcie kroków opisanych powyżej.
Uruchom skrypt konwersji symboli
Wykonuje to początkowy przebieg podczas przepisywania symboli kodu, aby działały z plikami binarnymi TF 2.x, ale nie sprawi, że Twój kod będzie idiomatyczny z TF 2.x, ani nie sprawi, że Twój kod będzie automatycznie kompatybilny z zachowaniami TF2.
Twój kod najprawdopodobniej nadal będzie korzystał z punktów końcowych tf.compat.v1
w celu uzyskania dostępu do symboli zastępczych, sesji, kolekcji i innych funkcji w stylu TF1.x.
Przeczytaj przewodnik , aby dowiedzieć się więcej o najlepszych praktykach korzystania ze skryptu konwersji symboli.
Usuń użycie tf.contrib
Moduł tf.contrib
został wycofany, a kilka jego podmodułów zostało zintegrowanych z rdzeniem API TF2. Pozostałe podmoduły zostały teraz wydzielone do innych projektów, takich jak TF IO i TF Addons .
Duża część starszego kodu TF1.x korzysta z biblioteki Slim , która została spakowana z TF1.x jako tf.contrib.layers
. Podczas migracji kodu Slim do TF2 zmień użycie API Slim tak, aby wskazywało pakiet pip tf-slim . Następnie przeczytaj przewodnik mapowania modeli , aby dowiedzieć się, jak przekonwertować kod Slim.
Alternatywnie, jeśli używasz wstępnie wytrenowanych modeli Slim, możesz rozważyć wypróbowanie wstępnie przeszkolonych modeli Keras z tf.keras.applications
lub TF Hub TF Hub TF2 SavedModel
wyeksportowanych z oryginalnego kodu Slim.
Spraw, aby przebiegi do przodu modelu TF1.x były uruchamiane z włączonymi zachowaniami TF2
Śledź zmienne i straty
TF2 nie obsługuje kolekcji globalnych.
Wykonanie Eager w TF2 nie obsługuje interfejsów API opartych na kolekcji tf.Graph
. Ma to wpływ na sposób konstruowania i śledzenia zmiennych.
W przypadku nowego kodu TF2 należy użyć tf.Variable
zamiast v1.get_variable
i użyć obiektów Pythona do zbierania i śledzenia zmiennych zamiast tf.compat.v1.variable_scope
. Zwykle będzie to jeden z:
Agreguj listy zmiennych (np. tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
) z atrybutami .variables
i .trainable_variables
obiektów Layer
, Module
lub Model
.
Klasy Layer
i Model
implementują kilka innych właściwości, które eliminują potrzebę kolekcji globalnych. Ich właściwość .losses
może zastąpić użycie kolekcji tf.GraphKeys.LOSSES
.
Przeczytaj przewodnik mapowania modeli , aby dowiedzieć się więcej na temat używania podkładek modelujących kod TF2 do osadzania istniejącego kodu opartego get_variable
i variable_scope
wewnątrz Layers
, Models
i Modules
. Umożliwi to wykonywanie przejść do przodu z włączoną opcją szybkiego wykonywania bez większych przeróbek.
Dostosowanie się do innych zmian w zachowaniu
Jeśli sam przewodnik mapowania modelu jest niewystarczający, aby umożliwić przekazanie modelu do przodu z innymi zmianami zachowania, które mogą być bardziej szczegółowe, zobacz przewodnik dotyczący zachowań TF1.x i TF2, aby dowiedzieć się o innych zmianach zachowania i sposobach dostosowania się do nich . Aby uzyskać szczegółowe informacje, sprawdź także tworzenie nowych warstw i modeli za pośrednictwem przewodnika po podklasach .
Walidacja wyników
Zobacz przewodnik po sprawdzaniu poprawności modelu , aby uzyskać proste narzędzia i wskazówki dotyczące sposobu (numerycznego) sprawdzenia, czy model zachowuje się poprawnie, gdy włączone jest szybkie wykonywanie. Może się to okazać szczególnie przydatne w połączeniu z przewodnikiem mapowania modelu .
Uaktualnij szkolenie, ocenę i kod importu/eksportu
Pętle szkoleniowe TF1.x zbudowane w stylu v1.Session
tf.estimator.Estimator
s i inne podejścia oparte na kolekcjach nie są kompatybilne z nowymi zachowaniami TF2. Ważne jest, aby przeprowadzić migrację całego kodu szkoleniowego TF1.x, ponieważ połączenie go z kodem TF2 może spowodować nieoczekiwane zachowania.
Aby to zrobić, możesz wybrać jedną z kilku strategii.
Podejście najwyższego poziomu polega na użyciu tf.keras
. Funkcje wysokiego poziomu w Keras zarządzają wieloma szczegółami niskiego poziomu, które można łatwo przeoczyć, jeśli napiszesz własną pętlę treningową. Na przykład automatycznie zbierają straty regularyzacyjne i ustawiają argument training=True
podczas wywoływania modelu.
Zapoznaj się z przewodnikiem po migracji narzędzia Estimator , aby dowiedzieć się, jak przeprowadzić migrację kodu programu tf.estimator.Estimator
w celu korzystania z standardowych i niestandardowych pętli szkoleniowych tf.keras
.
Niestandardowe pętle treningowe zapewniają lepszą kontrolę nad modelem, na przykład śledzenie ciężarów poszczególnych warstw. Przeczytaj przewodnik dotyczący budowania pętli treningowych od podstaw , aby dowiedzieć się, jak używać tf.GradientTape
do pobierania wag modeli i używania ich do aktualizacji modelu.
Konwertuj optymalizatory TF1.x na optymalizatory Keras
Optymalizatory w tf.compat.v1.train
, takie jak optymalizator Adama i optymalizator gradientu , mają swoje odpowiedniki w tf.keras.optimizers
.
Poniższa tabela podsumowuje sposób konwersji starszych optymalizatorów na ich odpowiedniki w Keras. Możesz bezpośrednio zastąpić wersję TF1.x wersją TF2, chyba że wymagane są dodatkowe kroki (takie jak aktualizacja domyślnej szybkości uczenia ).
Pamiętaj, że konwersja optymalizatorów może spowodować, że stare punkty kontrolne będą niekompatybilne .
TF1.x | TF2 | Dodatkowe kroki |
---|---|---|
`tf.v1.train.GradientDescentOptimizer` | tf.keras.optimizers.SGD | Nic |
`tf.v1.train.MomentumOptimizer` | tf.keras.optimizers.SGD | Dołącz argument „pędu”. |
`tf.v1.train.AdamOptimizer` | tf.keras.optimizers.Adam | Zmień nazwę argumentów `beta1` i `beta2` na `beta_1` i `beta_2` |
`tf.v1.train.RMSPropOptimizer` | tf.keras.optimizers.RMSprop | Zmień nazwę argumentu „rozpad” na „rho”. |
`tf.v1.train.AdadeltaOptimizer` | tf.keras.optimizers.Adadelta | Nic |
`tf.v1.train.AdagradOptimizer` | tf.keras.optimizers.Adagrad | Nic |
`tf.v1.train.FtrlOptimizer` | tf.keras.optimizers.Ftrl | Usuń argumenty „nazwa_akumulatora” i „nazwa_liniowa”. |
`tf.contrib.AdamaxOptimizer` | tf.keras.optimizers.Adamax | Zmień nazwę argumentów `beta1` i `beta2` na `beta_1` i `beta_2` |
`tf.contrib.Nadam` | tf.keras.optimizers.Nadam | Zmień nazwę argumentów `beta1` i `beta2` na `beta_1` i `beta_2` |
Uaktualnij potoki wprowadzania danych
Istnieje wiele sposobów dostarczania danych do modelu tf.keras
. Jako dane wejściowe przyjmą generatory Pythona i tablice Numpy.
Zalecanym sposobem dostarczania danych do modelu jest użycie pakietu tf.data
, który zawiera zbiór klas o wysokiej wydajności do manipulowania danymi. dataset
należące do tf.data
są wydajne, wyraziste i dobrze integrują się z TF2.
Można je przekazać bezpośrednio do metody tf.keras.Model.fit
.
model.fit(dataset, epochs=5)
Można je iterować bezpośrednio w standardowym Pythonie:
for example_batch, label_batch in dataset:
break
Jeśli nadal używasz tf.queue
, są one teraz obsługiwane tylko jako struktury danych, a nie jako potoki wejściowe.
Powinieneś także przeprowadzić migrację całego kodu przetwarzania wstępnego funkcji, który używa tf.feature_columns
. Więcej szczegółów znajdziesz w przewodniku po migracji .
Zapisywanie i ładowanie modeli
TF2 wykorzystuje punkty kontrolne oparte na obiektach. Przeczytaj przewodnik dotyczący migracji punktów kontrolnych , aby dowiedzieć się więcej na temat migracji poza punktami kontrolnymi TF1.x opartymi na nazwach. Przeczytaj także przewodnik po punktach kontrolnych w podstawowej dokumentacji TensorFlow.
Nie ma znaczących problemów ze zgodnością zapisanych modeli. Przeczytaj przewodnik SavedModel
, aby uzyskać więcej informacji na temat migracji SavedModel
s z TF1.x do TF2. Zazwyczaj,
- TF1.x zapisane_modele działają w TF2.
- Zapisane modele TF2 działają w TF1.x, jeśli obsługiwane są wszystkie operacje.
Więcej informacji na temat pracy z obiektami Graph.pb
i Graph.pbtxt
można znaleźć w sekcji GraphDef
w przewodniku migracji SavedModel
.
(Opcjonalnie) Przeprowadź migrację poza symbolami tf.compat.v1
Moduł tf.compat.v1
zawiera kompletne API TF1.x z jego oryginalną semantyką.
Nawet po wykonaniu powyższych kroków i uzyskaniu kodu w pełni kompatybilnego ze wszystkimi zachowaniami TF2, prawdopodobnie będzie wiele wzmianek o api compat.v1
, które tak się składa, że są kompatybilne z TF2. Powinieneś unikać używania starszych interfejsów API compat.v1
do każdego nowego kodu, który piszesz, chociaż będą one nadal działać z już napisanym kodem.
Możesz jednak zdecydować się na migrację istniejących zastosowań do innych niż starsze interfejsów API TF2. Dokumentacja poszczególnych symboli compat.v1
często wyjaśnia, jak przeprowadzić ich migrację do innych niż starsze interfejsów API TF2. Dodatkowo może w tym pomóc sekcja przewodnika mapowania modeli dotycząca przyrostowej migracji do idiomatycznych interfejsów API TF2 .
Zasoby i dalsza lektura
Jak wspomniano wcześniej, dobrą praktyką jest migracja całego kodu TF1.x do TF2. Przeczytaj przewodniki w sekcji Migracja do TF2 w przewodniku TensorFlow, aby dowiedzieć się więcej.