Я пытаюсь построить 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'])
Решение должно быть довольно простым, но я не вижу его и не могу найти его в Интернете. Как мне это сделать в Керасе?