Model Tersimpan yang Dapat Digunakan Kembali

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

pengantar

TensorFlow Hub menghosting SavedModels untuk TensorFlow 2, di antara 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, lebih banyak objek seperti itu.

Halaman ini menjelaskan antarmuka yang akan diimplementasikan oleh objek yang dimuat agar dapat digunakan kembali dalam program obj Python. SavedModels yang sesuai dengan antarmuka ini disebut SavedModels yang Dapat Digunakan Kembali.

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

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

Kaitannya dengan SignatureDefs

Antarmuka 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 menyebarkan SavedModels ke TF Serving atau TF Lite). Tanda tangan untuk inferensi tidak cukup ekspresif untuk mendukung fine-tuning, dan tf.function menyediakan Python API 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, terlepas dari pustaka pembuatan model tertentu seperti Keras atau Sonnet. Ini memfasilitasi penggunaan kembali di seluruh perpustakaan pembuatan model, bebas dari ketergantungan pada kode pembuatan model asli.

Sejumlah adaptasi akan diperlukan memuat Reusable SavedModels ke dalam atau menyimpannya dari pustaka 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).

Kaitan dengan "Common SavedModel APIs" khusus tugas

Definisi antarmuka pada halaman ini memungkinkan untuk sejumlah dan jenis input dan output. Common SavedModel APIs untuk TF Hub menyempurnakan antarmuka umum ini dengan konvensi penggunaan untuk tugas-tugas tertentu agar model dapat dengan mudah dipertukarkan.

Definisi antarmuka

Atribut

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

  • __call__ . Diperlukan. Sebuah tf.function yang mengimplementasikan komputasi model ("pass depan") tunduk pada spesifikasi di bawah ini.

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

    Daftar ini dapat dihilangkan jika kosong.

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

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

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

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

Fungsi __call__

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

Sinopsis (kode semu):

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

Argumen

Argumentasinya adalah sebagai berikut.

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

    • satu Tensor untuk satu input,
    • daftar Tensor untuk urutan input yang tidak disebutkan namanya,
    • dict Tensor yang dikunci oleh serangkaian nama input tertentu.

    (Revisi mendatang dari antarmuka ini mungkin memungkinkan sarang yang lebih umum.) Pencipta SavedModel memilih salah satu dari itu dan bentuk serta tipe tensor. Jika berguna, beberapa dimensi bentuk harus tidak ditentukan (terutama ukuran batch).

  • 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 di antara keduanya (misalnya, seperti pada normalisasi dropout dan batch), perbedaan tersebut diimplementasikan dengan argumen ini. Jika tidak, argumen ini mungkin tidak ada.

    __call__ tidak diharuskan menerima argumen training bernilai Tensor. Itu jatuh pada pemanggil untuk menggunakan tf.cond() jika perlu untuk mengirim di antara mereka.

  • Pencipta 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 kustomisasi hiperparameter numerik yang terlibat dalam __call__ (misalnya, tingkat putus sekolah).

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

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

Hasil

outputs dari pemanggilan obj dapat berupa

  • satu Tensor untuk satu output,
  • daftar Tensor untuk urutan keluaran yang tidak disebutkan namanya,
  • dict Tensor yang dikunci oleh serangkaian nama keluaran tertentu.

(Revisi mendatang dari antarmuka ini memungkinkan sarang yang lebih umum.) Jenis pengembalian dapat bervariasi tergantung pada kwargs yang bernilai Python. Ini memungkinkan flag menghasilkan output tambahan. Pencipta SavedModel mendefinisikan tipe dan bentuk keluaran dan ketergantungannya pada masukan.

Bernama callable

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

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

Pengguna Reusable SavedModels hanya diharapkan untuk menangani satu tingkat nesting ( obj.bar tetapi tidak obj.bar.baz ). (Revisi di masa mendatang dari antarmuka ini memungkinkan penyarangan yang lebih dalam, dan dapat mengabaikan persyaratan bahwa objek tingkat atas dapat dipanggil sendiri.)

Kata penutup

Kaitannya dengan API 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 ke antarmuka tersebut memungkinkan pertukaran potongan model di seluruh API pembuatan model dalam satu program TensorFlow.