我正在尝试构建卷积自动编码器,但是解码器部分存在问题。我的输入图像是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()
答案 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)编写的自动编码器的教程。它可能对您的实施有所帮助。