卷积自编码器的Keras值误差

时间:2018-06-26 19:07:05

标签: python tensorflow keras autoencoder convolutional-neural-network

我正在尝试构建卷积自动编码器,但是解码器部分存在问题。我的输入图像是32 x 32 x 3(RGB)。

(
    [0] => Array
        (
            [101] => 4
            [108] => 2
            [109] => 1
        )

    [1] => Array
        (
            [102] => 2
        )

)

我假设我的解码器应该以16 * 16开始,因为我的编码器末端的密集网络有256个节点。但是当我跑步 from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Activation, Dropout def deep_autoencoder(img_shape, code_size): #### encoder ###### encoder = keras.models.Sequential() encoder.add(keras.layers.InputLayer(img_shape)) encoder.add(Conv2D(32, kernel_size=(3, 3), strides=1, activation='elu', padding ='same' )) encoder.add(MaxPooling2D(pool_size=(3, 3), padding = 'same')) encoder.add(Conv2D(64, kernel_size=(3, 3), strides=1, activation='elu', padding ='same' )) encoder.add(MaxPooling2D(pool_size=(3, 3), padding = 'same')) encoder.add(Conv2D(128, kernel_size=(3, 3), strides=1, activation='elu', padding ='same' )) encoder.add(MaxPooling2D(pool_size=(3, 3), padding = 'same') ) encoder.add(Conv2D(256, kernel_size=(3, 3), strides=1, activation='elu', padding ='same' )) encoder.add(Flatten()) encoder.add(Dense(code_size, activation='relu')) ##### decoder##### decoder = keras.models.Sequential() decoder.add(keras.layers.InputLayer((code_size,))) decoder.add(Dense(code_size, activation='relu')) decoder.add(keras.layers.Reshape([16,16])) #??? decoder.add(keras.layers.Conv2DTranspose(filters=128, kernel_size=(3, 3), strides=2, activation='elu', padding='same')) decoder.add(keras.layers.Conv2DTranspose(filters=64, kernel_size=(3, 3), strides=2, activation='elu', padding='same')) decoder.add(keras.layers.Conv2DTranspose(filters=32, kernel_size=(3, 3), strides=2, activation='elu', padding='same')) decoder.add(keras.layers.Conv2DTranspose(filters=3, kernel_size=(3, 3), strides=2, padding='same')) return encoder, decoder  我收到错误消息:

encoder, decoder = deep_autoencoder(IMG_SHAPE, code_size=32)

如果有帮助,我可以添加完整的错误代码,但是我觉得我遇到了一些非常基本的错误。为了应用反卷积滤波器,我需要将编码器的平坦输出转换为矩阵。

为了便于阅读网络,我添加了 encoder 部分的模型摘要-如果我注释掉了解码器部分并运行---> 34 decoder.add(keras.layers.Reshape([16,16])) . . . ValueError: total size of new array must be unchanged

,则会得到该摘要。
encoder.summary()

1 个答案:

答案 0 :(得分:1)

困扰我的模型主要有两件事:首先,自动编码器的不对称性。您在编码过程中使用了conv和pool层,但是省略了upsampling(逆池)层的使用。这已经在keras中实现为UpSampling2D。此外,您还应该在conv和deconv图层中使用相同的步幅。

第二,在第四次合并之后,最终得到的压缩表示为1x1x256。为什么要尝试将其转换为解码部分的16x16x1表示形式?这也与对称有关。无需展平编码层,您只需使用1x1x256表示作为解码模型的输入即可。在将编码器和解码器创建为单独的模型时,可以像这样堆叠它们:

encoder = Sequential()
encoder.add ...
...

decoder = Sequential()
decoder.add(encoder)
decoder.add ...

还有一个有关如何创建由Francois Chollet(LINK)编写的自动编码器的教程。它可能对您的实施有所帮助。