Поезд сложил автоэнкодер правильно - Керас - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь построить Stacked Autoencoder в Keras (tf.keras). Под сложены Я не имею в виду глубокий . Все примеры, которые я нашел для Keras, приводят, например. 3 слоя кодировщика, 3 слоя декодера, они обучают его и называют это днем. Тем не менее, кажется, что правильный способ обучения Stacked Autoencoder (SAE) описан в этой статье: Stacked Denoising Autoencoders: Изучение полезных представлений в Глубокая сеть с локальным критерием Denoising

Короче говоря, SAE следует обучать послойно, как показано на рисунке ниже. После обучения уровня 1 он используется в качестве входных данных для обучения уровня 2. Потери при реконструкции следует сравнивать со слоем 1 , а не с входным слоем .

И вот тут начинается моя проблема. Как указать Keras, на каких слоях использовать функцию потерь?

Вот что я делаю. Поскольку модуль автоэнкодера больше не существует в Keras, я создаю первый автоэнкодер и устанавливаю вес его кодера (trainable = False) в 1-м слое второго автоэнкодера, всего 2 слоя. Затем, когда я тренируюсь, он, очевидно, сравнивает восстановленный слой out_s2 с входным слоем in_s вместо слоя 1 hid1.

# autoencoder layer 1
in_s = tf.keras.Input(shape=(input_size,))
noise = tf.keras.layers.Dropout(0.1)(in_s)
hid = tf.keras.layers.Dense(nodes[0], activation='relu')(noise)
out_s = tf.keras.layers.Dense(input_size, activation='sigmoid')(hid)

ae_1 = tf.keras.Model(in_s, out_s, name="ae_1")
ae_1.compile(optimizer='nadam', loss='binary_crossentropy', metrics=['acc'])

# autoencoder layer 2
hid1 = tf.keras.layers.Dense(nodes[0], activation='relu')(in_s)
noise = tf.keras.layers.Dropout(0.1)(hid1)
hid2 = tf.keras.layers.Dense(nodes[1], activation='relu')(noise)
out_s2 = tf.keras.layers.Dense(nodes[0], activation='sigmoid')(hid2)

ae_2 = tf.keras.Model(in_s, out_s2, name="ae_2")
ae_2.layers[0].set_weights(ae_1.layers[0].get_weights())
ae_2.layers[0].trainable = False

ae_2.compile(optimizer='nadam', loss='binary_crossentropy', metrics=['acc'])

Решение должно быть довольно простым, но я не вижу его и не могу найти его в Интернете. Как мне это сделать в Керасе?

...