gpt4 book ai didi

python - 正确训练 Stacked Autoencoder

转载 作者:行者123 更新时间:2023-12-04 04:27:55 24 4
gpt4 key购买 nike

我尝试在 Keras (tf.keras) 中构建一个 Stacked Autoencoder。作者 堆叠 我不是说 .我为 Keras 找到的所有示例都在生成,例如3 个编码器层,3 个解码器层,他们训练它并收工。但是,这似乎是训练 的正确方法。堆叠 自动编码器 (SAE) 是本文中描述的一种:Stacked Denoising Autoencoders: Learning Useful Representations ina Deep Network with a Local Denoising Criterion

简而言之,应该逐层训练 SAE,如下图所示。第 1 层训练完成后,作为第 2 层训练的输入。重建损失应与第 1 层进行比较 而不是输入层 .



这就是我的麻烦开始的地方。如何告诉 Keras 在哪些层上使用损失函数?

这就是我所做的。由于 Keras 中不再存在自动编码器模块,因此我构建了第一个自动编码器,并将其编码器的权重 (trainable = False) 设置在第二个自动编码器的第一层,总共 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'])

该解决方案应该相当简单,但我看不到它,也无法在网上找到它。我如何在 Keras 中做到这一点?

最佳答案

通过查看评论,这个问题似乎已经过时了。但我仍然会回答这个问题,因为这个问题中提到的用例不仅特定于自动编码器,而且可能对其他一些情况有帮助。
因此,当您说“逐层训练整个网络”时,我宁愿将其解释为“在序列中训练单个单层的小型网络”。
查看这个问题中发布的代码,似乎 OP 已经建立了小型网络。 但是这两个网络都不由单层组成。
这里的第二个自动编码器将第一个自动编码器的输入作为输入。但是,它实际上应该将第一个自动编码器的输出作为输入。
那么,你训练第一个自动编码器并在训练后收集它的预测。然后训练第二个自动编码器,它将第一个自动编码器的输出(预测)作为输入。
现在让我们关注这部分:“第1层训练完成后,它作为输入来训练第2层。重建损失应该与第1层而不是输入层进行比较。”
由于网络将第 1 层的输出(在 OP 的情况下为自动编码器 1)作为输入,它会将其输出与此进行比较。任务完成。
但要实现这一点,您需要编写 model.fit(...)问题中提供的代码中缺少的行。
此外,如果您希望模型计算输入层的损失,您只需替换 y model,fit(...) 中的参数到自动编码器 1 的输入。
简而言之,您只需将这些自动编码器解耦成单层的微型网络,然后按照您的意愿训练它们。无需使用trainable = False现在,或者根据需要使用它。

关于python - 正确训练 Stacked Autoencoder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52221103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com