การย้ายจาก TF1 ไปยัง TF2 ด้วย TensorFlow Hub

หน้านี้อธิบายวิธีใช้ TensorFlow Hub ต่อไปในขณะที่ย้ายโค้ด TensorFlow จาก TensorFlow 1 ไปยัง TensorFlow 2 ซึ่งจะช่วยเสริม คู่มือการย้าย ทั่วไปของ TensorFlow

สำหรับ TF2 นั้น TF Hub ได้เปลี่ยนจาก hub.Module แบบเดิม Module API สำหรับการสร้าง tf.compat.v1.Graph เช่นเดียวกับ tf.contrib.v1.layers ขณะนี้มี hub.KerasLayer แทนสำหรับใช้ร่วมกับเลเยอร์ Keras อื่นๆ สำหรับการสร้าง tf.keras.Model (โดยทั่วไปใน สภาพแวดล้อมการประมวลผลที่กระตือรือร้น ใหม่ของ TF2 ) และวิธีการ hub.load() พื้นฐานสำหรับโค้ด TensorFlow ระดับต่ำ

hub.Module API ยังคงมีอยู่ในไลบรารี tensorflow_hub เพื่อใช้ใน TF1 และในโหมดความเข้ากันได้ของ TF1 ของ TF2 สามารถโหลดโมเดลใน รูปแบบ TF1 Hub เท่านั้น

API ใหม่ของ hub.load() และ hub.KerasLayer ใช้งานได้กับ TensorFlow 1.15 (ในโหมดกระตือรือร้นและกราฟ) และใน TensorFlow 2 API ใหม่นี้สามารถโหลดสินทรัพย์ TF2 SavedModel ใหม่ได้ และด้วยข้อจำกัดที่กำหนดไว้ใน โมเดล คู่มือความเข้ากันได้ รุ่นดั้งเดิมในรูปแบบ TF1 Hub

โดยทั่วไป ขอแนะนำให้ใช้ API ใหม่ทุกครั้งที่เป็นไปได้

สรุป API ใหม่

hub.load() เป็นฟังก์ชันระดับต่ำใหม่ในการโหลด SavedModel จาก TensorFlow Hub (หรือบริการที่รองรับ) มันล้อม tf.saved_model.load() ของ TF2 ; SavedModel Guide ของ TensorFlow จะอธิบายสิ่งที่คุณสามารถทำได้กับผลลัพธ์

m = hub.load(handle)
outputs = m(inputs)

คลาส hub.KerasLayer เรียก hub.load() และปรับผลลัพธ์เพื่อใช้ใน Keras ควบคู่ไปกับเลเยอร์ Keras อื่นๆ (อาจเป็น wrapper ที่สะดวกสำหรับ SavedModels ที่โหลดซึ่งใช้ในรูปแบบอื่น)

model = tf.keras.Sequential([
    hub.KerasLayer(handle),
    ...])

บทช่วยสอนจำนวนมากแสดงการทำงานของ API เหล่านี้ นี่คือตัวอย่างบางส่วน:

การใช้ API ใหม่ในการฝึกอบรมเครื่องมือประมาณค่า

หากคุณใช้ TF2 SavedModel ใน Estimator สำหรับการฝึกกับเซิร์ฟเวอร์พารามิเตอร์ (หรืออย่างอื่นในเซสชัน TF1 ที่มีตัวแปรวางไว้บนอุปกรณ์ระยะไกล) คุณจะต้องตั้งค่า experimental.share_cluster_devices_in_session ใน ConfigProto ของ tf.Session ไม่เช่นนั้นคุณจะได้รับข้อผิดพลาด เช่น "อุปกรณ์ที่ได้รับมอบหมาย '/job:ps/replica:0/task:0/device:CPU:0' ไม่ตรงกับอุปกรณ์ใดๆ"

ตัวเลือกที่จำเป็นสามารถตั้งค่าได้เช่น

session_config = tf.compat.v1.ConfigProto()
session_config.experimental.share_cluster_devices_in_session = True
run_config = tf.estimator.RunConfig(..., session_config=session_config)
estimator = tf.estimator.Estimator(..., config=run_config)

ตั้งแต่ TF2.2 เป็นต้นไป ตัวเลือกนี้จะไม่ถือเป็นการทดลองอีกต่อไป และสามารถดรอปชิ้นส่วน . .experimental ได้

กำลังโหลดโมเดลรุ่นเก่าในรูปแบบ TF1 Hub

อาจเกิดขึ้นได้ว่า TF2 SavedModel ใหม่ยังไม่พร้อมใช้งานสำหรับกรณีการใช้งานของคุณ และคุณจำเป็นต้องโหลดโมเดลเดิมในรูปแบบ TF1 Hub เริ่มต้นใน tensorflow_hub รีลีส 0.7 คุณสามารถใช้โมเดลดั้งเดิมในรูปแบบ TF1 Hub ร่วมกับ hub.KerasLayer ดังที่แสดงด้านล่าง:

m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)

นอกจากนี้ KerasLayer ยังเปิดเผยความสามารถในการระบุ tags , signature , output_key และ signature_outputs_as_dict สำหรับการใช้งานที่เฉพาะเจาะจงมากขึ้นของโมเดลรุ่นเก่าในรูปแบบ TF1 Hub และ SavedModels รุ่นเก่า

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความเข้ากันได้ของรูปแบบ TF1 Hub โปรดดู คู่มือความเข้ากันได้ของรุ่น

การใช้ API ระดับล่าง

สามารถโหลดโมเดลรูปแบบ TF1 Hub รุ่นเก่าได้ผ่าน tf.saved_model.load แทน

# DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)

ขอแนะนำให้ใช้:

# TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)

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