TensorFlow 2 pada dasarnya berbeda dari TF1.x dalam beberapa hal. Anda masih dapat menjalankan kode TF1.x yang tidak dimodifikasi ( kecuali contrib ) terhadap instalasi biner TF2 seperti:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
Namun, ini tidak menjalankan perilaku dan API TF2, dan mungkin tidak berfungsi seperti yang diharapkan dengan kode yang ditulis untuk TF2. Jika Anda tidak menjalankan dengan perilaku TF2 aktif, Anda secara efektif menjalankan TF1.x di atas instalasi TF2. Baca panduan perilaku TF1 vs TF2 untuk detail selengkapnya tentang perbedaan TF2 dari TF1.x.
Panduan ini memberikan gambaran umum tentang proses migrasi kode TF1.x Anda ke TF2. Hal ini memungkinkan Anda memanfaatkan penyempurnaan fitur baru dan masa depan serta membuat kode Anda lebih sederhana, lebih berperforma, dan lebih mudah dikelola.
Jika Anda menggunakan API tingkat tinggi tf.keras
dan berlatih secara eksklusif dengan model.fit
, kode Anda kurang lebih harus sepenuhnya kompatibel dengan TF2 kecuali untuk peringatan berikut:
- TF2 memiliki kecepatan pembelajaran default baru untuk pengoptimal Keras.
- TF2 mungkin telah mengubah "nama" yang digunakan untuk mencatat metrik.
Proses migrasi TF2
Sebelum bermigrasi, pelajari perilaku dan perbedaan API antara TF1.x dan TF2 dengan membaca panduan .
- Jalankan skrip otomatis untuk mengonversi sebagian penggunaan API TF1.x Anda menjadi
tf.compat.v1
. - Hapus simbol
tf.contrib
lama (periksa TF Addons dan TF-Slim ). - Jadikan penerusan model TF1.x Anda berjalan di TF2 dengan eksekusi bersemangat diaktifkan.
- Tingkatkan kode TF1.x Anda untuk loop pelatihan dan model penyimpanan/pemuatan ke setara TF2.
- (Opsional) Migrasikan API
tf.compat.v1
yang kompatibel dengan TF2 ke API TF2 idiomatik.
Bagian berikut ini memperluas langkah-langkah yang diuraikan di atas.
Jalankan skrip konversi simbol
Ini mengeksekusi langkah awal dalam menulis ulang simbol kode Anda untuk dijalankan terhadap biner TF 2.x, tetapi tidak akan membuat kode Anda idiomatis dengan TF 2.x dan juga tidak akan secara otomatis membuat kode Anda kompatibel dengan perilaku TF2.
Kode Anda kemungkinan besar masih menggunakan titik akhir tf.compat.v1
untuk mengakses placeholder, sesi, koleksi, dan fungsionalitas gaya TF1.x lainnya.
Baca panduan untuk mengetahui lebih lanjut tentang praktik terbaik dalam menggunakan skrip konversi simbol.
Hapus penggunaan tf.contrib
Modul tf.contrib
telah dihentikan dan beberapa submodulnya telah diintegrasikan ke dalam API TF2 inti. Submodul lainnya sekarang dipisahkan menjadi proyek lain seperti TF IO dan TF Addons .
Sejumlah besar kode TF1.x lama menggunakan pustaka Slim , yang dikemas dengan TF1.x sebagai tf.contrib.layers
. Saat memigrasikan kode Slim Anda ke TF2, alihkan penggunaan Slim API Anda agar mengarah ke paket tf-slim pip . Kemudian, baca panduan pemetaan model untuk mempelajari cara mengonversi kode Slim.
Alternatifnya, jika Anda menggunakan model Slim yang telah dilatih sebelumnya, Anda dapat mempertimbangkan untuk mencoba model pra-traim Keras dari tf.keras.applications
atau TF2 SavedModel
dari TF Hub yang diekspor dari kode Slim asli.
Jadikan penerusan model TF1.x dijalankan dengan perilaku TF2 diaktifkan
Lacak variabel dan kerugian
TF2 tidak mendukung koleksi global.
Eksekusi yang bersemangat di TF2 tidak mendukung API berbasis koleksi tf.Graph
. Hal ini memengaruhi cara Anda membuat dan melacak variabel.
Untuk kode TF2 baru, Anda akan menggunakan tf.Variable
alih-alih v1.get_variable
dan menggunakan objek Python untuk mengumpulkan dan melacak variabel, bukan tf.compat.v1.variable_scope
. Biasanya ini adalah salah satu dari:
Gabungkan daftar variabel (seperti tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
) dengan atribut .variables
dan .trainable_variables
dari objek Layer
, Module
, atau Model
.
Kelas Layer
dan Model
mengimplementasikan beberapa properti lain yang menghilangkan kebutuhan akan koleksi global. Properti .losses
dapat menjadi pengganti penggunaan koleksi tf.GraphKeys.LOSSES
.
Baca panduan pemetaan model untuk mengetahui lebih lanjut tentang penggunaan shim pemodelan kode TF2 untuk menyematkan kode berbasis get_variable
dan variable_scope
yang ada di dalam Layers
, Models
, dan Modules
. Ini akan memungkinkan Anda mengeksekusi penerusan dengan eksekusi bersemangat yang diaktifkan tanpa penulisan ulang besar-besaran.
Beradaptasi dengan perubahan perilaku lainnya
Jika panduan pemetaan model saja tidak cukup untuk membuat model Anda dapat menjalankan perubahan perilaku lain yang mungkin lebih detail, lihat panduan tentang perilaku TF1.x vs TF2 untuk mempelajari tentang perubahan perilaku lainnya dan bagaimana Anda dapat beradaptasi dengannya. . Lihat juga pembuatan Lapisan dan Model baru melalui panduan subkelas untuk detailnya.
Memvalidasi hasil Anda
Lihat panduan validasi model untuk alat dan panduan mudah tentang bagaimana Anda dapat (secara numerik) memvalidasi bahwa model Anda berperilaku dengan benar ketika eksekusi bersemangat diaktifkan. Anda mungkin menemukan ini sangat berguna bila dipasangkan dengan panduan pemetaan model .
Tingkatkan pelatihan, evaluasi, dan kode impor/ekspor
Loop pelatihan TF1.x yang dibuat dengan gaya v1.Session
tf.estimator.Estimator
dan pendekatan berbasis koleksi lainnya tidak kompatibel dengan perilaku baru TF2. Penting bagi Anda untuk memigrasikan semua kode pelatihan TF1.x karena menggabungkannya dengan kode TF2 dapat menyebabkan perilaku yang tidak terduga.
Anda dapat memilih dari beberapa strategi untuk melakukan hal ini.
Pendekatan tingkat tertinggi adalah dengan menggunakan tf.keras
. Fungsi tingkat tinggi di Keras mengelola banyak detail tingkat rendah yang mungkin mudah terlewatkan jika Anda menulis loop pelatihan Anda sendiri. Misalnya, mereka secara otomatis mengumpulkan kerugian regularisasi, dan menyetel argumen training=True
saat memanggil model.
Lihat panduan migrasi Estimator untuk mempelajari bagaimana Anda dapat memigrasikan kode tf.estimator.Estimator
untuk menggunakan loop pelatihan vanilla dan tf.keras
khusus .
Loop pelatihan khusus memberi Anda kontrol yang lebih baik terhadap model Anda seperti melacak bobot masing-masing lapisan. Baca panduan membuat loop pelatihan dari awal untuk mempelajari cara menggunakan tf.GradientTape
untuk mengambil bobot model dan menggunakannya untuk memperbarui model.
Ubah pengoptimal TF1.x menjadi pengoptimal Keras
Pengoptimal di tf.compat.v1.train
, seperti pengoptimal Adam dan pengoptimal penurunan gradien , memiliki persamaan di tf.keras.optimizers
.
Tabel di bawah ini merangkum bagaimana Anda dapat mengonversi pengoptimal lama ini ke padanan Kerasnya. Anda dapat langsung mengganti versi TF1.x dengan versi TF2 kecuali diperlukan langkah tambahan (seperti memperbarui kecepatan pemelajaran default ).
Perhatikan bahwa mengonversi pengoptimal Anda mungkin membuat pos pemeriksaan lama menjadi tidak kompatibel .
TF1.x | TF2 | Langkah tambahan |
---|---|---|
`tf.v1.train.GradientDescentOptimizer` | tf.keras.optimizers.SGD | Tidak ada |
`tf.v1.train.MomentumOptimizer` | tf.keras.optimizers.SGD | Sertakan argumen `momentum` |
`tf.v1.train.AdamOptimizer` | tf.keras.optimizers.Adam | Ganti nama argumen `beta1` dan `beta2` menjadi `beta_1` dan `beta_2` |
`tf.v1.train.RMSPopOptimizer` | tf.keras.optimizers.RMSprop | Ganti nama argumen `pembusukan` menjadi `rho` |
`tf.v1.train.AdadeltaOptimizer` | tf.keras.optimizers.Adadelta | Tidak ada |
`tf.v1.train.AdagradOptimizer` | tf.keras.optimizers.Adagrad | Tidak ada |
`tf.v1.train.FtrlOptimizer` | tf.keras.optimizers.Ftrl | Hapus argumen `accum_name` dan `linear_name` |
`tf.contrib.AdamaxOptimizer` | tf.keras.optimizers.Adamax | Ganti nama argumen `beta1` dan `beta2` menjadi `beta_1` dan `beta_2` |
`tf.contrib.Nadam` | tf.keras.optimizers.Nadam | Ganti nama argumen `beta1` dan `beta2` menjadi `beta_1` dan `beta_2` |
Tingkatkan jalur input data
Ada banyak cara untuk memasukkan data ke model tf.keras
. Mereka akan menerima generator Python dan array Numpy sebagai masukan.
Cara yang disarankan untuk memasukkan data ke model adalah dengan menggunakan paket tf.data
, yang berisi kumpulan kelas performa tinggi untuk memanipulasi data. dataset
milik tf.data
efisien, ekspresif, dan terintegrasi dengan baik dengan TF2.
Mereka dapat diteruskan langsung ke metode tf.keras.Model.fit
.
model.fit(dataset, epochs=5)
Mereka dapat diulangi secara langsung dengan Python standar:
for example_batch, label_batch in dataset:
break
Jika Anda masih menggunakan tf.queue
, ini sekarang hanya didukung sebagai struktur data, bukan sebagai saluran masukan.
Anda juga harus memigrasikan semua kode prapemrosesan fitur yang menggunakan tf.feature_columns
. Baca panduan migrasi untuk detail selengkapnya.
Menyimpan dan memuat model
TF2 menggunakan pos pemeriksaan berbasis objek. Baca panduan migrasi pos pemeriksaan untuk mempelajari lebih lanjut tentang migrasi dari pos pemeriksaan TF1.x berbasis nama. Baca juga panduan pos pemeriksaan di dokumen inti TensorFlow.
Tidak ada masalah kompatibilitas yang signifikan untuk model yang disimpan. Baca panduan SavedModel
untuk informasi lebih lanjut tentang migrasi SavedModel
s di TF1.x ke TF2. Umumnya,
- TF1.x save_models berfungsi di TF2.
- TF2 save_models berfungsi di TF1.x jika semua operasi didukung.
Lihat juga bagian GraphDef
dalam panduan migrasi SavedModel
untuk informasi lebih lanjut tentang bekerja dengan objek Graph.pb
dan Graph.pbtxt
.
(Opsional) Migrasikan simbol tf.compat.v1
Modul tf.compat.v1
berisi API TF1.x lengkap, dengan semantik aslinya.
Bahkan setelah mengikuti langkah-langkah di atas dan mendapatkan kode yang sepenuhnya kompatibel dengan semua perilaku TF2, kemungkinan besar ada banyak penyebutan api compat.v1
yang kompatibel dengan TF2. Anda sebaiknya menghindari penggunaan api compat.v1
lama ini untuk kode baru apa pun yang Anda tulis, meskipun api tersebut akan terus berfungsi untuk kode yang sudah Anda tulis.
Namun, Anda dapat memilih untuk memigrasikan penggunaan yang ada ke API TF2 non-lama. Dokumen dari masing-masing simbol compat.v1
sering kali menjelaskan cara memigrasikannya ke API TF2 non-lama. Selain itu, bagian panduan pemetaan model tentang migrasi tambahan ke API TF2 idiomatik juga dapat membantu dalam hal ini.
Sumber daya dan bacaan lebih lanjut
Seperti disebutkan sebelumnya, merupakan praktik yang baik untuk memigrasikan semua kode TF1.x Anda ke TF2. Baca panduan di bagian Migrasi ke TF2 pada panduan TensorFlow untuk mempelajari lebih lanjut.