มีคำถาม? เชื่อมต่อกับชุมชนที่ฟอรัม TensorFlow เยี่ยมชมฟอรัม

รูปแบบ TF1 Hub

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

หน้านี้อธิบายวิธีใช้รูปแบบ TF1 Hub ใน TF1 (หรือโหมดความเข้ากันได้ของ TF1 ของ TF2) กับ hub.Module คลาส hub.Module และ API ที่เกี่ยวข้อง (การใช้งานโดยทั่วไปคือการสร้าง tf.Graph ซึ่งอาจอยู่ใน Estimator TF1 โดยการรวมโมเดลอย่างน้อยหนึ่งแบบในรูปแบบ 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 อ็อบเจ็กต์ 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 ได้โดยส่ง 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 สนับสนุนให้จัดเตรียมลายเซ็นที่เข้ากันได้ (อินเทอร์เฟซ) ดังนั้นการลองใช้โมดูลต่างๆนั้นง่ายพอ ๆ กับการเปลี่ยนหมายเลขจับโมดูลเป็นไฮเปอร์พารามิเตอร์ที่มีค่าสตริง

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

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

หมายเหตุความเข้ากันได้

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

รูปแบบ TF1 Hub นั้นคล้ายกับรูปแบบ SavedModel ของ TensorFlow 1 ในระดับวากยสัมพันธ์ (ชื่อไฟล์และข้อความโปรโตคอลเดียวกัน) แต่แตกต่างกันอย่างมีนัยสำคัญเพื่อให้สามารถใช้โมดูลซ้ำองค์ประกอบและการฝึกอบรมซ้ำได้ (เช่นการจัดเก็บข้อมูลเริ่มต้นทรัพยากรที่แตกต่างกันการติดแท็กที่แตกต่างกัน อนุสัญญาสำหรับ metagraphs) วิธีที่ง่ายที่สุดในการแยกพวกมันออกจากดิสก์คือการมีหรือไม่มีไฟล์ 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 ในแบบกว้าง (เช่นเชิงเส้นแบบกระจัดกระจาย) หรือแบบกว้างและแบบลึกควรใช้การสูญเสียการทำให้เป็นมาตรฐานของแต่ละบุคคลแทนได้

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