หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

รูปแบบ TF1 Hub

เมื่อเปิดตัวในปี 2561 TensorFlow Hub นำเสนอเนื้อหาประเภทเดียว: รูปแบบ TF1 Hub สำหรับนำเข้าสู่โปรแกรม TensorFlow 1

หน้านี้อธิบายวิธีใช้รูปแบบ TF1 Hub ใน TF1 (หรือโหมดความเข้ากันได้ TF1 ของ TF2) กับ hub.Module คลาส hub.Module และ API ที่เกี่ยวข้อง (การใช้งานทั่วไปคือการสร้าง tf.Graph ซึ่งอาจอยู่ใน TF1 Estimator โดยการรวมหนึ่งรุ่นขึ้นไปในรูปแบบ TF1 Hub กับ tf.compat.layers หรือ tf.layers )

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

การใช้แบบจำลองในรูปแบบ TF1 Hub

สร้างโมเดลในรูปแบบ TF1 Hub ทันที

แบบจำลองในรูปแบบ TF1 Hub จะถูกนำเข้าสู่โปรแกรม TensorFlow โดยการสร้างวัตถุ hub.Module จากสตริงที่มี URL หรือเส้นทางของระบบไฟล์เช่น:

 m = hub.Module("path/to/a/module_dir")
 

สิ่งนี้จะเพิ่มตัวแปรของโมดูลไปยังกราฟ TensorFlow ปัจจุบัน การรัน initializers จะอ่านค่าที่ได้รับการฝึกฝนมาจากดิสก์ เช่นเดียวกันตารางและสถานะอื่น ๆ จะถูกเพิ่มลงในกราฟ

โมดูลแคช

เมื่อสร้างโมดูลจาก URL เนื้อหาโมดูลจะถูกดาวน์โหลดและแคชในไดเร็กทอรีชั่วคราวของระบบโลคัล ตำแหน่งที่โมดูลถูกแคชสามารถเขียนทับได้โดยใช้ตัวแปรสภาพแวดล้อม TFHUB_CACHE_DIR สำหรับรายละเอียดดูที่ การแคช

การใช้โมดูล

เมื่ออินสแตนซ์แล้วโมดูล m สามารถถูกเรียกได้ว่าเป็นศูนย์หรือมากกว่านั้นเช่นฟังก์ชั่น Python จากอินพุตเทนเซอร์ถึงเอาต์พุตเทนเซอร์:

 y = m(x)
 

การเรียกแต่ละครั้งดังกล่าวจะเพิ่มการดำเนินการไปยังกราฟ TensorFlow ปัจจุบันเพื่อคำนวณ y จาก x หากสิ่งนี้เกี่ยวข้องกับตัวแปรที่มีตุ้มน้ำหนักที่ผ่านการฝึกอบรมสิ่งเหล่านี้จะถูกแบ่งปันระหว่างแอปพลิเคชันทั้งหมด

โมดูลสามารถกำหนด ลายเซ็นที่มี ชื่อหลายรายการเพื่อให้สามารถใช้งานได้มากกว่าหนึ่งวิธี (คล้ายกับที่วัตถุ Python มี วิธีการ ) เอกสารของโมดูลควรอธิบายลายเซ็นที่มีอยู่ การโทรด้านบนใช้ลายเซ็นชื่อ "default" ลายเซ็นใด ๆ สามารถเลือกได้โดยส่งชื่อไปยังอาร์กิวเมนต์ signature= เป็นทางเลือก

หากลายเซ็นมีหลายอินพุตมันจะต้องถูกส่งเป็น dict พร้อมกับคีย์ที่กำหนดโดยลายเซ็น ในทำนองเดียวกันถ้าลายเซ็นมีเอาต์พุตหลายรายการสามารถเรียกคืนเป็น dict โดยส่ง as_dict=True ภายใต้คีย์ที่กำหนดโดยลายเซ็น (คีย์ "default" คือสำหรับเอาต์พุตเดี่ยวที่ส่งคืนถ้า as_dict=False ) ดังนั้นรูปแบบทั่วไปที่สุดของการใช้โมดูลดูเหมือนว่า:

 outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]
 

ผู้เรียกต้องระบุอินพุตทั้งหมดที่กำหนดโดยลายเซ็น แต่ไม่มีข้อกำหนดที่จะใช้เอาต์พุตทั้งหมดของโมดูล TensorFlow จะเรียกใช้เฉพาะส่วนต่าง ๆ ของโมดูลที่ลงท้ายด้วยการขึ้นต่อกันของเป้าหมายใน tf.Session.run() แน่นอนผู้เผยแพร่โมดูลอาจเลือกที่จะให้ผลลัพธ์ที่หลากหลายสำหรับการใช้งานขั้นสูง (เช่นการเปิดใช้งานของเลเยอร์กลาง) พร้อมกับเอาท์พุทหลัก ผู้บริโภคโมดูลควรจัดการกับเอาต์พุตเพิ่มเติมอย่างนุ่มนวล

ลองใช้โมดูลทางเลือก

เมื่อใดก็ตามที่มีหลายโมดูลสำหรับงานเดียวกัน TensorFlow Hub สนับสนุนให้ติดตั้ง signartures (อินเตอร์เฟส) ที่เข้ากันได้ซึ่งการลองใช้โมดูลที่แตกต่างกันนั้นเป็นเรื่องง่ายเหมือนกับการเปลี่ยนโมดูลจัดการเป็นพารามิเตอร์ไฮเปอร์สตริง

ด้วยเหตุนี้เราจึงเก็บรวบรวม ลายเซ็นทั่วไปที่ แนะนำสำหรับงานที่ได้รับความนิยม

การสร้างโมดูลใหม่

บันทึกความเข้ากันได้

รูปแบบ TF1 Hub นั้นมุ่งเน้นไปที่ TensorFlow 1 รองรับ TF Hub เพียงบางส่วนใน TensorFlow 2 โปรดพิจารณาเผยแพร่ในรูปแบบ TF2 SavedModel ใหม่แทน

รูปแบบ TF1 Hub นั้นคล้ายคลึงกับรูปแบบ SavedModel ของ TensorFlow 1 ในระดับ syntactic (ชื่อไฟล์และข้อความโปรโตคอลเดียวกัน) แต่มีความแตกต่างทางความหมายเพื่อให้สามารถนำโมดูลกลับมาใช้ใหม่การจัดองค์ประกอบและการฝึกอบรมใหม่ (เช่นหน่วยเก็บข้อมูลที่แตกต่างกัน อนุสัญญาสำหรับย่อหน้า) วิธีที่ง่ายที่สุดในการแยกออกจากดิสก์คือการมีหรือไม่มีไฟล์ tfhub_module.pb

วิธีการทั่วไป

ในการกำหนดโมดูลใหม่สำนักพิมพ์จะเรียก hub.create_module_spec() ด้วยฟังก์ชั่น module_fn ฟังก์ชั่นนี้สร้างกราฟที่แสดงถึงโครงสร้างภายในของโมดูลโดยใช้ tf.placeholder() สำหรับอินพุตที่ได้รับจากผู้โทร จากนั้นจะกำหนดลายเซ็นโดยเรียก hub.add_signature(name, inputs, outputs) หนึ่งครั้งขึ้นไป

ตัวอย่างเช่น:

 def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)
 

ผลลัพธ์ของ hub.create_module_spec() สามารถใช้แทนพา ธ เพื่อยกตัวอย่างวัตถุโมดูลภายในกราฟ TensorFlow ในกรณีเช่นนี้จะไม่มีจุดตรวจและอินสแตนซ์ของโมดูลจะใช้ตัวแปรเริ่มต้นแทน

อินสแตนซ์ของโมดูลใด ๆ สามารถต่อเนื่องกับดิสก์ผ่านวิธีการ export(path, session) การเอ็กซ์พอร์ตโมดูลเป็นอนุกรมคำจำกัดความของมันพร้อมกับสถานะปัจจุบันของตัวแปรใน session เข้าไปในเส้นทางผ่าน สิ่งนี้สามารถใช้เมื่อส่งออกโมดูลเป็นครั้งแรกเช่นเดียวกับเมื่อส่งออกโมดูลที่ปรับละเอียด

สำหรับความเข้ากันได้กับ TensorFlow Estimators, hub.LatestModuleExporter ส่งออกโมดูลจากจุดตรวจสอบล่าสุดเช่นเดียวกับ tf.estimator.LatestExporter ส่งออกทั้งโมเดลจากจุดตรวจสอบล่าสุด

ผู้เผยแพร่โมดูลควรใช้ ลายเซ็นร่วมกัน เมื่อเป็นไปได้เพื่อให้ผู้บริโภคสามารถแลกเปลี่ยนโมดูลและค้นหาสิ่งที่ดีที่สุดสำหรับปัญหาของพวกเขา

ตัวอย่างจริง

ดูตัวอย่าง ผู้ส่งออกโมดูลการฝังข้อความ ของเราสำหรับตัวอย่างจริงของวิธีสร้างโมดูลจากรูปแบบการฝังข้อความทั่วไป

ปรับจูน

การฝึกอบรมตัวแปรของโมดูลที่นำเข้าพร้อมกับโมเดลที่อยู่รอบตัวเรียกว่าการ ปรับละเอียด การปรับจูนอย่างละเอียดอาจส่งผลให้มีคุณภาพที่ดีขึ้น แต่เพิ่มภาวะแทรกซ้อนใหม่ เราแนะนำให้ผู้บริโภคพิจารณาปรับแต่งอย่างละเอียดหลังจากสำรวจการปรับแต่งคุณภาพที่ง่ายขึ้นและเฉพาะในกรณีที่ผู้เผยแพร่โมดูลแนะนำเท่านั้น

สำหรับผู้บริโภค

หากต้องการเปิดใช้งานการปรับจูนให้ยกตัวอย่างโมดูลด้วย hub.Module(..., trainable=True) เพื่อทำให้ตัวแปรสามารถฝึกอบรมได้และนำเข้า REGULARIZATION_LOSSES ของ REGULARIZATION_LOSSES หากโมดูลมีหลายกราฟให้เลือกที่เหมาะสมสำหรับการฝึกอบรม โดยปกตินั่นคือแท็ก {"train"}

เลือกระบอบการฝึกอบรมที่ไม่ทำลายน้ำหนักที่ได้รับการฝึกฝนมาก่อนเช่นอัตราการเรียนรู้ต่ำกว่าการฝึกฝนตั้งแต่เริ่มต้น

สำหรับผู้จัดพิมพ์

เพื่อให้การปรับจูนง่ายขึ้นสำหรับผู้บริโภคโปรดคำนึงถึงสิ่งต่อไปนี้:

  • การปรับละเอียดต้องการการทำให้เป็นปกติ โมดูลของคุณจะถูกส่งออกด้วยคอลเลกชัน REGULARIZATION_LOSSES ซึ่งเป็นสิ่งที่ทำให้คุณเลือก tf.layers.dense(..., kernel_regularizer=...) ฯลฯ เป็นสิ่งที่ผู้บริโภคได้รับจาก tf.losses.get_regularization_losses() ชอบวิธีนี้ในการกำหนดการสูญเสียการทำให้เป็นมาตรฐานของ L1 / L2

  • ในรูปแบบสำนักพิมพ์, หลีกเลี่ยงการกำหนด L1 / L2 regularization ผ่าน l1_ และ l2_regularization_strength พารามิเตอร์ของ tf.train.FtrlOptimizer , tf.train.ProximalGradientDescentOptimizer และเพิ่มประสิทธิภาพใกล้เคียงอื่น ๆ สิ่งเหล่านี้ไม่ได้ถูกส่งออกไปพร้อมกับโมดูลและการตั้งค่าความแรงของการทำให้เป็นมาตรฐานทั่วโลกอาจไม่เหมาะสมสำหรับผู้บริโภค ยกเว้นการทำให้เป็นมาตรฐาน L1 ในแบบกว้าง (เช่นแบบกระจายเชิงเส้น) หรือแบบจำลองแบบกว้างและลึกคุณควรใช้ความสูญเสียการทำให้เป็นมาตรฐานแต่ละแบบแทน

  • หากคุณใช้การออกกลางคันการปรับสภาพแบทช์หรือเทคนิคการฝึกอบรมที่คล้ายกันให้ตั้งค่าพารามิเตอร์ในพารามิเตอร์เหล่านั้นเป็นค่าที่เหมาะสมสำหรับการใช้งานที่คาดหวัง อาจต้องปรับอัตราการออกกลางคันตามแนวโน้มปัญหา ในการทำให้เป็นมาตรฐานแบตช์โมเมนตัม (สัมประสิทธิ์การสลายตัวของที่รู้จัก) ควรมีขนาดเล็กพอที่จะเปิดใช้งานการปรับจูนด้วยชุดข้อมูลขนาดเล็กและ / หรือแบทช์ขนาดใหญ่ สำหรับผู้บริโภคขั้นสูงให้พิจารณาการเพิ่มลายเซ็นต์ที่เปิดเผยการควบคุมพารามิเตอร์ที่มีความสำคัญมาก