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 sehinggav.trainable
berlaku untuk semua elemen. Variabel-variabel ini harus merupakan bagian darivariables
. 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
atauFalse
. Standarnya adalahFalse
. 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 argumentraining
bernilai Tensor. Penelepon harus menggunakantf.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.