Преобразование автоэнкодеров

10

Я только что прочитал статью Джеффа Хинтона о преобразовании автоэнкодеров

Хинтон, Крижевский и Ван: Преобразование авто-кодировщиков . В искусственных нейронных сетях и машинном обучении, 2011.

и очень хотел бы поиграть с чем-то вроде этого. Но, прочитав его, я не смог получить достаточно подробностей из статьи о том, как я мог бы это реализовать.

  • Кто-нибудь знает, как должно работать отображение между входными пикселями в капсулы?
  • Что именно должно происходить в единицах распознавания?
  • Как это надо тренировать? Это просто стандартная задняя опора между каждым соединением?

Еще лучше будет ссылка на некоторый исходный код для этого или что-то подобное.

Дэниел Слэйтер
источник
Вы пытались связаться с авторами? Может быть, у них есть что-то доступное в Интернете.
Рикардо Круз

Ответы:

4

Я собрал несколько примеров кода 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)
Софи Сирси - Метис
источник