TensorFlow.js มีฟังก์ชันสำหรับบันทึกและโหลดโมเดลที่สร้างขึ้นด้วย Layers
API หรือแปลงจากโมเดล TensorFlow ที่มีอยู่ สิ่งเหล่านี้อาจเป็นแบบจำลองที่คุณฝึกฝนตัวเองหรือฝึกฝนโดยผู้อื่น ประโยชน์หลักของการใช้ Layers api คือ โมเดลที่สร้างขึ้นสามารถซีเรียลไลซ์ได้ และนี่คือสิ่งที่เราจะพูดถึงในบทช่วยสอนนี้
บทช่วยสอนนี้จะเน้นไปที่การบันทึกและการโหลดโมเดล TensorFlow.js (ระบุได้ด้วยไฟล์ JSON) นอกจากนี้เรายังสามารถนำเข้าโมเดล TensorFlow Python ได้อีกด้วย การโหลดโมเดลเหล่านี้ครอบคลุมอยู่ในบทช่วยสอนสองบทต่อไปนี้:
บันทึก tf.Model
tf.Model
และ tf.Sequential
ต่างก็มีฟังก์ชัน model.save
ที่ให้คุณบันทึก โทโพโลยี และ น้ำหนัก ของโมเดลได้
โทโพโลยี: นี่คือไฟล์ที่อธิบายสถาปัตยกรรมของโมเดล (เช่น การดำเนินการใดที่ใช้) ประกอบด้วยการอ้างอิงถึงน้ำหนักของแบบจำลองซึ่งจัดเก็บไว้ภายนอก
น้ำหนัก: ไฟล์ไบนารี่ที่เก็บน้ำหนักของโมเดลที่กำหนดในรูปแบบที่มีประสิทธิภาพ โดยทั่วไปจะถูกจัดเก็บไว้ในโฟลเดอร์เดียวกันกับโทโพโลยี
มาดูกันว่าโค้ดสำหรับบันทึกโมเดลมีลักษณะอย่างไร
const saveResult = await model.save('localstorage://my-model-1');
บางสิ่งที่ควรทราบ:
- วิธี
save
ใช้อาร์กิวเมนต์สตริงที่คล้ายกับ URL ที่ขึ้นต้นด้วย Scheme ข้อมูลนี้อธิบายประเภทของปลายทางที่เราพยายามบันทึกโมเดลไว้ ในตัวอย่างข้างต้น โครงการคือlocalstorage://
- โครงการจะตามมาด้วย เส้นทาง ในตัวอย่างด้านบน เส้นทางคือ
my-model-1
- วิธี
save
เป็นแบบอะซิงโครนัส - ค่าที่ส่งคืนของ
model.save
คือออบเจ็กต์ JSON ที่นำข้อมูล เช่น ขนาดไบต์ของโทโพโลยีและน้ำหนักของโมเดล - สภาพแวดล้อมที่ใช้ในการบันทึกแบบจำลองจะไม่ส่งผลกระทบต่อสภาพแวดล้อมที่สามารถโหลดแบบจำลองได้ การบันทึกโมเดลใน node.js ไม่ได้ป้องกันการโหลดในเบราว์เซอร์
ด้านล่างนี้เราจะตรวจสอบแผนงานต่างๆ ที่มีอยู่
ที่เก็บข้อมูลในเครื่อง (เบราว์เซอร์เท่านั้น)
โครงการ: localstorage://
await model.save('localstorage://my-model');
วิธีนี้จะบันทึกโมเดลภายใต้ชื่อ my-model
ใน พื้นที่จัดเก็บในตัว เครื่องของเบราว์เซอร์ สิ่งนี้จะคงอยู่ในระหว่างการรีเฟรช แม้ว่าผู้ใช้หรือเบราว์เซอร์จะสามารถล้างที่เก็บข้อมูลในเครื่องได้หากพื้นที่กลายเป็นปัญหา แต่ละเบราว์เซอร์ยังกำหนดขีดจำกัดของตัวเองเกี่ยวกับจำนวนข้อมูลที่สามารถเก็บไว้ในที่จัดเก็บในตัวเครื่องสำหรับโดเมนที่กำหนด
IndexedDB (เบราว์เซอร์เท่านั้น)
โครงการ: indexeddb://
await model.save('indexeddb://my-model');
สิ่งนี้จะบันทึกโมเดลลงในพื้นที่เก็บข้อมูล IndexedDB ของเบราว์เซอร์ เช่นเดียวกับที่จัดเก็บในตัวเครื่อง จะมีการคงอยู่ระหว่างการรีเฟรช มีแนวโน้มที่จะมีข้อจำกัดที่ใหญ่กว่าเกี่ยวกับขนาดของออบเจ็กต์ที่จัดเก็บ
ดาวน์โหลดไฟล์ (เบราว์เซอร์เท่านั้น)
โครงการ: downloads://
await model.save('downloads://my-model');
ซึ่งจะทำให้เบราว์เซอร์ดาวน์โหลดไฟล์โมเดลไปยังเครื่องของผู้ใช้ จะมีการสร้างไฟล์สองไฟล์:
- ไฟล์ข้อความ JSON ชื่อ
[my-model].json
ซึ่งมีโทโพโลยีและการอ้างอิงถึงไฟล์น้ำหนักที่อธิบายไว้ด้านล่าง - ไฟล์ไบนารี่ที่มีค่าน้ำหนักชื่อว่า
[my-model].weights.bin
คุณสามารถเปลี่ยนชื่อ [my-model]
เพื่อรับไฟล์ที่มีชื่ออื่นได้
เนื่องจากไฟล์ .json
ชี้ไปที่ .bin
โดยใช้พาธแบบสัมพันธ์ ไฟล์ทั้งสองจึงควรอยู่ในโฟลเดอร์เดียวกัน
คำขอ HTTP (S)
โครงการ: http://
หรือ https://
await model.save('http://model-server.domain/upload')
สิ่งนี้จะสร้างคำขอเว็บเพื่อบันทึกโมเดลไปยังเซิร์ฟเวอร์ระยะไกล คุณควรควบคุมเซิร์ฟเวอร์ระยะไกลนั้นเพื่อให้คุณมั่นใจได้ว่าจะสามารถจัดการคำขอได้
โมเดลจะถูกส่งไปยังเซิร์ฟเวอร์ HTTP ที่ระบุผ่านการร้องขอ POST เนื้อความของ POST อยู่ในรูปแบบ multipart/form-data
และประกอบด้วยสองไฟล์
- ไฟล์ข้อความ JSON ชื่อ
model.json
ซึ่งมีโทโพโลยีและการอ้างอิงถึงไฟล์น้ำหนักที่อธิบายไว้ด้านล่าง - ไฟล์ไบนารี่ที่มีค่าน้ำหนักชื่อ
model.weights.bin
โปรดทราบว่าชื่อของทั้งสองไฟล์จะตรงตามที่ระบุไว้ข้างต้นทุกประการ (ชื่อนี้มีอยู่ในฟังก์ชัน) เอกสาร API นี้มีข้อมูลโค้ด Python ที่สาธิตวิธีการใช้เฟรมเวิร์กเว็บ ขวด เพื่อจัดการกับคำขอที่มาจาก save
บ่อยครั้งที่คุณจะต้องส่งอาร์กิวเมนต์เพิ่มเติมหรือร้องขอส่วนหัวไปยังเซิร์ฟเวอร์ HTTP ของคุณ (เช่น สำหรับการตรวจสอบสิทธิ์ หรือหากคุณต้องการระบุโฟลเดอร์ที่ควรบันทึกโมเดลไว้) คุณสามารถควบคุมคำขอด้านเหล่านี้อย่างละเอียดจาก save
โดยการแทนที่อาร์กิวเมนต์สตริง URL ใน tf.io.browserHTTPRequest
API นี้ให้ความยืดหยุ่นมากขึ้นในการควบคุมคำขอ HTTP
ตัวอย่างเช่น:
await model.save(tf.io.browserHTTPRequest(
'http://model-server.domain/upload',
{method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));
ระบบไฟล์ดั้งเดิม (Node.js เท่านั้น)
โครงการ: file://
await model.save('file:///path/to/my-model');
เมื่อทำงานบน Node.js เรายังสามารถเข้าถึงระบบไฟล์ได้โดยตรงและสามารถบันทึกโมเดลไว้ที่นั่นได้ คำสั่งด้านบนจะบันทึกไฟล์สองไฟล์ไปยัง path
ที่ระบุหลัง scheme
- ไฟล์ข้อความ JSON ชื่อ
[model].json
ซึ่งมีโทโพโลยีและการอ้างอิงถึงไฟล์น้ำหนักที่อธิบายไว้ด้านล่าง - ไฟล์ไบนารี่ที่มีค่าน้ำหนักชื่อ
[model].weights.bin
โปรดทราบว่าชื่อของทั้งสองไฟล์จะตรงตามที่ระบุไว้ข้างต้นทุกประการ (ชื่อนี้มีอยู่ในฟังก์ชัน)
กำลังโหลด tf.Model
ด้วยโมเดลที่ได้รับการบันทึกโดยใช้วิธีใดวิธีหนึ่งข้างต้น เราสามารถโหลดได้โดยใช้ tf.loadLayersModel
API
มาดูกันว่าโค้ดสำหรับโหลดโมเดลมีลักษณะอย่างไร
const model = await tf.loadLayersModel('localstorage://my-model-1');
บางสิ่งที่ควรทราบ:
- เช่นเดียวกับ
model.save()
ฟังก์ชันloadLayersModel
รับอาร์กิวเมนต์สตริงที่มีลักษณะคล้าย URL ที่ขึ้นต้นด้วย Scheme สิ่งนี้จะอธิบายประเภทของปลายทางที่เราพยายามโหลดโมเดล - โครงการจะตามมาด้วย เส้นทาง ในตัวอย่างข้างต้น เส้นทางคือ
my-model-1
- สตริงที่มีลักษณะคล้าย URL สามารถถูกแทนที่ด้วยวัตถุที่ตรงกับอินเทอร์เฟซ IOHandler
- ฟังก์ชัน
tf.loadLayersModel()
เป็นแบบอะซิงโครนัส - ค่าที่ส่งคืนของ
tf.loadLayersModel
คือtf.Model
ด้านล่างนี้เราจะตรวจสอบแผนงานต่างๆ ที่มีอยู่
ที่เก็บข้อมูลในเครื่อง (เบราว์เซอร์เท่านั้น)
โครงการ: localstorage://
const model = await tf.loadLayersModel('localstorage://my-model');
ซึ่งจะโหลดโมเดลชื่อ my-model
จาก ที่จัดเก็บในตัวเครื่อง ของเบราว์เซอร์
IndexedDB (เบราว์เซอร์เท่านั้น)
โครงการ: indexeddb://
const model = await tf.loadLayersModel('indexeddb://my-model');
ซึ่งจะโหลดโมเดลจากที่เก็บข้อมูล IndexedDB ของเบราว์เซอร์
HTTP(S)
โครงการ: http://
หรือ https://
const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');
นี่เป็นการโหลดโมเดลจากจุดสิ้นสุด http หลังจากโหลดไฟล์ json
แล้ว ฟังก์ชันจะทำการร้องขอไฟล์ .bin
ที่เกี่ยวข้องซึ่งไฟล์ json
อ้างอิงถึง
ระบบไฟล์ดั้งเดิม (Node.js เท่านั้น)
โครงการ: file://
const model = await tf.loadLayersModel('file://path/to/my-model/model.json');
เมื่อทำงานบน Node.js เรายังสามารถเข้าถึงระบบไฟล์ได้โดยตรงและสามารถโหลดโมเดลจากที่นั่นได้ โปรดทราบว่าในการเรียกใช้ฟังก์ชันด้านบน เราจะอ้างอิงถึงไฟล์ model.json เอง (ในขณะที่เมื่อบันทึก เราจะระบุโฟลเดอร์) ไฟล์ .bin
ที่เกี่ยวข้องควรอยู่ในโฟลเดอร์เดียวกันกับไฟล์ json
กำลังโหลดโมเดลด้วย IOHandlers
หากรูปแบบข้างต้นไม่เพียงพอต่อความต้องการของคุณ คุณสามารถใช้ลักษณะการโหลดแบบกำหนดเองกับ IOHandler
ได้ IOHandler
หนึ่งตัวที่ TensorFlow.js มอบให้คือ tf.io.browserFiles
ซึ่งอนุญาตให้ผู้ใช้เบราว์เซอร์อัปโหลดไฟล์โมเดลในเบราว์เซอร์ ดู เอกสารประกอบ สำหรับข้อมูลเพิ่มเติม
การบันทึกและการโหลดโมเดลด้วย IOHandlers แบบกำหนดเอง
หากรูปแบบข้างต้นไม่เพียงพอสำหรับความต้องการในการโหลดหรือการบันทึกของคุณ คุณสามารถใช้ลักษณะการทำงานของซีเรียลไลซ์แบบกำหนดเองได้โดยใช้ IOHandler
IOHandler
เป็นอ็อบเจ็กต์ที่มีวิธี save
และ load
ฟังก์ชัน save
ใช้พารามิเตอร์หนึ่งตัวที่ตรงกับอินเทอร์เฟซ ModelArtifacts และควรส่งคืนสัญญาที่แก้ไขไปยังอ็อบเจ็กต์ SaveResult
ฟังก์ชัน load
ไม่ใช้พารามิเตอร์และควรส่งคืนสัญญาที่แก้ไขไปยังอ็อบเจ็กต์ ModelArtifacts นี่คือออบเจ็กต์เดียวกับที่ถูกส่งผ่านเพื่อ save
ดู BrowserHTTPRequest สำหรับตัวอย่างวิธีใช้งาน IOHandler