Python 如何在Keras中解码来自深度自动编码器的编码数据(教程中的不规则性)

Python 如何在Keras中解码来自深度自动编码器的编码数据(教程中的不规则性),python,deep-learning,keras,Python,Deep Learning,Keras,我遵循了教程“在Keras中构建自动编码器”: 第一个简单的解决方案很好用。但是在“deepautoencoder”一节中,教程中提供的代码似乎不能完全工作 这是我的代码(直到出现问题为止),它是从Turrial复制的: from keras.layers import Input, Dense from keras.models import Model encoding_dim = 32 input_img = Input(shape=(784,)) encoded = Dense(1

我遵循了教程“在Keras中构建自动编码器”:

第一个简单的解决方案很好用。但是在“deepautoencoder”一节中,教程中提供的代码似乎不能完全工作

这是我的代码(直到出现问题为止),它是从Turrial复制的:

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.
我得到这个错误:

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)
其他一切都和上面一样。然后没有错误,我可以使用
解码器
重新创建图像

decoder_layer = autoencoder.layers[-1]
decoder = Model(encoded_input, decoder_layer(encoded_input))
此代码适用于单层,因为在本例中,只有最后一层是解码器,并且

decoder_layer = autoencoder.layers[-1]
这一行调用最后一层

对于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).

它现在可以正常工作。

新的\uuuu 1答案缺乏可伸缩性,当您有更多的层时。
您可以利用知道瓶颈大小的事实,迭代各个层,并在“命中”瓶颈层后开始添加层

def build_decoder_from_model(model,瓶颈大小=1):
解码器输入=keras.input((瓶颈大小)
in_解码器=False
x=None#只是一个占位符,用于抑制pycharm警告。
对于model.layers中的l:
如果在U解码器中:
x=l(x)
如果l.input_形状[1]==瓶颈_大小:
in_解码器=真
x=l(编码器输入)
解码器=keras.Model(解码器输入,x)
返回解码器

Hi-PaulMag;我认为您的问题与代码相关,与调试Keras模型设置有关,与统计或深度学习技术无关。如果是这样的话,它在局部上更好地与StackOverflow的“任务”相关,而不是交叉验证。@fnl是的,你是对的。我不确定在哪个平台上问这个问题。我应该在StackOverflow上重新发布它并从CrossValidated中删除它吗?我刚刚发现迁移是一件很重要的事情。我已将此问题标记为迁移到StackOverflow。谢谢。这是有道理的,但我不会猜到。我以为我们已经把这些层连在一起了。这是本教程中的一个大漏洞。@PaulMag我想我们已经将这些层链接在一起了,但是我们将它们与图像输入链接到了自动编码器,而不是我们想要作为输入的编码输入。Keras此时无法确定要将
encoded\u输入插入到何处,因此我们必须重新生成插入的图形。非常感谢您的解决方案和解释!它救了我一天!
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).