Model Tersimpan yang Dapat Digunakan Kembali

Perkenalan

TensorFlow Hub menyediakan SavedModels untuk TensorFlow 2, di antara aset lainnya. SavedModels dapat dimuat kembali ke dalam program Python dengan obj = hub.load(url) [ pelajari lebih lanjut ]. obj yang dikembalikan adalah hasil dari tf.saved_model.load() (lihat panduan SavedModel TensorFlow). Objek ini dapat memiliki atribut apa pun yang berupa tf.functions, tf.Variables (diinisialisasi dari nilai pra-terlatihnya), sumber daya lain, dan secara rekursif, lebih banyak objek serupa.

Halaman ini menjelaskan antarmuka yang harus diimplementasikan oleh obj yang dimuat agar dapat digunakan kembali dalam program TensorFlow Python. SavedModel yang sesuai dengan antarmuka ini disebut Reusable SavedModel .

Penggunaan kembali berarti membangun model yang lebih besar di sekitar obj , termasuk kemampuan untuk melakukan fine-tuning. Fine-tuning berarti pelatihan lebih lanjut pada bobot dalam obj yang dimuat sebagai bagian dari model di sekitarnya. Fungsi kerugian dan pengoptimal ditentukan oleh model di sekitarnya; obj hanya mendefinisikan pemetaan input ke aktivasi output ("forward pass"), yang mungkin termasuk teknik seperti dropout atau normalisasi batch.

Tim TensorFlow Hub merekomendasikan implementasi antarmuka Reusable SavedModel di semua SavedModel yang dimaksudkan untuk digunakan kembali dalam pengertian di atas. Banyak utilitas dari pustaka tensorflow_hub , terutama hub.KerasLayer , mengharuskan SavedModel untuk mengimplementasikannya.

Hubungan dengan SignatureDefs

Antarmuka ini, dalam hal tf.functions dan fitur TF2 lainnya, terpisah dari tanda tangan SavedModel, yang telah tersedia sejak TF1 dan terus digunakan di TF2 untuk inferensi (seperti menerapkan SavedModel ke TF Serving atau TF Lite). Tanda tangan untuk inferensi tidak cukup ekspresif untuk mendukung fine-tuning, dan tf.function menyediakan API Python yang lebih alami dan ekspresif untuk model yang digunakan kembali.

Hubungan dengan perpustakaan pembuatan model

SavedModel yang dapat digunakan kembali hanya menggunakan primitif TensorFlow 2, terlepas dari pustaka pembuatan model tertentu seperti Keras atau Sonnet. Hal ini mempermudah penggunaan kembali di berbagai pustaka pembuatan model, tanpa ketergantungan pada kode pembuatan model asli.

Beberapa adaptasi akan diperlukan untuk memuat Reusable SavedModels ke dalam atau menyimpannya dari pustaka pembuatan model tertentu. Untuk Keras, hub.KerasLayer menyediakan pemuatan, dan penyimpanan bawaan Keras dalam format SavedModel telah dirancang ulang untuk TF2 dengan tujuan menyediakan superset dari antarmuka ini (lihat RFC dari Mei 2019).

Hubungan dengan "API SavedModel Umum" khusus tugas

Definisi antarmuka pada halaman ini memungkinkan sejumlah dan jenis input dan output apa pun. API SavedModel Umum untuk TF Hub menyempurnakan antarmuka umum ini dengan konvensi penggunaan untuk tugas-tugas spesifik agar model mudah dipertukarkan.

Definisi antarmuka

Atribut

SavedModel yang Dapat Digunakan Kembali adalah SavedModel TensorFlow 2 sedemikian rupa sehingga obj = tf.saved_model.load(...) mengembalikan objek yang memiliki atribut berikut

  • __call__ . Wajib. Sebuah tf.function yang mengimplementasikan komputasi model ("forward pass") sesuai dengan spesifikasi di bawah ini.

  • variables : Sebuah daftar objek tf.Variable, yang mencantumkan semua variabel yang digunakan oleh setiap kemungkinan pemanggilan __call__ , termasuk variabel yang dapat dilatih dan yang tidak dapat dilatih.

    Daftar ini dapat diabaikan jika kosong.

  • trainable_variables : Daftar objek tf.Variable sedemikian sehingga v.trainable bernilai true untuk semua elemennya. Variabel-variabel ini harus merupakan subset dari variables . Ini adalah variabel yang akan dilatih saat melakukan fine-tuning objek. Pembuat SavedModel dapat memilih untuk menghilangkan beberapa variabel di sini yang awalnya dapat dilatih untuk menunjukkan bahwa variabel-variabel ini tidak boleh dimodifikasi selama fine-tuning.

    Daftar ini dapat diabaikan jika kosong, khususnya jika SavedModel tidak mendukung fine-tuning.

  • regularization_losses : Daftar tf.functions, masing-masing menerima input nol dan mengembalikan tensor float skalar tunggal. Untuk fine-tuning, pengguna SavedModel disarankan untuk menyertakan ini sebagai istilah regularisasi tambahan ke dalam loss (dalam kasus paling sederhana tanpa penskalaan lebih lanjut). Biasanya, ini digunakan untuk merepresentasikan regularisasi bobot. (Karena kurangnya input, tf.functions ini tidak dapat mengekspresikan regularisasi aktivitas.)

    Daftar ini dapat diabaikan jika kosong, khususnya jika SavedModel tidak mendukung fine-tuning atau tidak ingin menetapkan regularisasi bobot.

Fungsi __call__

obj Restored SavedModel memiliki atribut obj.__call__ yang merupakan tf.function yang telah dipulihkan dan memungkinkan obj dipanggil sebagai berikut.

Sinopsis (kode semu):

outputs = obj(inputs, trainable=..., **kwargs)

Argumen

Argumen-argumennya adalah sebagai berikut.

  • Terdapat satu argumen posisional yang wajib ada pada sekumpulan aktivasi input dari SavedModel. Tipe argumen tersebut adalah salah satu dari

    • sebuah Tensor tunggal untuk satu input tunggal,
    • daftar Tensor untuk urutan input tak bernama yang terurut,
    • Sebuah kamus (dict) berisi tensor yang dikunci berdasarkan sekumpulan nama input tertentu.

    (Revisi antarmuka di masa mendatang mungkin memungkinkan nested yang lebih umum.) Pembuat SavedModel memilih salah satu dari itu dan bentuk tensor serta dtypes. Jika diperlukan, beberapa dimensi bentuk harus tidak ditentukan (terutama ukuran batch).

  • Mungkin ada argumen kata kunci opsional ` training yang menerima nilai boolean Python, True atau False . Nilai defaultnya adalah False . Jika model mendukung fine-tuning, dan jika komputasinya berbeda antara keduanya (misalnya, seperti pada dropout dan batch normalization), perbedaan tersebut diimplementasikan dengan argumen ini. Jika tidak, argumen ini mungkin tidak ada.

    Tidak diwajibkan bahwa __call__ menerima argumen training bernilai Tensor. Pihak pemanggil bertanggung jawab untuk menggunakan tf.cond() jika diperlukan untuk melakukan pengiriman antar keduanya.

  • Pembuat SavedModel dapat memilih untuk menerima lebih banyak kwargs opsional dengan nama tertentu.

    • Untuk argumen bernilai Tensor, pembuat SavedModel mendefinisikan tipe data dan bentuk yang diizinkan. tf.function menerima nilai default Python pada argumen yang dilacak dengan input tf.TensorSpec. Argumen tersebut dapat digunakan untuk memungkinkan penyesuaian parameter numerik yang terlibat dalam __call__ (misalnya, tingkat dropout).

    • Untuk argumen bernilai Python, pembuat SavedModel mendefinisikan nilai-nilai yang diizinkan. Argumen tersebut dapat digunakan sebagai flag untuk membuat pilihan diskrit dalam fungsi yang dilacak (tetapi perhatikan ledakan kombinatorial dari pelacakan).

Fungsi __call__ yang dipulihkan harus menyediakan jejak untuk semua kombinasi argumen yang diizinkan. Mengubah training antara True dan False tidak boleh mengubah kebolehan argumen.

Hasil

outputs dari pemanggilan obj dapat berupa...

  • satu Tensor untuk satu keluaran,
  • daftar Tensor untuk urutan keluaran tak bernama yang terurut,
  • Sebuah kamus (dict) berisi tensor yang dikunci berdasarkan sekumpulan nama keluaran tertentu.

(Revisi antarmuka di masa mendatang mungkin memungkinkan nesting yang lebih umum.) Tipe pengembalian dapat bervariasi tergantung pada kwargs yang bernilai Python. Ini memungkinkan flag menghasilkan output tambahan. Pembuat SavedModel mendefinisikan tipe data dan bentuk output serta ketergantungannya pada input.

Fungsi yang dapat dipanggil bernama

Sebuah SavedModel yang Dapat Digunakan Kembali dapat menyediakan beberapa bagian model dengan cara yang dijelaskan di atas dengan menempatkannya ke dalam subobjek bernama, misalnya, obj.foo , obj.bar , dan seterusnya. Setiap subobjek menyediakan metode __call__ dan atribut pendukung tentang variabel, dll., yang spesifik untuk bagian model tersebut. Untuk contoh di atas, akan ada obj.foo.__call__ , obj.foo.variables , dan seterusnya.

Perlu dicatat bahwa antarmuka ini tidak mencakup pendekatan penambahan tf.function secara langsung sebagai tf.foo .

Pengguna Reusable SavedModels hanya diharapkan untuk menangani satu tingkat penestingan ( obj.bar tetapi bukan obj.bar.baz ). (Revisi antarmuka di masa mendatang mungkin memungkinkan penestingan yang lebih dalam, dan mungkin mengesampingkan persyaratan bahwa objek tingkat atas harus dapat dipanggil sendiri.)

Kata penutup

Hubungan dengan API dalam proses

Dokumen ini menjelaskan antarmuka kelas Python yang terdiri dari tipe data primitif seperti tf.function dan tf.Variable yang tetap ada setelah melalui proses serialisasi melalui tf.saved_model.save() dan tf.saved_model.load() . Namun, antarmuka tersebut sudah ada pada objek asli yang diteruskan ke tf.saved_model.save() . Adaptasi terhadap antarmuka tersebut memungkinkan pertukaran bagian-bagian model di seluruh API pembuatan model dalam satu program TensorFlow.