【问题标题】:How to decode encoded data from deep autoencoder in Keras (unclarity in tutorial)如何在 Keras 中解码来自深度自动编码器的编码数据(教程中的不清楚)
【发布时间】:2017-11-12 08:25:42
【问题描述】:

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

第一个简单的解决方案效果很好。但在“深度自动编码器”部分,教程中提供的代码似乎并不能完全正常工作。

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

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 连接到错误的解码层和/或其输入或输出的形状错误。但是我该怎么办呢?

decoder 不是autoencoder 工作所必需的。我可以按照本教程的其余部分执行学习和编码图像。但是没有decoder,我无法将图像解码回原始格式,看看它们是否真的看起来不错。本教程没有提及任何关于此的内容,只显示解码后的图像而没有提及。我猜作者认为他对decoder 所做的任何更改都是微不足道的。

澄清一下:单层版本工作正常,我们只有 3 个编码层和 3 个解码层

encoded = Dense(32, activation='relu')(input_img)
decoded = Dense(784, activation='sigmoid')(encoded)

其他一切都和上面一样。然后没有错误,我可以使用decoder 重新创建图像。

【问题讨论】:

  • 你好 PaulMag;我认为您的问题与代码有关,并且与调试 Keras 模型设置有关,而不是与统计数据或深度学习技术有关。如果是这样,它的主题更好地与 StackOverflow 的“使命”相关,而不是 CrossValidated。
  • @fnl 是的,你是对的。我不确定在哪个平台上问这个。我应该在 StackOverflow 上重新发布它并从 CrossValidated 中删除它吗?
  • 我刚刚发现迁移是一回事。我已将此问题标记为迁移到 StackOverflow。

标签: python deep-learning keras


【解决方案1】:

new__1 答案在您拥有更多层时缺乏可扩展性。
您可以利用已知瓶颈大小这一事实,迭代层,并在“命中”瓶颈层后开始添加层。

def build_decoder_from_model(model, bottleneck_size=1):
    decoder_input = keras.Input((bottleneck_size,))

    in_decoder = False
    x = None  # Just a place holder to suppress pycharm warnings.
    for l in model.layers:
        if in_decoder:
            x = l(x)
        if l.input_shape[1] == bottleneck_size:
            in_decoder = True
            x = l(encoder_input)

    decoder = keras.Model(decoder_input, x)
    return decoder

【讨论】:

    【解决方案2】:
    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).
    

    现在可以正常使用了。

    【讨论】:

    • 谢谢。这是有道理的,但我不会猜到。我以为我们已经将这些层连接在一起了。这是教程中的一个大漏洞。
    • @PaulMag 我认为我们确实已经将这些层链接在一起,但我们将它们与图像输入链接到自动编码器,而不是我们想要作为输入的编码输入。 Keras 目前还没有确定我们希望将 encoded_input 插入的位置,因此我们必须在插入后重建图形。
    • 非常感谢这个解决方案和解释!它拯救了我的一天!
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 2017-02-28
    • 2018-08-28
    • 2019-07-22
    • 2020-06-11
    • 2019-09-13
    相关资源
    最近更新 更多