在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
默认情况下,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'))
我有同样的问题,这个线程中提供的解决方案对我没有帮助。经过深思熟虑后,我找到了解决方案,解决了我的问题。
首先,这是我的代码(我知道它不好,我还在学习)
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 ...
等等..最后,我的功能图很小,我的池层(或卷积层)太大而无法覆盖它 - 并导致错误
因此,通过使图像尺寸更大或减少卷积或合并层来容易地解决误差。
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)
这将永远有效......