บันทึกและโหลดโมเดล

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');

ซึ่งจะทำให้เบราว์เซอร์ดาวน์โหลดไฟล์โมเดลไปยังเครื่องของผู้ใช้ จะมีการสร้างไฟล์สองไฟล์:

  1. ไฟล์ข้อความ JSON ชื่อ [my-model].json ซึ่งมีโทโพโลยีและการอ้างอิงถึงไฟล์น้ำหนักที่อธิบายไว้ด้านล่าง
  2. ไฟล์ไบนารี่ที่มีค่าน้ำหนักชื่อว่า [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 และประกอบด้วยสองไฟล์

  1. ไฟล์ข้อความ JSON ชื่อ model.json ซึ่งมีโทโพโลยีและการอ้างอิงถึงไฟล์น้ำหนักที่อธิบายไว้ด้านล่าง
  2. ไฟล์ไบนารี่ที่มีค่าน้ำหนักชื่อ 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

  1. ไฟล์ข้อความ JSON ชื่อ [model].json ซึ่งมีโทโพโลยีและการอ้างอิงถึงไฟล์น้ำหนักที่อธิบายไว้ด้านล่าง
  2. ไฟล์ไบนารี่ที่มีค่าน้ำหนักชื่อ [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