Negative dimension size caused by subtracting 3 from 1 for 'conv2d_2/convolution'

Viewed 54096

I got this error message when declaring the input layer in Keras.

ValueError: Negative dimension size caused by subtracting 3 from 1 for 'conv2d_2/convolution' (op: 'Conv2D') with input shapes: [?,1,28,28], [3,3,28,32].

My code is like this

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

Sample application: https://github.com/IntellijSys/tensorflow/blob/master/Keras.ipynb

6 Answers

Keras is available with following backend compatibility:

TensorFlow : By google, Theano : Developed by LISA lab, CNTK : By Microsoft

Whenever you see a error with [?,X,X,X], [X,Y,Z,X], its a channel issue to fix this use auto mode of Keras:

Import

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

"tf" format means that the convolutional kernels will have the shape (rows, cols, input_depth, depth)

This will always work ...

You can instead preserve spatial dimensions of the volume such that the output volume size matches the input volume size, by setting the value to “same”. use padding='same'

Use the following:

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

Depending on your preference, you can use 'channels_first' or 'channels_last' to set the image data format. (Source)

If this does not work and your image size is small, try reducing the architecture of your CNN, as previous posters mentioned.

Hope it helps!

    # 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)))

I hope it would help :)

See code : Fashion_Mnist_Using_LeNet_CNN

Related