tensorflow “conv2d_2/convolution”的1减去3导致的负维度大小

ruyhziif  于 2022-11-25  发布在  其他
关注(0)|答案(6)|浏览(124)

我在Keras中声明输入层时收到了此错误消息。
ValueError:“conv2d_2/convolution”的1减3导致的负维度大小(运算符:“Conv 2D”)与输入形状:[?、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

y53ybaqx

y53ybaqx1#

默认情况下,Convolution 2D(https://keras.io/layers/convolutional/)要求输入的格式为(样本、行、列、通道),即“channels-last”。您的数据似乎为(样本、通道、行、列)。您应该可以在声明Convolution 2D层时使用可选关键字data_format = 'channels_first'来修复此问题。

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

1sbrub3j2#

我遇到了同样的问题,但是这个线程中提供的解决方案没有帮助我。在我的情况下,是另一个问题导致了这个错误:
编号

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 x 32。在第一个卷积层之后,我们将其缩小为30 x 30。(如果我对卷积的理解正确的话)
然后池化层将其分割,即15乘以15。
然后另一个卷积层将其缩减为13乘13...
我希望你能明白这是怎么回事:最后,我的要素Map太小,以至于我的池化图层(或卷积图层)太大而无法覆盖它-这就导致了错误

溶液

此错误的简单解决方案是增大图像大小或使用较少的卷积或池化层。

gkn4icbw

gkn4icbw3#

Keras具有以下后端兼容性:
tensorflow :通过谷歌,Theano:由丽莎实验室开发,CNTK:微软公司
每当您看到[?,X,X,X]、[X,Y,Z,X]错误时,这是一个通道问题,需要使用Keras的自动模式进行修复:
汇入

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

“tf”格式意味着卷积核将具有以下形状(行、列、输入深度、深度)
这将永远有效...

ghhkc1vu

ghhkc1vu4#

您可以改为保留卷的空间维度,以便输出卷大小与输入卷大小匹配,方法是将值设置为“same”。use padding='same'

gblwokeq

gblwokeq5#

请使用以下选项:

from keras import backend
backend.set_image_data_format('channels_last')

根据您的喜好,您可以使用'channels_first''channels_last'来设定影像数据格式。(Source
如果这样做不起作用,并且您的图像尺寸很小,请尝试缩小CNN的架构,就像前面的海报所提到的那样。
希望能有所帮助!

vpfxa7rd

vpfxa7rd6#

# define the model as a class
class LeNet:

  '''
      In a sequential model, we stack layers sequentially. 
      So, each layer has unique input and output, and those inputs and outputs 
      then also come with a unique input shape and output shape.

  '''

  @staticmethod                ## class can instantiated only once 
  def init(numChannels, imgRows, imgCols , numClasses, weightsPath=None):

    # if we are using channel first we have update the input size
    if backend.image_data_format() == "channels_first":
      inputShape = (numChannels , imgRows , imgCols)
    else: 
      inputShape = (imgRows , imgCols , numChannels)

    # initilize the model
    model = models.Sequential()

    # Define the first set of CONV => ACTIVATION => POOL LAYERS

    model.add(layers.Conv2D(  filters=6,kernel_size=(5,5),strides=(1,1), 
                              padding="valid",activation='relu',kernel_initializer='he_uniform',input_shape=inputShape))
    model.add(layers.AveragePooling2D(pool_size=(2,2),strides=(2,2)))

我希望这会有帮助:)
请参阅代码:Fashion_Mnist_Using_LeNet_CNN

相关问题