TensorFlow 2 โดยพื้นฐานแล้วจะแตกต่างจาก TF1.x ในหลายประการ คุณยังคงสามารถเรียกใช้โค้ด TF1.x ที่ไม่ได้แก้ไข ( ยกเว้น contrib ) กับการติดตั้งไบนารี่ TF2 ดังนี้:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
อย่างไรก็ตาม สิ่งนี้ ไม่ ได้เรียกใช้พฤติกรรมและ API ของ TF2 และอาจไม่ทำงานตามที่คาดไว้กับโค้ดที่เขียนสำหรับ TF2 หากคุณไม่ได้ทำงานโดยเปิดใช้งานลักษณะการทำงานของ TF2 แสดงว่าคุณกำลังใช้งาน TF1.x เพิ่มเติมจากการติดตั้ง TF2 อย่างมีประสิทธิภาพ อ่าน คู่มือพฤติกรรม TF1 กับ TF2 เพื่อดูรายละเอียดเพิ่มเติมว่า TF2 แตกต่างจาก TF1.x อย่างไร
คู่มือนี้ให้ภาพรวมของกระบวนการโยกย้ายโค้ด TF1.x ของคุณไปยัง TF2 สิ่งนี้ช่วยให้คุณสามารถใช้ประโยชน์จากการปรับปรุงคุณสมบัติใหม่และในอนาคต และยังทำให้โค้ดของคุณง่ายขึ้น มีประสิทธิภาพมากขึ้น และบำรุงรักษาง่ายขึ้น
หากคุณใช้ API ระดับสูงของ tf.keras
และการฝึกอบรมเฉพาะกับ model.fit
โค้ดของคุณควรเข้ากันได้กับ TF2 อย่างสมบูรณ์หรือน้อยกว่า ยกเว้นคำเตือนต่อไปนี้:
- TF2 มี อัตราการเรียนรู้เริ่มต้นใหม่ สำหรับเครื่องมือเพิ่มประสิทธิภาพ Keras
- TF2 อาจเปลี่ยน "ชื่อ" ที่ระบบเมตริกบันทึกไว้
กระบวนการย้าย TF2
ก่อนที่จะย้าย โปรดเรียนรู้เกี่ยวกับลักษณะการทำงานและความแตกต่างของ API ระหว่าง TF1.x และ TF2 โดยการอ่าน คำแนะนำ
- เรียกใช้สคริปต์อัตโนมัติเพื่อแปลงการใช้งาน TF1.x API บางส่วนของคุณเป็น
tf.compat.v1
- ลบสัญลักษณ์
tf.contrib
เก่า (ตรวจสอบ TF Addons และ TF-Slim ) - ทำให้การส่งต่อโมเดล TF1.x ของคุณรันใน TF2 พร้อมเปิดใช้งานการดำเนินการที่กระตือรือร้น
- อัปเกรดโค้ด TF1.x ของคุณสำหรับลูปการฝึกและบันทึก/โหลดโมเดลให้เทียบเท่ากับ TF2
- (ไม่บังคับ) ย้าย
tf.compat.v1
API ที่เข้ากันได้กับ TF2 ไปยัง TF2 API ที่มีสำนวน
ส่วนต่อไปนี้จะขยายตามขั้นตอนที่อธิบายไว้ข้างต้น
รันสคริปต์การแปลงสัญลักษณ์
การดำเนินการนี้จะดำเนินการผ่านครั้งแรกเมื่อเขียนสัญลักษณ์โค้ดของคุณใหม่เพื่อทำงานกับไบนารี TF 2.x แต่จะไม่ทำให้โค้ดของคุณเป็นสำนวนเป็น TF 2.x และจะไม่ทำให้โค้ดของคุณเข้ากันได้กับพฤติกรรม TF2 โดยอัตโนมัติ
โค้ดของคุณมักจะยังคงใช้ตำแหน่งข้อมูล tf.compat.v1
เพื่อเข้าถึงตัวยึดตำแหน่ง เซสชัน คอลเลกชัน และฟังก์ชันการทำงานสไตล์ TF1.x อื่นๆ
อ่าน คำแนะนำ เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้สคริปต์การแปลงสัญลักษณ์
ลบการใช้งาน tf.contrib
โมดูล tf.contrib
ถูกเลิกใช้งานแล้ว และโมดูลย่อยหลายโมดูลได้รวมเข้ากับ core TF2 API แล้ว โมดูลย่อยอื่นๆ ได้ถูกแยกออกไปเป็นโปรเจ็กต์อื่นๆ เช่น TF IO และ TF Addons
โค้ด TF1.x รุ่นเก่าจำนวนมากใช้ไลบรารี Slim ซึ่งอัดแน่นไปด้วย TF1.x เป็น tf.contrib.layers
เมื่อย้ายรหัส Slim ของคุณไปยัง TF2 ให้เปลี่ยนการใช้งาน Slim API ของคุณให้ชี้ไปที่ แพ็คเกจ pip tf-slim จากนั้น อ่าน คู่มือการแมปโมเดล เพื่อเรียนรู้วิธีแปลงโค้ด Slim
อีกทางหนึ่ง หากคุณใช้โมเดลที่ได้รับการฝึกล่วงหน้าของ Slim คุณอาจลองใช้โมเดลที่ฝึกล่วงหน้าของ Keras จาก tf.keras.applications
หรือ TF2 SavedModel
ของ TF Hub ที่ส่งออกจากโค้ด Slim ดั้งเดิม
ทำให้การส่งต่อโมเดล TF1.x ทำงานโดยเปิดใช้งานลักษณะการทำงานของ TF2
ติดตามตัวแปรและความสูญเสีย
การดำเนินการอย่างกระตือรือร้นใน TF2 ไม่รองรับ API ที่ใช้คอลเลกชัน tf.Graph
สิ่งนี้ส่งผลต่อวิธีการสร้างและติดตามตัวแปร
สำหรับโค้ด TF2 ใหม่ คุณจะใช้ tf.Variable
แทน v1.get_variable
และใช้อ็อบเจ็กต์ Python เพื่อรวบรวมและติดตามตัวแปรแทน tf.compat.v1.variable_scope
โดยปกติแล้ว นี่จะเป็นหนึ่งใน:
รวมรายการตัวแปร (เช่น tf.Graph.get_collection(tf.GraphKeys.VARIABLES)
) พร้อมด้วยแอตทริบิวต์ .variables
และ .trainable_variables
ของวัตถุ Layer
, Module
หรือ Model
คลาส Layer
และ Model
ใช้คุณสมบัติอื่น ๆ หลายอย่างที่ขจัดความจำเป็นในการรวบรวมทั่วโลก คุณสมบัติ .losses
ของพวกเขาสามารถทดแทนการใช้คอลเลกชัน tf.GraphKeys.LOSSES
ได้
อ่าน คู่มือการแมปโมเดล เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ชิมโค้ด TF2 เพื่อฝังโค้ด get_variable
และ variable_scope
ที่มีอยู่ภายใน Layers
, Models
และ Modules
สิ่งนี้จะช่วยให้คุณสามารถดำเนินการส่งต่อโดยเปิดใช้งานการดำเนินการที่กระตือรือร้นโดยไม่ต้องเขียนซ้ำครั้งใหญ่
ปรับตัวให้เข้ากับการเปลี่ยนแปลงพฤติกรรมอื่นๆ
หาก คู่มือการแม็ปแบบจำลอง เพียงอย่างเดียวไม่เพียงพอที่จะทำให้โมเดลของคุณส่งต่อการเปลี่ยนแปลงลักษณะการทำงานอื่นๆ ที่อาจมีรายละเอียดเพิ่มเติม โปรดดูคำแนะนำเกี่ยวกับ ลักษณะการทำงาน TF1.x และ TF2 เพื่อเรียนรู้เกี่ยวกับการเปลี่ยนแปลงลักษณะการทำงานอื่นๆ และวิธีที่คุณสามารถปรับตัวเข้ากับสิ่งเหล่านั้น . ตรวจสอบ การสร้างเลเยอร์และโมเดลใหม่ผ่านคู่มือคลาสย่อย เพื่อดูรายละเอียด
กำลังตรวจสอบผลลัพธ์ของคุณ
ดู คู่มือการตรวจสอบโมเดล เพื่อดูเครื่องมือง่ายๆ และคำแนะนำเกี่ยวกับวิธีการตรวจสอบ (เชิงตัวเลข) ว่าโมเดลของคุณทำงานอย่างถูกต้องเมื่อเปิดใช้งานการดำเนินการที่กระตือรือร้น คุณอาจพบว่าสิ่งนี้มีประโยชน์อย่างยิ่งเมื่อจับคู่กับ คู่มือการแมปแบบจำลอง
อัปเกรดการฝึกอบรม การประเมิน และรหัสการนำเข้า/ส่งออก
ลูปการฝึกอบรม TF1.x ที่สร้างด้วย v1.Session
-style tf.estimator.Estimator
และวิธีการตามคอลเล็กชันอื่นๆ เข้ากันไม่ได้กับพฤติกรรมใหม่ของ TF2 สิ่งสำคัญคือคุณต้องย้ายโค้ดการฝึกอบรม TF1.x ทั้งหมดของคุณ เนื่องจากการรวมเข้ากับโค้ด TF2 อาจทำให้เกิดพฤติกรรมที่ไม่คาดคิดได้
คุณสามารถเลือกจากหลายกลยุทธ์เพื่อทำสิ่งนี้
แนวทางระดับสูงสุดคือการใช้ tf.keras
ฟังก์ชั่นระดับสูงใน Keras จัดการรายละเอียดระดับต่ำจำนวนมากที่อาจพลาดได้ง่ายหากคุณเขียนลูปการฝึกซ้อมของคุณเอง ตัวอย่างเช่น พวกเขารวบรวมการสูญเสียการทำให้เป็นมาตรฐานโดยอัตโนมัติ และตั้งค่าอาร์กิวเมนต์ training=True
เมื่อเรียกใช้โมเดล
โปรดดู คู่มือการย้าย Estimator เพื่อเรียนรู้วิธีย้ายโค้ดของ tf.estimator.Estimator
เพื่อใช้ vanilla และลูปการฝึก tf.keras
แบบกำหนดเอง
ลูปการฝึกแบบกำหนดเองช่วยให้คุณควบคุมโมเดลของคุณได้ละเอียดยิ่งขึ้น เช่น การติดตามน้ำหนักของแต่ละเลเยอร์ อ่านคำแนะนำเกี่ยวกับ การสร้างลูปการฝึกตั้งแต่เริ่มต้น เพื่อเรียนรู้วิธีใช้ tf.GradientTape
เพื่อดึงน้ำหนักโมเดลและใช้เพื่ออัปเดตโมเดล
แปลงเครื่องมือเพิ่มประสิทธิภาพ TF1.x เป็นเครื่องมือเพิ่มประสิทธิภาพ Keras
เครื่องมือเพิ่มประสิทธิภาพใน tf.compat.v1.train
เช่น Adam Optimizer และ เครื่องมือเพิ่มประสิทธิภาพการไล่ระดับสี มีการเทียบเท่าใน tf.keras.optimizers
ตารางด้านล่างสรุปวิธีที่คุณสามารถแปลงเครื่องมือเพิ่มประสิทธิภาพแบบเดิมเหล่านี้ให้เทียบเท่ากับ Keras ได้ คุณสามารถแทนที่เวอร์ชัน TF1.x ด้วยเวอร์ชัน TF2 ได้โดยตรง เว้นแต่จะต้องมีขั้นตอนเพิ่มเติม (เช่น การอัปเดตอัตราการเรียนรู้เริ่มต้น )
โปรดทราบว่าการแปลงเครื่องมือเพิ่มประสิทธิภาพของคุณ อาจทำให้จุดตรวจสอบเก่าเข้ากันไม่ได้
TF1.x | ทีเอฟ2 | ขั้นตอนเพิ่มเติม |
---|---|---|
`tf.v1.train.GradientDescentOptimizer` | tf.keras.optimizers.SGD | ไม่มี |
`tf.v1.train.MomentumOptimizer` | tf.keras.optimizers.SGD | รวมอาร์กิวเมนต์ 'โมเมนตัม' |
`tf.v1.train.อดัมเพิ่มประสิทธิภาพ` | tf.keras.optimizers.Adam | เปลี่ยนชื่ออาร์กิวเมนต์ `beta1` และ `beta2` เป็น `beta_1` และ `beta_2` |
`tf.v1.train.RMSPropOptimizer` | tf.keras.optimizers.RMSprop | เปลี่ยนชื่ออาร์กิวเมนต์ 'decay' เป็น 'rho' |
`tf.v1.train.AdadeltaOptimizer` | tf.keras.optimizers.Adadelta | ไม่มี |
`tf.v1.train.AdagradOptimizer` | tf.keras.optimizers.Adagrad | ไม่มี |
`tf.v1.train.FtrlOptimizer` | tf.keras.optimizers.Ftrl | ลบอาร์กิวเมนต์ `accum_name` และ `linear_name` |
`tf.contrib.AdamaxOptimizer` | tf.keras.optimizers.Adamax | เปลี่ยนชื่ออาร์กิวเมนต์ `beta1` และ `beta2` เป็น `beta_1` และ `beta_2` |
`tf.contrib.นาดัม` | tf.keras.optimizers.Nadam | เปลี่ยนชื่ออาร์กิวเมนต์ `beta1` และ `beta2` เป็น `beta_1` และ `beta_2` |
อัปเกรดไปป์ไลน์ป้อนข้อมูล
มีหลายวิธีในการป้อนข้อมูลไปยังโมเดล tf.keras
พวกเขาจะยอมรับตัวสร้าง Python และอาร์เรย์ Numpy เป็นอินพุต
วิธีที่แนะนำในการป้อนข้อมูลให้กับโมเดลคือการใช้แพ็คเกจ tf.data
ซึ่งมีคอลเลกชันของคลาสประสิทธิภาพสูงสำหรับจัดการข้อมูล dataset
ที่เป็นของ tf.data
นั้นมีประสิทธิภาพ แสดงออกได้ชัดเจน และผสานรวมกับ TF2 ได้เป็นอย่างดี
สามารถส่งผ่านโดยตรงไปยังเมธอด tf.keras.Model.fit
model.fit(dataset, epochs=5)
สามารถวนซ้ำผ่าน Python มาตรฐานโดยตรง:
for example_batch, label_batch in dataset:
break
หากคุณยังคงใช้ tf.queue
อยู่ สิ่งเหล่านี้จะรองรับเป็นโครงสร้างข้อมูลเท่านั้น ไม่ใช่ไปป์ไลน์อินพุต
คุณควรย้ายโค้ดการประมวลผลล่วงหน้าของฟีเจอร์ทั้งหมดที่ใช้ tf.feature_columns
อ่าน คู่มือการย้าย ข้อมูลเพื่อดูรายละเอียดเพิ่มเติม
การบันทึกและการโหลดโมเดล
TF2 ใช้จุดตรวจตามวัตถุ อ่าน คู่มือการย้ายจุดตรวจ เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการย้ายจุดตรวจ TF1.x ตามชื่อ อ่าน คู่มือจุดตรวจ ในเอกสารหลักของ TensorFlow ด้วย
ไม่มีข้อกังวลด้านความเข้ากันได้ที่สำคัญสำหรับรุ่นที่บันทึกไว้ อ่าน คู่มือ SavedModel
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการย้าย SavedModel
s ใน TF1.x ไปยัง TF2 โดยทั่วไปแล้ว
- TF1.x save_models ทำงานใน TF2
- TF2 save_models ทำงานใน TF1.x หากรองรับ ops ทั้งหมด
นอกจากนี้ โปรดดู ส่วน GraphDef
ในคู่มือการย้าย SavedModel
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานกับออบเจ็กต์ Graph.pb
และ Graph.pbtxt
(ไม่บังคับ) ย้ายสัญลักษณ์ tf.compat.v1
ออก
โมดูล tf.compat.v1
มี TF1.x API ที่สมบูรณ์พร้อมความหมายดั้งเดิม
แม้หลังจากทำตามขั้นตอนข้างต้นและลงท้ายด้วยโค้ดที่เข้ากันได้กับพฤติกรรม TF2 ทั้งหมดอย่างสมบูรณ์ ก็มีแนวโน้มว่าจะมีการกล่าวถึง compat.v1
apis หลายครั้งที่เข้ากันได้กับ TF2 คุณควรหลีกเลี่ยงการใช้ compat.v1
apis รุ่นเก่าเหล่านี้กับโค้ดใหม่ที่คุณเขียน แม้ว่าโค้ดเหล่านั้นจะยังคงใช้งานได้กับโค้ดที่คุณเขียนไว้แล้วก็ตาม
อย่างไรก็ตาม คุณอาจเลือกที่จะย้ายการใช้งานที่มีอยู่ไปยัง TF2 API ที่ไม่ใช่แบบเดิมได้ เอกสารของสัญลักษณ์ compat.v1
แต่ละตัวมักจะอธิบายวิธีโยกย้ายสัญลักษณ์เหล่านั้นไปยัง TF2 API ที่ไม่ใช่แบบเดิม นอกจากนี้ ส่วนของคู่มือการแมปโมเดลเกี่ยวกับการโยกย้ายส่วนเพิ่มไปยัง TF2 API ที่มีสำนวน อาจช่วยได้เช่นกัน
แหล่งข้อมูลและการอ่านเพิ่มเติม
ตามที่กล่าวไว้ก่อนหน้านี้ แนวทางปฏิบัติที่ดีในการโยกย้ายรหัส TF1.x ทั้งหมดของคุณไปยัง TF2 อ่านคำแนะนำใน ส่วน Migrate to TF2 ของคู่มือ TensorFlow เพื่อเรียนรู้เพิ่มเติม