Simpan dan muat model

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 adalah localstorage://
  • 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:

  1. File JSON teks bernama [my-model].json , yang membawa topologi dan referensi ke file bobot yang dijelaskan di bawah.
  2. 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

  1. File JSON teks bernama model.json , yang membawa topologi dan referensi ke file bobot yang dijelaskan di bawah.
  2. 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 .

  1. File JSON teks bernama [model].json , yang membawa topologi dan referensi ke file bobot yang dijelaskan di bawah.
  2. 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() , fungsi loadLayersModel 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 adalah tf.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.