【发布时间】: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