หน้านี้อธิบายลายเซ็นทั่วไปที่ควรนำไปใช้โดยโมดูลใน รูปแบบ TF1 Hub สำหรับงานที่เกี่ยวข้องกับรูปภาพ (สำหรับ รูปแบบ TF2 SavedModel โปรดดูที่ SavedModel API ที่คล้ายคลึงกัน)
โมดูลบางโมดูลสามารถนำไปใช้งานได้มากกว่าหนึ่งงาน (เช่น โมดูลการจำแนกประเภทรูปภาพมีแนวโน้มที่จะแยกคุณสมบัติบางอย่างออกไป) ดังนั้น แต่ละโมดูลจึงจัดเตรียม (1) ลายเซ็นที่มีชื่อสำหรับงานทั้งหมดที่ผู้จัดพิมพ์คาดการณ์ไว้ และ (2) output = m(images)
สำหรับงานหลักที่กำหนด
ภาพคุณลักษณะเวกเตอร์
สรุปการใช้งาน
เวกเตอร์คุณลักษณะรูปภาพ คือเทนเซอร์ 1 มิติที่มีความหนาแน่นซึ่งเป็นตัวแทนของรูปภาพทั้งหมด โดยทั่วไปสำหรับการจำแนกประเภทตามรุ่นผู้บริโภค (ต่างจากการเปิดใช้งานระดับกลางของ CNN ตรงที่ไม่มีการแจกแจงเชิงพื้นที่ ต่างจาก การจัดหมวดหมู่รูปภาพ โดยจะละทิ้งการจัดหมวดหมู่ที่เรียนรู้จากโมเดลของผู้จัดพิมพ์)
โมดูลสำหรับการดึงคุณลักษณะรูปภาพมีลายเซ็นเริ่มต้นที่จับคู่ชุดรูปภาพกับชุดเวกเตอร์คุณลักษณะ มันสามารถใช้งานได้ดังนี้:
module_spec = hub.load_module_spec("path/to/module")
height, width = hub.get_expected_image_size(module_spec)
images = ... # A batch of images with shape [batch_size, height, width, 3].
module = hub.Module(module_spec)
features = module(images) # A batch with shape [batch_size, num_features].
นอกจากนี้ยังกำหนดลายเซ็นที่มีชื่อที่สอดคล้องกันอีกด้วย
ข้อกำหนดลายเซ็น
ลายเซ็นที่มีชื่อสำหรับการแยกเวกเตอร์คุณลักษณะรูปภาพถูกเรียกใช้เป็น
outputs = module(dict(images=images), signature="image_feature_vector",
as_dict=True)
features = outputs["default"]
อินพุตเป็นไปตามแบบแผนทั่วไปสำหรับ การป้อนรูปภาพ
พจนานุกรมเอาต์พุตประกอบด้วยเอาต์พุต "default"
ของ dtype float32
และรูปร่าง [batch_size, num_features]
batch_size
เหมือนกับในอินพุต แต่ไม่ทราบเวลาในการสร้างกราฟ num_features
เป็นค่าคงที่เฉพาะโมดูลที่ทราบ โดยไม่ขึ้นกับขนาดอินพุต
เวกเตอร์ฟีเจอร์เหล่านี้มีไว้เพื่อใช้สำหรับการจำแนกประเภทด้วยตัวแยกประเภทฟีดไปข้างหน้าอย่างง่าย (เช่นคุณสมบัติที่รวมกลุ่มจากเลเยอร์ convolutional บนสุดใน CNN ทั่วไปสำหรับการจัดหมวดหมู่รูปภาพ)
การใช้ dropout กับคุณสมบัติเอาต์พุต (หรือไม่) ควรปล่อยให้ผู้ใช้โมดูล ตัวโมดูลเองไม่ควรทำการดรอปเอาท์กับเอาท์พุตจริง (แม้ว่าจะใช้ดรอปเอาท์ภายในที่อื่นก็ตาม)
พจนานุกรมเอาต์พุตอาจให้เอาต์พุตเพิ่มเติม เช่น การเปิดใช้งานเลเยอร์ที่ซ่อนอยู่ภายในโมดูล คีย์และค่าขึ้นอยู่กับโมดูล ขอแนะนำให้ใส่ชื่อสถาปัตยกรรมนำหน้าคีย์ที่ขึ้นกับสถาปัตยกรรม (เช่น เพื่อหลีกเลี่ยงความสับสนระหว่างเลเยอร์กลาง "InceptionV3/Mixed_5c"
กับเลเยอร์ convolutional บนสุด "InceptionV2/Mixed_5c"
)
การจำแนกประเภทภาพ
สรุปการใช้งาน
การจัดหมวดหมู่รูปภาพ จะจับคู่พิกเซลของรูปภาพกับคะแนนเชิงเส้น (บันทึก) สำหรับการเป็นสมาชิกในคลาสของอนุกรมวิธาน ที่เลือกโดยผู้เผยแพร่โมดูล สิ่งนี้ช่วยให้ผู้บริโภคสามารถสรุปได้จากการจัดหมวดหมู่เฉพาะที่เรียนรู้จากโมดูลผู้เผยแพร่ ไม่ใช่แค่คุณลักษณะพื้นฐานเท่านั้น (เทียบกับ Image Feature Vector )
โมดูลสำหรับการดึงคุณสมบัติรูปภาพมีลายเซ็นเริ่มต้นที่แมปชุดรูปภาพกับชุดการบันทึก มันสามารถใช้งานได้ดังนี้:
module_spec = hub.load_module_spec("path/to/module")
height, width = hub.get_expected_image_size(module_spec)
images = ... # A batch of images with shape [batch_size, height, width, 3].
module = hub.Module(module_spec)
logits = module(images) # A batch with shape [batch_size, num_classes].
นอกจากนี้ยังกำหนดลายเซ็นที่มีชื่อที่สอดคล้องกันอีกด้วย
ข้อกำหนดลายเซ็น
ลายเซ็นที่มีชื่อสำหรับการแยกเวกเตอร์คุณลักษณะรูปภาพถูกเรียกใช้เป็น
outputs = module(dict(images=images), signature="image_classification",
as_dict=True)
logits = outputs["default"]
อินพุตเป็นไปตามแบบแผนทั่วไปสำหรับ การป้อนรูปภาพ
พจนานุกรมเอาต์พุตประกอบด้วยเอาต์พุต "default"
ของ dtype float32
และรูปร่าง [batch_size, num_classes]
batch_size
เหมือนกับในอินพุต แต่ไม่ทราบเวลาในการสร้างกราฟ num_classes
คือจำนวนคลาสในการจำแนกประเภท ซึ่งเป็นค่าคงที่ที่ทราบโดยไม่ขึ้นอยู่กับขนาดอินพุต
การประเมิน outputs["default"][i, c]
จะทำให้ได้คะแนนที่ทำนายความเป็นสมาชิกของตัวอย่าง i
ในคลาสที่มีดัชนี c
ขึ้นอยู่กับการจำแนกประเภทพื้นฐานว่าคะแนนเหล่านี้มีไว้สำหรับใช้กับ softmax (สำหรับคลาสที่ไม่เกิดร่วมกัน), sigmoid (สำหรับคลาส orthogonal) หรืออย่างอื่น เอกสารประกอบของโมดูลควรอธิบายสิ่งนี้ และอ้างอิงถึงคำจำกัดความของดัชนีคลาส
พจนานุกรมเอาต์พุตอาจให้เอาต์พุตเพิ่มเติม เช่น การเปิดใช้งานเลเยอร์ที่ซ่อนอยู่ภายในโมดูล คีย์และค่าขึ้นอยู่กับโมดูล ขอแนะนำให้ใส่ชื่อสถาปัตยกรรมนำหน้าคีย์ที่ขึ้นอยู่กับสถาปัตยกรรม (เช่น เพื่อหลีกเลี่ยงไม่ให้เลเยอร์กลาง "InceptionV3/Mixed_5c"
สับสนกับเลเยอร์ Convolutional บนสุด "InceptionV2/Mixed_5c"
)
อินพุตรูปภาพ
นี่เป็นเรื่องปกติสำหรับโมดูลรูปภาพและลายเซ็นรูปภาพทุกประเภท
ลายเซ็นที่รับชุดรูปภาพเป็นอินพุตยอมรับว่าเป็นเทนเซอร์ 4-D ที่หนาแน่นของ dtype float32
และรูปร่าง [batch_size, height, width, 3]
ซึ่งมีองค์ประกอบเป็นค่าสี RGB ของพิกเซลที่ปรับให้เป็นมาตรฐานในช่วง [0, 1] . นี่คือสิ่งที่คุณได้รับจากตามด้วย tf.image.decode_*()
tf.image.convert_image_dtype(..., tf.float32)
โมดูลที่มีการป้อนข้อมูลรูปภาพหนึ่งรายการ (หรือหนึ่งรายการหลัก) จะใช้ชื่อ "images"
สำหรับอินพุตนี้
โมดูลยอมรับ batch_size
ใด ๆ และตั้งค่ามิติแรกของ TensorInfo.tensor_shape เป็น "unknown" ตามลำดับ มิติสุดท้ายถูกกำหนดไว้ที่หมายเลข 3
ของช่อง RGB ขนาด height
และ width
ถูกกำหนดให้เป็นขนาดที่คาดไว้ของรูปภาพอินพุต (งานในอนาคตอาจลบข้อจำกัดนั้นสำหรับโมดูลแบบหมุนวนทั้งหมด)
ผู้ใช้โมดูลไม่ควรตรวจสอบรูปร่างโดยตรง แต่รับข้อมูลขนาดโดยการเรียก hub.get_expected_image_size() บนโมดูลหรือข้อมูลจำเพาะของโมดูล และคาดว่าจะปรับขนาดอิมเมจอินพุตตามนั้น (โดยทั่วไปจะเป็นก่อน/ระหว่างการแบตช์)
เพื่อความเรียบง่าย โมดูล TF-Hub จะใช้เค้าโครง channels_last
(หรือ NHWC
) ของ Tensors และปล่อยให้เป็นหน้าที่ของเครื่องมือเพิ่มประสิทธิภาพกราฟของ TensorFlow เพื่อเขียนใหม่เป็น channels_first
(หรือ NCHW
) หากจำเป็น โดยค่าเริ่มต้นจะทำอย่างนั้นมาตั้งแต่ TensorFlow เวอร์ชัน 1.7