【问题标题】:Keras value error for convolutional autoeconder卷积自动编码器的 Keras valueerror
【发布时间】:2018-06-26 19:07:05
【问题描述】:

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

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

我假设我的解码器应该从 16*16 开始,因为我的编码器末端的密集网络有 256 个节点。但是,当我跑步时 encoder, decoder = deep_autoencoder(IMG_SHAPE, code_size=32) 我得到了错误:

---> 34     decoder.add(keras.layers.Reshape([16,16]))
.
.
.
ValueError: total size of new array must be unchanged

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

为了便于阅读网络,我为 encoder 部分添加了模型摘要 - 如果我注释掉解码器部分并运行 encoder.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 32, 32, 3)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 32, 32, 32)        896       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 11, 11, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 11, 11, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 4, 4, 64)          0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 4, 4, 128)         73856     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 2, 2, 128)         0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 2, 2, 256)         295168    
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 1, 1, 256)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 256)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 32)                8224      
=================================================================

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      相关资源
      最近更新 更多