'conv2d_2 / convolution'从1减去3导致的负尺寸大小

问题描述 投票:10回答:3

在Keras中声明输入层时出现此错误消息。

ValueError:通过输入形状为'conv2d_2 / convolution'(op:'Conv2D')从1中减去3而导致的负尺寸大小:[?,1,28,28],[3,3,28,32]。

我的代码是这样的

model.add(Convolution2D(32, 3, 3, activation='relu', input_shape=(1,28,28)))

样品申请:https://github.com/IntellijSys/tensorflow/blob/master/Keras.ipynb

python tensorflow neural-network keras keras-layer
3个回答
26
投票

默认情况下,Convolution2D(https://keras.io/layers/convolutional/)期望输入采用格式(样本,行,列,通道),即“通道最后”。您的数据似乎采用格式(样本,通道,行,列)。在声明Convolution2D层时,您应该能够使用可选关键字data_format = 'channels_first'来解决此问题。

model.add(Convolution2D(32, (3, 3), activation='relu', input_shape=(1,28,28), data_format='channels_first'))

12
投票

我有同样的问题,这个线程中提供的解决方案对我没有帮助。经过深思熟虑后,我找到了解决方案,解决了我的问题。

首先,这是我的代码(我知道它不好,我还在学习)

imageSize=32
classifier=Sequential() 

classifier.add(Conv2D(64, (3, 3), input_shape = (imageSize, imageSize, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Conv2D(64, (3, 3), activation = 'relu')) 
classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Flatten())

只有经历了各种可能性后,才发现错误:

图像大小是32乘32.在第一个卷积层之后,我们将它减少到30乘以30(我认为,如果我正确理解卷积)

然后汇集层将它减少到一半,所以15乘15 ...

等等..最后,我的功能图很小,我的池层(或卷积层)太大而无法覆盖它 - 并导致错误

因此,通过使图像尺寸更大或减少卷积或合并层来容易地解决误差。


4
投票

Keras具有以下后端兼容性:

TensorFlow:谷歌,Theano:由LISA实验室开发,CNTK:微软

每当你看到[?,X,X,X],[X,Y,Z,X]的错误时,修复此问题的通道问题就是使用Keras的自动模式:

进口

from keras import backend as K
K.set_image_dim_ordering('th')

“tf”格式意味着卷积内核将具有形状(rows,cols,input_depth,depth)

这将永远有效......

© www.soinside.com 2019 - 2024. All rights reserved.