TF1.x -> Ikhtisar migrasi TF2

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:

Proses migrasi TF2

Sebelum bermigrasi, pelajari perilaku dan perbedaan API antara TF1.x dan TF2 dengan membaca panduan .

  1. Jalankan skrip otomatis untuk mengonversi sebagian penggunaan API TF1.x Anda menjadi tf.compat.v1 .
  2. Hapus simbol tf.contrib lama (periksa TF Addons dan TF-Slim ).
  3. Jadikan penerusan model TF1.x Anda berjalan di TF2 dengan eksekusi bersemangat diaktifkan.
  4. Tingkatkan kode TF1.x Anda untuk loop pelatihan dan model penyimpanan/pemuatan ke setara TF2.
  5. (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. Secara umum,

  • 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.

,

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:

Proses migrasi TF2

Sebelum bermigrasi, pelajari perilaku dan perbedaan API antara TF1.x dan TF2 dengan membaca panduan .

  1. Jalankan skrip otomatis untuk mengonversi sebagian penggunaan API TF1.x Anda menjadi tf.compat.v1 .
  2. Hapus simbol tf.contrib lama (periksa TF Addons dan TF-Slim ).
  3. Jadikan penerusan model TF1.x Anda berjalan di TF2 dengan eksekusi bersemangat diaktifkan.
  4. Tingkatkan kode TF1.x Anda untuk loop pelatihan dan model penyimpanan/pemuatan ke setara TF2.
  5. (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. Secara umum,

  • 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.