การแปลงโมเดล

TensorFlow.js มาพร้อมกับโมเดลที่ผ่านการฝึกอบรมมาแล้วมากมายซึ่งพร้อมใช้งานในเบราว์เซอร์ โดยสามารถพบได้ใน repo โมเดล ของเรา อย่างไรก็ตาม คุณอาจพบหรือสร้างโมเดล TensorFlow ในที่อื่นที่คุณต้องการใช้ในเว็บแอปพลิเคชันของคุณ TensorFlow.js มี ตัวแปลง โมเดลเพื่อจุดประสงค์นี้ ตัวแปลง TensorFlow.js มีสององค์ประกอบ:

  1. ยูทิลิตีบรรทัดคำสั่งที่แปลงโมเดล Keras และ TensorFlow เพื่อใช้ใน TensorFlow.js
  2. API สำหรับการโหลดและดำเนินการโมเดลในเบราว์เซอร์ด้วย TensorFlow.js

แปลงโมเดลของคุณ

ตัวแปลง TensorFlow.js ทำงานร่วมกับรูปแบบโมเดลต่างๆ มากมาย:

SavedModel : นี่เป็นรูปแบบเริ่มต้นในการบันทึกโมเดล TensorFlow รูปแบบ SavedModel ได้รับการบันทึกไว้ ที่นี่

โมเดล Keras : โดยทั่วไปโมเดล Keras จะถูกบันทึกเป็นไฟล์ HDF5 ข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกโมเดล Keras สามารถพบได้ ที่นี่

โมดูล TensorFlow Hub : เป็นโมเดลที่ได้รับการบรรจุแพ็คเกจเพื่อจำหน่ายบน TensorFlow Hub ซึ่งเป็นแพลตฟอร์มสำหรับการแชร์และค้นหาโมเดล ไลบรารีโมเดลสามารถพบได้ ที่นี่

ขึ้นอยู่กับประเภทของโมเดลที่คุณกำลังพยายามแปลง คุณจะต้องส่งอาร์กิวเมนต์ที่แตกต่างกันไปยังตัวแปลง ตัวอย่างเช่น สมมติว่าคุณได้บันทึกโมเดล Keras ชื่อ model.h5 ลงในไดเร็กทอรี tmp/ ของคุณ หากต้องการแปลงโมเดลของคุณโดยใช้ตัวแปลง TensorFlow.js คุณสามารถเรียกใช้คำสั่งต่อไปนี้:

$ tensorflowjs_converter --input_format=keras /tmp/model.h5 /tmp/tfjs_model

ซึ่งจะแปลงโมเดลที่ /tmp/model.h5 และส่งออกไฟล์ model.json พร้อมกับไฟล์น้ำหนักไบนารีไปยังไดเร็กทอรี tmp/tfjs_model/ ของคุณ

รายละเอียดเพิ่มเติมเกี่ยวกับอาร์กิวเมนต์บรรทัดคำสั่งที่สอดคล้องกับรูปแบบโมเดลต่างๆ มีอยู่ที่ตัวแปลง TensorFlow.js README

ในระหว่างกระบวนการแปลง เราจะสำรวจกราฟโมเดลและตรวจสอบว่า TensorFlow.js รองรับการดำเนินการแต่ละรายการ หากเป็นเช่นนั้น เราจะเขียนกราฟเป็นรูปแบบที่เบราว์เซอร์สามารถใช้ได้ เราพยายามปรับโมเดลให้เหมาะสมสำหรับการให้บริการบนเว็บโดยการแบ่งส่วนน้ำหนักออกเป็นไฟล์ขนาด 4MB ด้วยวิธีนี้เบราว์เซอร์จึงสามารถแคชไฟล์เหล่านั้นได้ นอกจากนี้เรายังพยายามทำให้กราฟแบบจำลองง่ายขึ้นโดยใช้โครงการ Grappler แบบโอเพ่นซอร์ส การลดความซับซ้อนของกราฟ ได้แก่ การพับการดำเนินการที่อยู่ติดกันเข้าด้วยกัน การกำจัดกราฟย่อยทั่วไป ฯลฯ การเปลี่ยนแปลงเหล่านี้ไม่มีผลกระทบต่อเอาท์พุตของโมเดล สำหรับการเพิ่มประสิทธิภาพเพิ่มเติม ผู้ใช้สามารถส่งผ่านอาร์กิวเมนต์ที่สั่งให้ตัวแปลงกำหนดจำนวนโมเดลเป็นขนาดไบต์ที่แน่นอนได้ การหาปริมาณเป็นเทคนิคในการลดขนาดโมเดลโดยแสดงน้ำหนักด้วยบิตที่น้อยลง ผู้ใช้จะต้องระมัดระวังเพื่อให้แน่ใจว่าโมเดลของพวกเขาจะรักษาระดับความแม่นยำที่ยอมรับได้หลังจากการหาปริมาณ

หากเราพบการดำเนินการที่ไม่ได้รับการสนับสนุนในระหว่างการแปลง กระบวนการจะล้มเหลวและเราจะพิมพ์ชื่อของการดำเนินการให้กับผู้ใช้ อย่าลังเลที่จะส่งปัญหาบน GitHub ของเราเพื่อแจ้งให้เราทราบ เราพยายามที่จะดำเนินการใหม่เพื่อตอบสนองความต้องการของผู้ใช้

แนวทางปฏิบัติที่ดีที่สุด

แม้ว่าเราจะพยายามทุกวิถีทางเพื่อเพิ่มประสิทธิภาพโมเดลของคุณในระหว่างการแปลง แต่บ่อยครั้งวิธีที่ดีที่สุดเพื่อให้แน่ใจว่าโมเดลของคุณทำงานได้ดีคือการสร้างโดยคำนึงถึงสภาพแวดล้อมที่มีทรัพยากรจำกัด ซึ่งหมายถึงการหลีกเลี่ยงสถาปัตยกรรมที่ซับซ้อนมากเกินไปและลดจำนวนพารามิเตอร์ (น้ำหนัก) ให้เหลือน้อยที่สุดเมื่อเป็นไปได้

เรียกใช้โมเดลของคุณ

เมื่อแปลงโมเดลของคุณสำเร็จแล้ว คุณจะพบชุดไฟล์น้ำหนักและไฟล์โทโพโลยีโมเดล TensorFlow.js มี API การโหลดโมเดลที่คุณสามารถใช้เพื่อดึงเนื้อหาโมเดลเหล่านี้และเรียกใช้การอนุมานในเบราว์เซอร์

API มีลักษณะดังนี้สำหรับโมดูล TensorFlow SavedModel หรือ TensorFlow Hub ที่แปลงแล้ว:

const model = await tf.loadGraphModel(path/to/model.json);

และนี่คือลักษณะของโมเดล Keras ที่แปลงแล้ว:

const model = await tf.loadLayersModel(path/to/model.json);

tf.loadGraphModel API ส่งคืน tf.FrozenModel ซึ่งหมายความว่าพารามิเตอร์ได้รับการแก้ไขแล้ว และคุณจะไม่สามารถปรับแต่งโมเดลของคุณด้วยข้อมูลใหม่ได้ tf.loadLayersModel API ส่งคืน tf.Model ซึ่งสามารถฝึกได้ สำหรับข้อมูลเกี่ยวกับวิธีการฝึก tf.Model โปรดดู คู่มือโมเดลรถไฟ

หลังจากการแปลง เป็นความคิดที่ดีที่จะใช้การอนุมานสองสามครั้งและเปรียบเทียบความเร็วของโมเดลของคุณ เรามีหน้าการเปรียบเทียบประสิทธิภาพแบบสแตนด์อโลนที่สามารถใช้เพื่อจุดประสงค์นี้: https://tensorflow.github.io/tfjs/e2e/benchmarks/local-benchmark/index.html คุณอาจสังเกตเห็นว่าเราละทิ้งการวัดจากการเริ่มอุ่นเครื่องครั้งแรก - เนื่องจาก (โดยทั่วไป) การอนุมานครั้งแรกของโมเดลของคุณจะช้ากว่าการอนุมานครั้งต่อๆ ไปหลายเท่า เนื่องจากมีค่าใช้จ่ายในการสร้างพื้นผิวและการคอมไพล์เชเดอร์