Я собрал несколько примеров кода tenorflow, чтобы помочь объяснить (полный, рабочий код в этой сути ). Этот код реализует капсульную сеть из первой части раздела 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)