2017-04-25 47 views
0

现在我正在研究带有CNN的AutoEncoder。为了学习,我为MNIST数据创建了一个模型。但我无法正确设置Conv2d的输出调光。请参阅下面的模型图像。虽然我期望第一个Conv2d的输出应该是(None, 16, 28, 28),但实际输出是(None, 1, 28, 16)。关于文件,我的代码看起来不错。 https://keras.io/layers/convolutional/#conv2d无法在keras中设置Conv2D的输出变暗

你能找到我的代码的任何错误?

我的环境

  • 的Python 3.6.0
  • keras 2.0.2(后端是Tensorflow)

代码

from keras.layers import Input, Convolution2D, MaxPool2D, UpSampling2D, Conv2D 
from keras.models import Model 
input_img = Input(shape=(1, 28, 28)) 
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img) 
x = MaxPool2D((2,2), padding='same')(x) 
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x) 
x = MaxPool2D((2,2), padding='same')(x) 
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x) 
encoded = MaxPool2D((2,2), padding='same')(x) 

x = Conv2D(8, (3,3), activation='relu', padding='same')(encoded) 
x = UpSampling2D((2,2))(x) 
x = Conv2D(8, (3,3), activation='relu', padding='same')(x) 
x = UpSampling2D((2,2))(x) 
x = Conv2D(16, (3,3), activation='relu')(x) 
x = UpSampling2D((2,2))(x) 
decoded = Conv2D(1, (3,3), activation='sigmoid', padding='same')(x) 

autoencoder= Model(input_img, decoded) 
autoencoder.compile(optimizer='adam', loss='binary_crossentropy') 

from keras.utils import plot_model 
plot_model(autoencoder, to_file="architecture.png", show_shapes=True) 

enter image description here

更新

我加autoencoder.summary()。所以我的问题是为什么CNN的第一个输出成为(None, 16, 28, 28)(None, 1, 28, 16)不是我的期望。

Layer (type)     Output Shape    Param # 
================================================================= 
conv2d_181 (Conv2D)   (None, 1, 28, 16)   4048  
_________________________________________________________________ 
max_pooling2d_82 (MaxPooling (None, 1, 14, 16)   0   
_________________________________________________________________ 
conv2d_182 (Conv2D)   (None, 1, 14, 8)   1160  
_________________________________________________________________ 
max_pooling2d_83 (MaxPooling (None, 1, 7, 8)   0   
_________________________________________________________________ 
conv2d_183 (Conv2D)   (None, 1, 7, 8)   584  
_________________________________________________________________ 
max_pooling2d_84 (MaxPooling (None, 1, 4, 8)   0   
_________________________________________________________________ 
conv2d_184 (Conv2D)   (None, 1, 4, 8)   584  
_________________________________________________________________ 
up_sampling2d_72 (UpSampling (None, 2, 8, 8)   0   
_________________________________________________________________ 
conv2d_185 (Conv2D)   (None, 2, 8, 8)   584  
_________________________________________________________________ 
up_sampling2d_73 (UpSampling (None, 4, 16, 8)   0   
_________________________________________________________________ 
conv2d_186 (Conv2D)   (None, 4, 16, 16)   1168  

_________________________________________________________________ 
up_sampling2d_74 (UpSampling (None, 8, 32, 16)   0   
_________________________________________________________________ 
conv2d_187 (Conv2D)   (None, 8, 32, 1)   145  
================================================================= 
Total params: 8,273.0 
Trainable params: 8,273.0 
Non-trainable params: 0.0 
_________________________________________________________________ 

Updated2

我input_img是专为Theano。所以我必须像下面那样改变。否则,我在~/.keras/keras.json

# Theano style 
input_img = Input(shape=(1, 28, 28)) 

# Tensorflow style 
input_img = Input(shape=(28, 28, 1)) 
+0

尝试使用autoencoder.summary(),这将打印终端中每个图层的所有输出形状信息,并查看是否有不同的结果(或将其添加到您的问题)。 –

+0

我添加了摘要并澄清了我的问题 – jef

回答

1

改变image_dim_ordering这是很常见的问题的问题与图像排序。 Theano将通道尺寸放置在形状数组的第二个元素中,如(samples, channels, width, height),而TensorFlow将通道尺寸放在最后,如(samples, width, height, channels)。您正在使用Theano排序,但后端是Tensorflow。

只需更改形状以匹配正确的顺序,它应该工作。或者,您可以在~/.keras/keras.json文件中将image_dim_ordering更改为“th”。

+0

谢谢。我做的。 – jef