การแนะนำ
TensorFlow Hub โฮสต์ SavedModels สำหรับ TensorFlow 2 รวมถึงเนื้อหาอื่นๆ สามารถโหลดกลับเข้าไปในโปรแกรม Python ได้ด้วย obj = hub.load(url)
[ เรียนรู้เพิ่มเติม ] obj
ที่ส่งคืนเป็นผลลัพธ์ของ tf.saved_model.load()
(ดู คู่มือ SavedModel ของ TensorFlow) อ็อบเจ็กต์นี้สามารถมีแอตทริบิวต์ที่กำหนดเองได้ เช่น tf.functions, tf.Variables (กำหนดค่าเริ่มต้นจากค่าที่ได้รับการฝึกไว้ล่วงหน้า) ทรัพยากรอื่นๆ และอ็อบเจ็กต์ดังกล่าวแบบเรียกซ้ำเพิ่มเติม
หน้านี้อธิบายอินเทอร์เฟซที่จะนำไปใช้โดย obj
ที่โหลด เพื่อนำ มาใช้ซ้ำ ในโปรแกรม TensorFlow Python SavedModels ที่สอดคล้องกับอินเทอร์เฟซนี้เรียกว่า Reusable SavedModels
การใช้ซ้ำหมายถึงการสร้างแบบจำลองที่ใหญ่ขึ้นรอบๆ obj
รวมถึงความสามารถในการปรับแต่งอย่างละเอียด การปรับแต่งอย่างละเอียดหมายถึงการฝึกตุ้มน้ำหนักเพิ่มเติมใน obj
ที่โหลดโดยเป็นส่วนหนึ่งของโมเดลโดยรอบ ฟังก์ชันการสูญเสียและตัวเพิ่มประสิทธิภาพถูกกำหนดโดยแบบจำลองโดยรอบ obj
เพียงกำหนดการแมปของการเปิดใช้งานอินพุตกับเอาต์พุต ("การส่งต่อ") ซึ่งอาจรวมถึงเทคนิคต่างๆ เช่น การออกกลางคันหรือการทำให้เป็นมาตรฐานแบบแบตช์
ทีม TensorFlow Hub แนะนำให้ใช้อินเทอร์เฟซ Reusable SavedModel ใน SavedModels ทั้งหมดที่มีไว้เพื่อนำมาใช้ซ้ำในแง่ข้างต้น ยูทิลิตี้จำนวนมากจากไลบรารี tensorflow_hub
โดยเฉพาะ hub.KerasLayer
จำเป็นต้องมี SavedModels เพื่อนำไปใช้
ความสัมพันธ์กับ SignatureDefs
อินเทอร์เฟซนี้ในแง่ของ tf.functions และคุณสมบัติ TF2 อื่น ๆ แยกจากลายเซ็นของ SavedModel ซึ่งมีให้ใช้งานตั้งแต่ TF1 และยังคงใช้ใน TF2 สำหรับการอนุมาน (เช่น การปรับใช้ SavedModels กับ TF Serving หรือ TF Lite) ลายเซ็นสำหรับการอนุมานไม่ชัดเจนเพียงพอที่จะรองรับการปรับแต่งอย่างละเอียด และ tf.function
มอบ Python API ที่เป็นธรรมชาติและชัดเจนยิ่งขึ้นสำหรับโมเดลที่นำกลับมาใช้ใหม่
ความสัมพันธ์กับไลบรารีการสร้างแบบจำลอง
SavedModel แบบใช้ซ้ำได้จะใช้เฉพาะ TensorFlow 2 ดั้งเดิมเท่านั้น โดยไม่ขึ้นอยู่กับไลบรารีการสร้างแบบจำลองใดๆ เช่น Keras หรือ Sonnet สิ่งนี้อำนวยความสะดวกในการนำมาใช้ซ้ำในไลบรารีการสร้างโมเดล โดยปราศจากการพึ่งพาโค้ดการสร้างโมเดลดั้งเดิม
จำเป็นต้องมีการปรับเปลี่ยนจำนวนหนึ่งในการโหลด Reusable SavedModels ลงในหรือบันทึกจากไลบรารีการสร้างโมเดลที่กำหนด สำหรับ Keras นั้น hub.KerasLayer จัดเตรียมการโหลด และการบันทึกในตัวของ Keras ในรูปแบบ SavedModel ได้รับการออกแบบใหม่สำหรับ TF2 โดยมีเป้าหมายในการจัดเตรียม superset ของอินเทอร์เฟซนี้ (ดู RFC ตั้งแต่เดือนพฤษภาคม 2019)
ความสัมพันธ์กับงาน "Common SavedModel APIs" เฉพาะงาน
คำจำกัดความของอินเทอร์เฟซในหน้านี้อนุญาตให้มีอินพุตและเอาต์พุตจำนวนและประเภทใดก็ได้ Common SavedModel API สำหรับ TF Hub ปรับปรุงอินเทอร์เฟซทั่วไปนี้ด้วยรูปแบบการใช้งานสำหรับงานเฉพาะเพื่อให้โมเดลสามารถใช้แทนกันได้ง่ายดาย
คำจำกัดความของอินเทอร์เฟซ
คุณสมบัติ
SavedModel ที่นำมาใช้ซ้ำได้คือ TensorFlow 2 SavedModel โดยที่ obj = tf.saved_model.load(...)
ส่งคืนวัตถุที่มีคุณลักษณะดังต่อไปนี้
__call__
. ที่จำเป็น. tf.function ที่ใช้การคำนวณของโมเดล ("ส่งต่อ") ภายใต้ข้อกำหนดด้านล่างvariables
: รายการของวัตถุ tf.Variable แสดงรายการตัวแปรทั้งหมดที่ใช้โดยการเรียกใช้__call__
ที่เป็นไปได้ รวมถึงทั้งตัวแปรที่ฝึกได้และไม่สามารถฝึกได้รายการนี้สามารถละเว้นได้หากว่างเปล่า
trainable_variables
: รายการของอ็อบเจ็กต์ tf.Variable โดยที่v.trainable
เป็นจริงสำหรับองค์ประกอบทั้งหมด ตัวแปรเหล่านี้ต้องเป็นชุดย่อยของvariables
ตัวแปรเหล่านี้เป็นตัวแปรที่ต้องฝึกฝนเมื่อทำการปรับวัตถุอย่างละเอียด ผู้สร้าง SavedModel อาจเลือกที่จะละเว้นตัวแปรบางตัวที่นี่ซึ่งแต่เดิมสามารถฝึกได้เพื่อระบุว่าไม่ควรแก้ไขสิ่งเหล่านี้ในระหว่างการปรับแต่งแบบละเอียดรายการนี้สามารถละเว้นได้หากว่างเปล่า โดยเฉพาะอย่างยิ่งหาก SavedModel ไม่รองรับการปรับแต่งอย่างละเอียด
regularization_losses
: รายการ tf.functions โดยแต่ละรายการรับอินพุตเป็นศูนย์และส่งคืนเทนเซอร์สเกลาร์โฟลตตัวเดียว สำหรับการปรับแต่งอย่างละเอียด ขอแนะนำให้ผู้ใช้ SavedModel รวมสิ่งเหล่านี้เป็นเงื่อนไขการทำให้เป็นมาตรฐานเพิ่มเติมในการสูญเสีย (ในกรณีที่ง่ายที่สุดโดยไม่ต้องปรับขนาดเพิ่มเติม) โดยปกติแล้วสิ่งเหล่านี้จะใช้เพื่อแสดงตัวควบคุมน้ำหนักอย่างสม่ำเสมอ (หากไม่มีอินพุต tf.functions เหล่านี้จึงไม่สามารถแสดงตัวกำหนดกิจกรรมที่สม่ำเสมอได้)รายการนี้สามารถละเว้นได้หากว่างเปล่า โดยเฉพาะอย่างยิ่งหาก SavedModel ไม่รองรับการปรับแต่งอย่างละเอียดหรือไม่ต้องการกำหนดน้ำหนักให้เป็นมาตรฐาน
ฟังก์ชัน __call__
Restored SavedModel obj
มีแอตทริบิวต์ obj.__call__
ที่เป็น tf.function ที่ได้รับการกู้คืน และอนุญาตให้เรียก obj
ได้ดังต่อไปนี้
เรื่องย่อ (รหัสหลอก):
outputs = obj(inputs, trainable=..., **kwargs)
ข้อโต้แย้ง
ข้อโต้แย้งมีดังนี้
มีอาร์กิวเมนต์ที่จำเป็นหนึ่งตำแหน่งพร้อมชุดการเปิดใช้งานอินพุตของ SavedModel ประเภทของมันคือหนึ่งใน
- เทนเซอร์ตัวเดียวสำหรับอินพุตตัวเดียว
- รายการเทนเซอร์สำหรับลำดับอินพุตที่ไม่มีชื่อตามลำดับ
- คำสั่งของเทนเซอร์ที่คีย์โดยชุดชื่ออินพุตเฉพาะ
(การแก้ไขอินเทอร์เฟซนี้ในอนาคตอาจทำให้มีรังทั่วไปมากขึ้น) ผู้สร้าง SavedModel เลือกหนึ่งในนั้น รวมถึงรูปร่างเทนเซอร์และประเภท หากมีประโยชน์ ขนาดบางส่วนของรูปร่างไม่ควรกำหนดไว้ (โดยเฉพาะขนาดแบทช์)
อาจมี
training
อาร์กิวเมนต์คำหลักเสริมที่ยอมรับ Python boolean,True
หรือFalse
ค่าเริ่มต้นคือFalse
หากแบบจำลองรองรับการปรับแต่งอย่างละเอียด และหากการคำนวณแตกต่างกันระหว่างทั้งสอง (เช่น ในการออกกลางคันและการทำให้เป็นมาตรฐานแบบแบตช์) ความแตกต่างนั้นจะถูกนำมาใช้กับอาร์กิวเมนต์นี้ มิฉะนั้นอาร์กิวเมนต์นี้อาจหายไปไม่จำเป็นว่า
__call__
จะต้องยอมรับข้อโต้แย้งtraining
ที่มีค่าเทนเซอร์ ผู้โทรจะต้องใช้tf.cond()
หากจำเป็นในการจัดส่งระหว่างกันผู้สร้าง SavedModel อาจเลือกที่จะยอมรับ
kwargs
ที่เป็นตัวเลือกเพิ่มเติมของชื่อเฉพาะสำหรับอาร์กิวเมนต์ที่มีค่าเทนเซอร์ ผู้สร้าง SavedModel จะกำหนดประเภทและรูปร่างที่อนุญาต
tf.function
ยอมรับค่าเริ่มต้นของ Python ในอาร์กิวเมนต์ที่ติดตามด้วยอินพุต tf.TensorSpec อาร์กิวเมนต์ดังกล่าวสามารถใช้เพื่ออนุญาตการปรับแต่งไฮเปอร์พารามิเตอร์ตัวเลขที่เกี่ยวข้องกับ__call__
(เช่น อัตราการออกกลางคัน)สำหรับอาร์กิวเมนต์ที่มีค่า Python ผู้สร้าง SavedModel จะกำหนดค่าที่อนุญาต อาร์กิวเมนต์ดังกล่าวสามารถใช้เป็นแฟล็กเพื่อสร้างตัวเลือกที่ไม่ต่อเนื่องในฟังก์ชันการติดตาม (แต่ระวังการระเบิดของร่องรอยแบบผสมผสาน)
ฟังก์ชัน __call__
ที่กู้คืนจะต้องจัดเตรียมการติดตามสำหรับชุดอาร์กิวเมนต์ที่อนุญาตทั้งหมด training
พลิกระหว่าง True
และ False
จะต้องไม่เปลี่ยนการอนุญาตของการโต้แย้ง
ผลลัพธ์
outputs
จากการเรียก obj
อาจเป็นได้
- เทนเซอร์ตัวเดียวสำหรับเอาต์พุตตัวเดียว
- รายการเทนเซอร์สำหรับลำดับเอาต์พุตที่ไม่มีชื่อตามลำดับ
- คำสั่งของ Tensors ที่คีย์โดยชุดชื่อเอาต์พุตเฉพาะ
(การแก้ไขอินเทอร์เฟซนี้ในอนาคตอาจทำให้มีรังทั่วไปมากขึ้น) ประเภทการส่งคืนอาจแตกต่างกันไปขึ้นอยู่กับ kwargs ที่มีค่า Python สิ่งนี้ทำให้แฟล็กสร้างเอาต์พุตพิเศษได้ ผู้สร้าง SavedModel กำหนดประเภทและรูปร่างของเอาต์พุตและการพึ่งพาอินพุต
ชื่อที่เรียกได้
SavedModel แบบใช้ซ้ำได้สามารถจัดเตรียมชิ้นส่วนโมเดลได้หลายชิ้นตามที่อธิบายไว้ข้างต้น โดยการใส่ลงในอ็อบเจ็กต์ย่อยที่มีชื่อ เช่น obj.foo
, obj.bar
และอื่นๆ แต่ละวัตถุย่อยจัดเตรียมวิธีการ __call__
และคุณลักษณะที่สนับสนุนเกี่ยวกับตัวแปร ฯลฯ เฉพาะสำหรับชิ้นส่วนโมเดลนั้น สำหรับตัวอย่างข้างต้น จะมี obj.foo.__call__
, obj.foo.variables
และอื่นๆ
โปรดทราบว่าอินเทอร์เฟซนี้ ไม่ ครอบคลุมวิธีการเพิ่ม tf.function เปล่าโดยตรงเป็น tf.foo
ผู้ใช้ Reusable SavedModels ได้รับการคาดหวังให้จัดการการซ้อนระดับเดียวเท่านั้น ( obj.bar
แต่ไม่ใช่ obj.bar.baz
) (การแก้ไขอินเทอร์เฟซนี้ในอนาคตอาจทำให้มีการซ้อนได้ลึกขึ้น และอาจยกเว้นข้อกำหนดที่วัตถุระดับบนสุดสามารถเรียกได้เอง)
คำกล่าวปิดท้าย
ความสัมพันธ์กับ API ในกระบวนการ
เอกสารนี้อธิบายอินเทอร์เฟซของคลาส Python ซึ่งประกอบด้วยพื้นฐาน เช่น tf.function และ tf.Variable ที่สามารถไปกลับได้ผ่านการทำให้เป็นอนุกรมผ่าน tf.saved_model.save()
และ tf.saved_model.load()
อย่างไรก็ตาม อินเทอร์เฟซมีอยู่แล้วบนออบเจ็กต์ต้นฉบับที่ส่งต่อไปยัง tf.saved_model.save()
การปรับให้เข้ากับอินเทอร์เฟซนั้นทำให้สามารถแลกเปลี่ยนชิ้นส่วนโมเดลผ่าน API การสร้างโมเดลภายในโปรแกรม TensorFlow เดียว