Я зібрав кілька прикладів тензорфлового коду, щоб допомогти пояснити (повний, робочий код є в цьому суті ). Цей код реалізує мережу капсул з першої частини розділу 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)