TF1.x -> ภาพรวมการย้าย TF2

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

ก่อนที่จะย้าย โปรดเรียนรู้เกี่ยวกับลักษณะการทำงานและความแตกต่างของ API ระหว่าง TF1.x และ TF2 โดยการอ่าน คำแนะนำ

  1. เรียกใช้สคริปต์อัตโนมัติเพื่อแปลงการใช้งาน TF1.x API บางส่วนของคุณเป็น tf.compat.v1
  2. ลบสัญลักษณ์ tf.contrib เก่า (ตรวจสอบ TF Addons และ TF-Slim )
  3. ทำให้การส่งต่อโมเดล TF1.x ของคุณรันใน TF2 พร้อมเปิดใช้งานการดำเนินการที่กระตือรือร้น
  4. อัปเกรดโค้ด TF1.x ของคุณสำหรับลูปการฝึกและบันทึก/โหลดโมเดลให้เทียบเท่ากับ TF2
  5. (ไม่บังคับ) ย้าย 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 ไม่รองรับคอลเลกชันทั่วโลก

การดำเนินการอย่างกระตือรือร้นใน 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 เพื่อเรียนรู้เพิ่มเติม

,

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

ก่อนที่จะย้าย โปรดเรียนรู้เกี่ยวกับลักษณะการทำงานและความแตกต่างของ API ระหว่าง TF1.x และ TF2 โดยการอ่าน คำแนะนำ

  1. เรียกใช้สคริปต์อัตโนมัติเพื่อแปลงการใช้งาน TF1.x API บางส่วนของคุณเป็น tf.compat.v1
  2. ลบสัญลักษณ์ tf.contrib เก่า (ตรวจสอบ TF Addons และ TF-Slim )
  3. ทำให้การส่งต่อโมเดล TF1.x ของคุณรันใน TF2 พร้อมเปิดใช้งานการดำเนินการที่กระตือรือร้น
  4. อัปเกรดโค้ด TF1.x ของคุณสำหรับลูปการฝึกและบันทึก/โหลดโมเดลให้เทียบเท่ากับ TF2
  5. (ไม่บังคับ) ย้าย 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 ไม่รองรับคอลเลกชันทั่วโลก

การดำเนินการอย่างกระตือรือร้นใน 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 เพื่อเรียนรู้เพิ่มเติม