ฉันได้รวบรวมตัวอย่างรหัส tensorflow เพื่อช่วยอธิบาย (รหัสการทำงานที่สมบูรณ์อยู่ในส่วนสำคัญนี้) รหัสนี้ใช้เครือข่ายแคปซูลจากส่วนแรกของส่วนที่ 2 ในกระดาษที่คุณเชื่อมโยง:
N_REC_UNITS = 10
N_GEN_UNITS = 20
N_CAPSULES = 30
# input placeholders
img_input_flat = tf.placeholder(tf.float32, shape=(None, 784))
d_xy = tf.placeholder(tf.float32, shape=(None, 2))
# translate the image according to d_xy
img_input = tf.reshape(img_input_flat, (-1, 28, 28, 1))
trans_img = image.translate(img_input, d_xy)
flat_img = tf.layers.flatten(trans_img)
capsule_img_list = []
# build several capsules and store the generated output in a list
for i in range(N_CAPSULES):
# hidden recognition layer
h_rec = tf.layers.dense(flat_img, N_REC_UNITS, activation=tf.nn.relu)
# inferred xy values
xy = tf.layers.dense(h_rec, 2) + d_xy
# inferred probability of feature
p = tf.layers.dense(h_rec, 1, activation=tf.nn.sigmoid)
# hidden generative layer
h_gen = tf.layers.dense(xy, N_GEN_UNITS, activation=tf.nn.relu)
# the flattened generated image
cap_img = p*tf.layers.dense(h_gen, 784, activation=tf.nn.relu)
capsule_img_list.append(cap_img)
# combine the generated images
gen_img_stack = tf.stack(capsule_img_list, axis=1)
gen_img = tf.reduce_sum(gen_img_stack, axis=1)
ไม่มีใครรู้ว่าการทำแผนที่ระหว่างพิกเซลอินพุตกับแคปซูลควรทำงานอย่างไร
ขึ้นอยู่กับโครงสร้างเครือข่าย สำหรับการทดลองครั้งแรกในกระดาษนั้น (และรหัสด้านบน) แต่ละแคปซูลมีฟิลด์ที่เปิดกว้างซึ่งรวมถึงภาพอินพุตทั้งหมด นั่นเป็นวิธีที่ง่ายที่สุด ในกรณีนี้มันเป็นเลเยอร์ที่เชื่อมต่ออย่างสมบูรณ์ระหว่างภาพอินพุตและเลเยอร์แรกที่ซ่อนอยู่ในแต่ละแคปซูล
อีกทางหนึ่งช่องรับแคปซูลสามารถจัดเรียงได้มากเช่นเมล็ดของซีเอ็นเอ็นที่มีความก้าวหน้าเช่นเดียวกับการทดลองในภายหลังในกระดาษนั้น
สิ่งที่ควรเกิดขึ้นในหน่วยการรู้จำ?
หน่วยการรับรู้เป็นตัวแทนภายในที่แต่ละแคปซูลมี แต่ละแคปซูลใช้การแทนค่าภายในนี้เพื่อคำนวณp
ความน่าจะเป็นที่คุณสมบัติของแคปซูลปรากฏอยู่และxy
ค่าการแปลที่อนุมาน รูปที่ 2 ในกระดาษนั้นเป็นการตรวจสอบเพื่อให้แน่ใจว่าเครือข่ายกำลังเรียนรู้การใช้งานxy
อย่างถูกต้อง (เป็น)
ควรฝึกอบรมอย่างไร มันเป็นแค่เสาหลังมาตรฐานระหว่างการเชื่อมต่อทุกครั้งหรือไม่
โดยเฉพาะอย่างยิ่งคุณควรฝึกมันเป็นตัวเข้ารหัสอัตโนมัติโดยใช้การสูญเสียที่บังคับให้มีความคล้ายคลึงกันระหว่างผลลัพธ์ที่สร้างและต้นฉบับ ความคลาดเคลื่อนกำลังสองเฉลี่ยหมายความว่าทำงานได้ดีที่นี่ นอกเหนือจากนั้นใช่คุณจะต้องเผยแพร่การไล่ระดับสีด้วย backprop
loss = tf.losses.mean_squared_error(img_input_flat, gen_img)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)