7.6. กายวิภาคของ predict¶
Model.predict(inputs, *, callback=None) คือที่ที่ออบเจ็กต์โมเดลที่โหลดแล้วทำงานจริง ระหว่างที่อินพุตเข้ามาและผลลัพธ์ออกไป มีสามขั้นตอนที่ทำงานตามลำดับ: pre-process, engine dispatch, post-process สองในสามขั้นตอนรับพารามิเตอร์ที่สคริปต์ควบคุมโดยตรง ส่วน engine ตรงกลางถูกกำหนดโดย cam
สามขั้นตอนของ predict() Pre-process และ post-process รับพารามิเตอร์ที่สคริปต์ควบคุม ส่วน engine ตรงกลางถูกกำหนดโดย cam¶
7.6.1. Pre-process¶
ขั้นตอน pre-process แปลงอินพุตแต่ละตัวเป็นเทนเซอร์หนาแน่นที่โครงข่ายคาดหวัง อินพุตที่พบบ่อยที่สุดคือ image.Image ที่บันทึกใน RGB565 ขั้นตอนนี้จะครอบตัดและปรับขนาดเป็น input_shape ของโครงข่าย แปลงจาก RGB565 เป็นรูปแบบช่องสัญญาณที่โครงข่ายถูกฝึกมา (RGB888 สำหรับโครงข่ายการมองเห็นส่วนใหญ่) ใช้ scale และ offset ต่อช่องสัญญาณ และ -- เมื่อโครงข่ายคาดหวังอินพุตจำนวนเต็ม -- quantize เป็น input_dtype ของโมเดลในขั้นตอนเดียวกัน โครงข่ายที่ฝึกสำหรับอินพุต float จะข้ามขั้นตอน quantization และรับผลลัพธ์ scale-and-offset โดยตรง
ค่าเริ่มต้น ml.preprocessing.Normalization อ่าน input dtype ของโมเดลและรันการแปลงที่ถูกต้องโดยอัตโนมัติ Normalization ที่ปรับแต่งเองจะแทนที่ค่า scale, mean และ stdev สำหรับโมเดลที่ฝึกกับสถิติช่องสัญญาณที่กำหนดเอง (ค่า mean และ standard deviation ที่มาจาก ImageNet เป็นกรณีทั่วไป) callable ธรรมดาจะแทนที่ขั้นตอนทั้งหมด -- มีประโยชน์เมื่ออินพุตไม่ใช่ภาพเลย หรือเมื่อแอปพลิเคชันได้ผลิตเทนเซอร์หนาแน่นแล้ว
7.6.2. Engine dispatch¶
ขั้นตอน engine รันโครงข่าย เครื่องยนต์ที่มันส่งไปนั้นถูกกำหนดโดย cam: H7 และ RT1062 รัน TFLM (ตัวแปลความหมาย TensorFlow Lite for Microcontrollers ส่งไปยัง CMSIS-NN kernels ที่ปรับปรุงสำหรับ ARM ที่มีอยู่); AE3 รัน TFLM interpreter เดียวกันพร้อม Cortex-M55 fallback และ NPU Ethos-U จัดการ operator ใด ๆ ที่ Vela compiler แบบออฟไลน์ติดป้ายกำกับสำหรับ accelerator; N6 รัน STAI รันไทม์ของ ST สำหรับ NPU ที่สร้างเพื่อวัตถุประสงค์เฉพาะของ N6
สคริปต์ไม่เลือก engine engine ที่มาพร้อมกับ cam จะรันทุกโมเดลที่ cam โหลด
7.6.3. Post-process¶
ขั้นตอน post-process แปลงเทนเซอร์เอาต์พุตดิบของโครงข่ายกลับเป็นผลลัพธ์ที่ใช้งานได้ พฤติกรรมเริ่มต้นคือ dequantize เทนเซอร์เอาต์พุตแต่ละตัวเป็น floating point (หรือส่งผ่านโดยไม่เปลี่ยนแปลงสำหรับโครงข่ายที่มีเอาต์พุต float) และส่งคืนเป็นรายการของออบเจ็กต์ ndarray แอปพลิเคชันส่วนใหญ่ลงทะเบียน post-processor -- callable ที่รู้ layout เอาต์พุตของโครงข่าย -- เพื่อถอดรหัสเทนเซอร์เป็นรูปแบบผลลัพธ์ที่แอปพลิเคชันดำเนินการ: รายการกรอบล้อมรอบ รายการจุดสำคัญ รายการคลาส
สคริปต์ควบคุมขั้นตอนนี้สองวิธี คีย์เวิร์ด postprocess= บน constructor ลงทะเบียน post-processor ที่รันทุกครั้งที่เรียก คีย์เวิร์ด callback= บน predict() แทนที่ post-processor ที่ลงทะเบียนไว้สำหรับการเรียกครั้งเดียว -- มีประโยชน์สำหรับการสลับระหว่าง decoder หลายตัวโดยไม่ต้องโหลดโมเดลใหม่ ทั้งสองรูปแบบรับ (model, inputs, outputs) และส่งคืนสิ่งที่แอปพลิเคชันคาดหวัง
7.6.4. สิ่งที่สคริปต์ควบคุม¶
Pre-process และ post-process คือสองช่องทางของสคริปต์ ตัวประมวลผลล่วงหน้าเริ่มต้นจัดการโมเดลการมองเห็นส่วนใหญ่ post-processor ที่เหมาะสมสำหรับตระกูลโครงข่ายที่กำหนดจะถูกเลือกจากแคตตาล็อกใต้ ml.postprocessing engine ตรงกลางถูกกำหนดโดย build และทำงานในลักษณะเดียวกันโดยไม่คำนึงถึงสิ่งที่สคริปต์ร้องขอ