Model Tersimpan yang Dapat Digunakan Kembali

Perkenalan

TensorFlow Hub menghosting SavedModels untuk TensorFlow 2, dan aset lainnya. Mereka 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 arbitrer yaitu tf.functions, tf.Variables (diinisialisasi dari nilai yang telah dilatih sebelumnya), sumber daya lain, dan, secara rekursif, objek serupa lainnya.

Halaman ini menjelaskan antarmuka yang akan diimplementasikan oleh obj yang dimuat untuk digunakan kembali dalam program TensorFlow Python. SavedModels yang sesuai dengan antarmuka ini disebut Reusable SavedModels .

Menggunakan kembali berarti membangun model yang lebih besar di sekitar obj , termasuk kemampuan untuk menyempurnakannya. Penyempurnaan berarti pelatihan lebih lanjut terhadap beban pada obj yang dimuat sebagai bagian dari model sekitarnya. Fungsi kerugian dan pengoptimal ditentukan oleh model di sekitarnya; obj hanya mendefinisikan pemetaan aktivasi input ke output ("forward pass"), mungkin termasuk teknik seperti dropout atau normalisasi batch.

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

Kaitannya 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 SavedModels ke TF Serving atau TF Lite). Tanda tangan untuk inferensi tidak cukup ekspresif untuk mendukung penyesuaian, dan tf.function menyediakan API Python yang lebih alami dan ekspresif untuk model yang digunakan kembali.

Kaitannya dengan perpustakaan pembuatan model

SavedModel yang Dapat Digunakan Kembali hanya menggunakan primitif TensorFlow 2, tidak bergantung pada pustaka pembuatan model tertentu seperti Keras atau Sonnet. Hal ini memfasilitasi penggunaan kembali seluruh pustaka pembuatan model, bebas dari ketergantungan pada kode pembuatan model asli.

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

Kaitannya 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 tertentu agar model dapat dipertukarkan dengan mudah.

Definisi antarmuka

Atribut

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

  • __call__ . Diperlukan. Fungsi tf. yang mengimplementasikan komputasi model ("forward pass") tunduk pada spesifikasi di bawah.

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

    Daftar ini dapat dihilangkan jika kosong.

  • trainable_variables : Daftar objek tf.Variable sehingga v.trainable berlaku untuk semua elemen. Variabel-variabel ini harus merupakan bagian dari variables . Ini adalah variabel yang akan dilatih saat menyempurnakan objek. Pembuat SavedModel dapat memilih untuk menghilangkan beberapa variabel di sini yang awalnya dapat dilatih untuk menunjukkan bahwa variabel tersebut tidak boleh diubah selama penyesuaian.

    Daftar ini dapat dihilangkan jika kosong, khususnya jika SavedModel tidak mendukung penyesuaian.

  • regularization_losses : Daftar fungsi tf., masing-masing mengambil nol masukan dan mengembalikan satu tensor skalar float. Untuk menyempurnakannya, pengguna SavedModel disarankan untuk memasukkan ini sebagai ketentuan regularisasi tambahan ke dalam kerugian (dalam kasus paling sederhana tanpa penskalaan lebih lanjut). Biasanya, ini digunakan untuk mewakili pengatur berat badan. (Karena kurangnya input, fungsi tf.ini tidak dapat mengekspresikan pengatur aktivitas.)

    Daftar ini dapat dihilangkan jika kosong, khususnya jika SavedModel tidak mendukung penyesuaian atau tidak ingin menentukan regularisasi bobot.

Fungsi __call__

obj SavedModel yang Dipulihkan memiliki atribut obj.__call__ yang merupakan fungsi tf.yang dipulihkan dan memungkinkan obj dipanggil sebagai berikut.

Sinopsis (kode semu):

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

Argumen

Argumennya adalah sebagai berikut.

  • Ada satu argumen posisional yang diperlukan dengan kumpulan aktivasi input SavedModel. Jenisnya adalah salah satunya

    • satu Tensor untuk satu masukan,
    • daftar Tensor untuk urutan input tanpa nama yang diurutkan,
    • dict Tensor yang dikunci oleh sekumpulan nama masukan tertentu.

    (Revisi antarmuka ini di masa mendatang mungkin memungkinkan sarang yang lebih umum.) Pembuat SavedModel memilih salah satunya serta bentuk dan tipe tensor. Jika berguna, beberapa dimensi bentuk harus tidak ditentukan (terutama ukuran tumpukan).

  • Mungkin ada training argumen kata kunci opsional yang menerima boolean Python, True atau False . Standarnya adalah False . Jika model mendukung fine-tuning, dan jika perhitungannya berbeda antara keduanya (misalnya, seperti pada normalisasi dropout dan batch), perbedaan tersebut diterapkan dengan argumen ini. Jika tidak, argumen ini mungkin tidak ada.

    __call__ tidak diharuskan menerima argumen training bernilai Tensor. Penelepon harus menggunakan tf.cond() jika perlu untuk mengirim di antara mereka.

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

    • Untuk argumen bernilai Tensor, pembuat SavedModel menentukan tipe 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 hyperparameter numerik yang terlibat dalam __call__ (misalnya, tingkat putus sekolah).

    • Untuk argumen bernilai Python, pembuat SavedModel mendefinisikan nilai yang diizinkan. Argumen seperti itu dapat digunakan sebagai tanda untuk membuat pilihan terpisah dalam fungsi yang dilacak (tetapi perhatikan ledakan kombinatorial dari jejak).

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

Hasil

outputs dari pemanggilan obj bisa berupa

  • satu Tensor untuk satu keluaran,
  • daftar Tensor untuk urutan keluaran tanpa nama,
  • dict Tensor yang dikunci oleh sekumpulan nama keluaran tertentu.

(Revisi antarmuka ini di masa depan mungkin memungkinkan sarang yang lebih umum.) Tipe pengembalian dapat bervariasi tergantung pada kwarg yang bernilai Python. Hal ini memungkinkan flag menghasilkan output tambahan. Pembuat SavedModel mendefinisikan tipe dan bentuk keluaran serta ketergantungannya pada masukan.

Dinamakan callable

SavedModel yang Dapat Digunakan Kembali dapat menyediakan beberapa potongan 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. khusus untuk bagian model tersebut. Untuk contoh di atas, akan ada obj.foo.__call__ , obj.foo.variables dan seterusnya.

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

Pengguna SavedModels yang Dapat Digunakan Kembali hanya diharapkan menangani satu tingkat sarang ( obj.bar tetapi tidak obj.bar.baz ). (Revisi antarmuka ini di masa depan mungkin memungkinkan penyatuan yang lebih dalam, dan mungkin mengabaikan persyaratan bahwa objek tingkat atas dapat dipanggil sendiri.)

Kata penutup

Kaitannya dengan API yang sedang dalam proses

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