我刚刚阅读了 Geoff Hinton 关于转换自动编码器的论文
Hinton、Krizhevsky 和 Wang:转换自动编码器。在人工神经网络和机器学习中,2011。
并且很想玩这样的东西。但是在阅读了它之后,我无法从论文中获得关于如何实际实现它的足够详细信息。
- 有谁知道输入像素到胶囊之间的映射应该如何工作?
- 识别单元中究竟应该发生什么?
- 应该怎么训练?它只是每个连接之间的标准后退支撑吗?
更好的是链接到一些源代码或类似的东西。
我刚刚阅读了 Geoff Hinton 关于转换自动编码器的论文
Hinton、Krizhevsky 和 Wang:转换自动编码器。在人工神经网络和机器学习中,2011。
并且很想玩这样的东西。但是在阅读了它之后,我无法从论文中获得关于如何实际实现它的足够详细信息。
更好的是链接到一些源代码或类似的东西。
我整理了一些示例 tensorflow 代码来帮助解释(完整的工作代码在这个gist中)。此代码实现了您链接的论文第 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
正确使用(确实如此)。
应该怎么训练?它只是每个连接之间的标准后退支撑吗?
具体来说,您应该将其训练为自动编码器,使用强制生成输出与原始输出之间相似性的损失。均方误差在这里效果很好。除此之外,是的,您需要使用反向传播传播梯度下降。
loss = tf.losses.mean_squared_error(img_input_flat, gen_img)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)