Трансформація автоматичних кодерів


10

Я щойно прочитав статтю Джеффа Гінтона про перетворення автоінкодерів

Хінтон, Крижевський та Ван: Трансформація автокодерів . У галузі штучних нейронних мереж та машинного навчання, 2011.

і дуже хотілося б пограти з чимось подібним. Але прочитавши його, я не зміг отримати достатньо деталей із статті про те, як я міг би реально це здійснити.

  • Хтось знає, як має діяти відображення між вхідними пікселями на капсули?
  • Що саме має відбуватися в одиницях розпізнавання?
  • Як це слід навчати? Це просто стандартний задній опор між кожним з'єднанням?

Ще краще було б посилання на якийсь вихідний код для цього чи чогось подібного.


Ви намагалися зв’язатися з авторами? Можливо, у них є щось доступне в Інтернеті.
Рікардо Крус

Відповіді:


4

Я зібрав кілька прикладів тензорфлового коду, щоб допомогти пояснити (повний, робочий код є в цьому суті ). Цей код реалізує мережу капсул з першої частини розділу 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.