Answers:
我整理了一些示例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)
有谁知道输入像素到胶囊之间的映射应该如何工作?
这取决于网络结构。对于该论文中的第一个实验(以及上面的代码),每个胶囊都有一个包含整个输入图像的感受野。那是最简单的安排。在这种情况下,它是输入图像和每个胶囊中的第一个隐藏层之间的完全连接层。
替代地,可以像随后的实验中那样,将囊状受体场更像是跨步排列的CNN核。
识别单元中到底应该发生什么?
识别单元是每个胶囊具有的内部表示。每个胶囊使用此内部表示来计算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)