如何解码Keras中深度自动编码器的编码数据(教程中的不清晰)

Pau*_*Mag 14 python deep-learning keras

我遵循了"在Keras中构建自动编码器"教程:https://blog.keras.io/building-autoencoders-in-keras.html

第一个简单的解决方案工作正常.但是在"深度自动编码器"一节中,教程中提供的代码似乎并不完全正常.

这是我的代码(直到出现问题的地方),这只是从turorial中复制的:

from keras.layers import Input, Dense
from keras.models import Model

encoding_dim = 32

input_img = Input(shape=(784,))
encoded = Dense(128, activation='relu')(input_img)
encoded = Dense(64, activation='relu')(encoded)
encoded = Dense(32, activation='relu')(encoded)  # Multiple encoding
decoded = Dense(64, activation='relu')(encoded)  # and decoding layers.
decoded = Dense(128, activation='relu')(decoded)
decoded = Dense(784, activation='sigmoid')(decoded)

autoencoder = Model(input_img, decoded)

encoder = Model(input_img, encoded)

encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
decoder = Model(encoded_input, decoder_layer(encoded_input))  # Crash happens here.
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Traceback (most recent call last):
  File "keras_test.py", line 20, in <module>
    decoder = Model(encoded_input, decoder_layer(encoded_input))  # Crash happens here
  File "/Users/paulmagnus/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/keras/engine/topology.py", line 569, in __call__
    self.assert_input_compatibility(inputs)
  File "/Users/paulmagnus/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/keras/engine/topology.py", line 479, in assert_input_compatibility
    ' but got shape ' + str(x_shape))
ValueError: Input 0 is incompatible with layer dense_6: expected axis -1 of input shape to have value 128 but got shape (None, 32)
Run Code Online (Sandbox Code Playgroud)

我猜这decoder是连接到错误的解码层和/或其输入或输出的形状是错误的.但我该怎么办呢?

decoder不是autoencoder工作所必需的.我可以按照本教程的其余部分进行学习并对图像进行编码.但是,如果没有decoder我无法将图像解码回原始格式,看看它们是否真的很好看.本教程没有提及任何相关内容,只是简单地显示解码后的图像.我想作者假设他所做的任何改变都是decoder为了实现这一点是微不足道的.

为了澄清:单层版本工作正常,而不是我们只有3个编码和3个解码层

encoded = Dense(32, activation='relu')(input_img)
decoded = Dense(784, activation='sigmoid')(encoded)
Run Code Online (Sandbox Code Playgroud)

其他一切与上述相同.然后没有错误,我可以decoder用来重新创建图像.

小智 24

decoder_layer = autoencoder.layers[-1]
decoder = Model(encoded_input, decoder_layer(encoded_input))
Run Code Online (Sandbox Code Playgroud)

此代码适用于单层,因为在这种情况下只有最后一层是解码器

decoder_layer = autoencoder.layers[-1]
Run Code Online (Sandbox Code Playgroud)

这一行需要最后一层.

对于3层编码器和解码器,您必须调用所有3层来定义解码器.我正在做相同的教程,所以我写了这样的代码.

encoded_input = Input(shape=(encoding_dim,))

deco = autoencoder.layers[-3](encoded_input)
deco = autoencoder.layers[-2](deco)
deco = autoencoder.layers[-1](deco)
# create the decoder model
decoder = Model(encoded_input, deco).
Run Code Online (Sandbox Code Playgroud)

它现在工作正常.

  • 谢谢。这是有道理的,但我不会猜到。我以为我们已经将这些层联系在一起了。这是本教程中的一个大漏洞。 (2认同)
  • @PaulMag我认为我们已经将这些层链接在一起,但我们将它们与自动编码器的图像输入链接起来,而不是我们想要作为输入的编码输入。Keras 此时还没有弄清楚我们希望将“encoded_input”插入到哪里,因此我们必须重建插入的图形。 (2认同)