รูปแบบฮับ TF1

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

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

โมดูลแคช

เมื่อสร้างโมดูลจาก 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 ของ TensorFlow หากโมดูลมีหลายรูปแบบกราฟ ตรวจสอบให้แน่ใจว่าได้เลือกรูปแบบที่เหมาะสมสำหรับการฝึกอบรม โดยปกติแล้วจะเป็นอันที่มีแท็ก {"train"}

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

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

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

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

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

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