TensorFlow.js menyediakan fungsionalitas untuk menyimpan dan memuat model yang telah dibuat dengan Layers
API atau dikonversi dari model TensorFlow yang ada. Ini mungkin model yang Anda latih sendiri atau model yang dilatih oleh orang lain. Manfaat utama menggunakan Layers api adalah model yang dibuat dengannya dapat diserialkan dan inilah yang akan kita jelajahi dalam tutorial ini.
Tutorial ini akan fokus pada penyimpanan dan pemuatan model TensorFlow.js (dapat diidentifikasi dengan file JSON). Kita juga dapat mengimpor model TensorFlow Python. Memuat model ini dibahas dalam dua tutorial berikut:
Simpan tf.Model
tf.Model
dan tf.Sequential
keduanya menyediakan fungsi model.save
yang memungkinkan Anda menyimpan topologi dan bobot model.
Topologi: Ini adalah file yang menjelaskan arsitektur suatu model (yaitu operasi apa yang digunakannya). Ini berisi referensi bobot model yang disimpan secara eksternal.
Bobot: Ini adalah file biner yang menyimpan bobot model tertentu dalam format yang efisien. Biasanya disimpan dalam folder yang sama dengan topologi.
Mari kita lihat seperti apa kode untuk menyimpan model
const saveResult = await model.save('localstorage://my-model-1');
Beberapa hal yang perlu diperhatikan:
- Metode
save
mengambil argumen string mirip URL yang dimulai dengan skema . Ini menjelaskan jenis tujuan tempat kami mencoba menyimpan model. Pada contoh di atas skemanya adalahlocalstorage://
- Skema ini diikuti oleh sebuah jalur . Pada contoh di atas jalurnya adalah
my-model-1
. - Metode
save
tidak sinkron. - Nilai kembalian
model.save
adalah objek JSON yang membawa informasi seperti ukuran byte topologi dan bobot model. - Lingkungan yang digunakan untuk menyimpan model tidak memengaruhi lingkungan mana yang dapat memuat model. Menyimpan model di node.js tidak mencegahnya dimuat di browser.
Di bawah ini kami akan memeriksa berbagai skema yang tersedia.
Penyimpanan Lokal (khusus Browser)
Skema: localstorage://
await model.save('localstorage://my-model');
Ini menyimpan model dengan nama my-model
di penyimpanan lokal browser. Ini akan tetap ada di antara penyegaran, meskipun penyimpanan lokal dapat dibersihkan oleh pengguna atau browser itu sendiri jika ruang menjadi masalah. Setiap browser juga menetapkan batasannya sendiri mengenai berapa banyak data yang dapat disimpan di penyimpanan lokal untuk domain tertentu.
IndexedDB (khusus Browser)
Skema: indexeddb://
await model.save('indexeddb://my-model');
Ini menyimpan model ke penyimpanan IndexedDB browser. Seperti halnya penyimpanan lokal, penyimpanan ini tetap ada di antara penyegaran, penyimpanan ini juga cenderung memiliki batasan yang lebih besar pada ukuran objek yang disimpan.
Pengunduhan File (khusus Browser)
Skema: downloads://
await model.save('downloads://my-model');
Ini akan menyebabkan browser mengunduh file model ke mesin pengguna. Dua file akan dihasilkan:
- File JSON teks bernama
[my-model].json
, yang membawa topologi dan referensi ke file bobot yang dijelaskan di bawah. - File biner yang membawa nilai bobot bernama
[my-model].weights.bin
.
Anda dapat mengubah nama [my-model]
untuk mendapatkan file dengan nama berbeda.
Karena file .json
menunjuk ke .bin
menggunakan jalur relatif, kedua file tersebut harus berada di folder yang sama.
Permintaan HTTP(S).
Skema: http://
atau https://
await model.save('http://model-server.domain/upload')
Ini akan membuat permintaan web untuk menyimpan model ke server jauh. Anda harus mengendalikan server jarak jauh tersebut sehingga Anda dapat memastikan bahwa server tersebut mampu menangani permintaan tersebut.
Model akan dikirim ke server HTTP yang ditentukan melalui permintaan POST . Isi POST dalam format multipart/form-data
dan terdiri dari dua file
- File JSON teks bernama
model.json
, yang membawa topologi dan referensi ke file bobot yang dijelaskan di bawah. - File biner yang membawa nilai bobot bernama
model.weights.bin
.
Perhatikan bahwa nama kedua file akan selalu persis seperti yang ditentukan di atas (nama sudah ada di dalam fungsi). Dokumen api ini berisi cuplikan kode Python yang menunjukkan bagaimana seseorang dapat menggunakan kerangka web flask untuk menangani permintaan yang berasal dari save
.
Seringkali Anda harus meneruskan lebih banyak argumen atau header permintaan ke server HTTP Anda (misalnya untuk otentikasi atau jika Anda ingin menentukan folder tempat model disimpan). Anda bisa mendapatkan kontrol menyeluruh atas aspek permintaan dari save
ini dengan mengganti argumen string URL di tf.io.browserHTTPRequest
. API ini memberikan fleksibilitas lebih besar dalam mengendalikan permintaan HTTP.
Misalnya:
await model.save(tf.io.browserHTTPRequest(
'http://model-server.domain/upload',
{method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));
Sistem File Asli (khusus Node.js)
Skema: file://
await model.save('file:///path/to/my-model');
Saat berjalan di Node.js kami juga memiliki akses langsung ke sistem file dan dapat menyimpan model di sana. Perintah di atas akan menyimpan dua file ke path
yang ditentukan setelah scheme
.
- File JSON teks bernama
[model].json
, yang membawa topologi dan referensi ke file bobot yang dijelaskan di bawah. - File biner yang membawa nilai bobot bernama
[model].weights.bin
.
Perhatikan bahwa nama kedua file akan selalu persis seperti yang ditentukan di atas (nama sudah ada di dalam fungsi).
Memuat tf.Model
Mengingat model yang disimpan menggunakan salah satu metode di atas, kita dapat memuatnya menggunakan tf.loadLayersModel
API.
Mari kita lihat seperti apa kode untuk memuat model
const model = await tf.loadLayersModel('localstorage://my-model-1');
Beberapa hal yang perlu diperhatikan:
- Seperti
model.save()
, fungsiloadLayersModel
mengambil argumen string mirip URL yang dimulai dengan skema . Ini menjelaskan jenis tujuan tempat kami mencoba memuat model. - Skema ini diikuti oleh sebuah jalur . Pada contoh di atas jalurnya adalah
my-model-1
. - String seperti url dapat diganti dengan objek yang cocok dengan antarmuka IOHandler.
- Fungsi
tf.loadLayersModel()
tidak sinkron. - Nilai kembalian
tf.loadLayersModel
adalahtf.Model
Di bawah ini kami akan memeriksa berbagai skema yang tersedia.
Penyimpanan Lokal (khusus Browser)
Skema: localstorage://
const model = await tf.loadLayersModel('localstorage://my-model');
Ini memuat model bernama my-model
dari penyimpanan lokal browser.
IndexedDB (khusus Browser)
Skema: indexeddb://
const model = await tf.loadLayersModel('indexeddb://my-model');
Ini memuat model dari penyimpanan IndexedDB browser.
HTTP(S)
Skema: http://
atau https://
const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');
Ini memuat model dari titik akhir http. Setelah memuat file json
fungsi akan membuat permintaan untuk file .bin
terkait yang direferensikan oleh file json
.
Sistem File Asli (khusus Node.js)
Skema: file://
const model = await tf.loadLayersModel('file://path/to/my-model/model.json');
Saat berjalan di Node.js kami juga memiliki akses langsung ke sistem file dan dapat memuat model dari sana. Perhatikan bahwa dalam pemanggilan fungsi di atas kita mereferensikan file model.json itu sendiri (sedangkan saat menyimpan kita menentukan folder). File .bin
yang sesuai harus berada di folder yang sama dengan file json
.
Memuat model dengan IOHandlers
Jika skema di atas tidak mencukupi kebutuhan Anda, Anda dapat menerapkan perilaku pemuatan khusus dengan IOHandler
. Salah satu IOHandler
yang disediakan TensorFlow.js adalah tf.io.browserFiles
yang memungkinkan pengguna browser mengunggah file model di browser. Lihat dokumentasi untuk informasi lebih lanjut.
Menyimpan dan Memuat Model dengan IOHandler khusus
Jika skema di atas tidak mencukupi untuk kebutuhan pemuatan atau penyimpanan Anda, Anda dapat menerapkan perilaku serialisasi khusus dengan menerapkan IOHandler
.
IOHandler
adalah objek dengan metode save
dan load
.
Fungsi save
mengambil satu parameter yang cocok dengan antarmuka ModelArtifacts dan harus mengembalikan janji yang diselesaikan ke objek SaveResult .
Fungsi load
tidak menggunakan parameter dan harus mengembalikan janji yang diselesaikan ke objek ModelArtifacts . Ini adalah objek yang sama yang diteruskan ke save
.
Lihat BrowserHTTPRequest untuk contoh cara mengimplementasikan IOHandler.