【问题标题】:How to change input shape in CNN image from 40x40 to 13x78?如何将 CNN 图像中的输入形状从 40x40 更改为 13x78?
【发布时间】:2019-05-11 23:57:02
【问题描述】:

此 CNN 适用于 40x40x2 图像,但现在我想更改为 13x78x2​​ 并得到以下错误。我应该对我的 CNN 架构进行哪些更改?

Negative dimension size caused by subtracting 3 from 2 for 'conv2d_13/convolution' (op: 'Conv2D') with input shapes: [?,2,35,64], [3,3,64,64].

我的代码:

  data_w = 40 #CHANGE TO 13
  data_h = 40 #CHANGE TO 78
  n_classes = 2
  n_filters_1 = 32
  n_filters_2 = 64
  d_filter = 3
  p_drop_1 = 0.25
  p_drop_2 = 0.50   
  model = Sequential()
  model.add(Convolution2D(n_filters_1, d_filter, d_filter, border_mode='valid', input_shape=(data_w, data_h,2)))
  model.add(Activation('relu'))
  model.add(Convolution2D(n_filters_1, d_filter, d_filter))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(p_drop_1))
  model.add(Convolution2D(n_filters_2, d_filter, d_filter, border_mode='valid'))
  model.add(Activation('relu'))
  model.add(Convolution2D(n_filters_2, d_filter, d_filter))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(p_drop_1))
  ## Used to flat the input (1, 10, 2, 2) -> (1, 40)
  model.add(Flatten())
  # Full Connected layer
  model.add(Dense(256))
  model.add(Activation('relu'))
  # Drop layer
  model.add(Dropout(p_drop_2))
  # Output Full Connected layer
  model.add(Dense(n_classes))
  model.add(Activation('softmax'))

【问题讨论】:

    标签: python machine-learning keras deep-learning conv-neural-network


    【解决方案1】:

    因为您选择了valid 作为卷积的border_mode,所以会发生什么情况是,使用您的 3 x 3 过滤器大小,我们将在每个 @987654323 处为生成的过滤器输出的边界周围移除 1 个像素@ 层。另请注意,省略参数也假定填充有效。如果您计算出每层输出大小的减少,您将到达输出过滤器大小的一个维度(行)将为 0 的点,因此您会得到错误。使用d_filter = 3,让我们了解输入图像大小为 13 x 78 的每一层的输出滤波器大小。请注意,我省略了在 ActivationDropout 层显示滤波器大小输出,因为我们已经知道为简洁起见,它们保持相同的输出大小:

      model.add(Convolution2D(n_filters_1, d_filter, d_filter, border_mode='valid', input_shape=(data_w, data_h,2))) # 11 x 76
      model.add(Activation('relu'))
      model.add(Convolution2D(n_filters_1, d_filter, d_filter)) # 9 x 74
      model.add(Activation('relu'))
      model.add(MaxPooling2D(pool_size=(2, 2))) # 4 x 37
      model.add(Dropout(p_drop_1))
      model.add(Convolution2D(n_filters_2, d_filter, d_filter, border_mode='valid')) # 2 x 35
      model.add(Activation('relu'))
      model.add(Convolution2D(n_filters_2, d_filter, d_filter)) # 0 x 33 (!!!!)
      model.add(Activation('relu'))
      model.add(MaxPooling2D(pool_size=(2, 2)))
      model.add(Dropout(p_drop_1))
    

    我建议立即将border_mode 更改为'same'。这样,在每个Convolution2D 层到达池化层之前,它的输出过滤器大小都会保持不变。我不确定您选择有效卷积的目的,但请尝试这样做:

      model.add(Convolution2D(n_filters_1, d_filter, d_filter, border_mode='same', input_shape=(data_w, data_h,2))) # 13 x 78
      model.add(Activation('relu'))
      model.add(Convolution2D(n_filters_1, d_filter, d_filter), border_mode='same') # 13 x 78
      model.add(Activation('relu'))
      model.add(MaxPooling2D(pool_size=(2, 2))) # 6 x 39
      model.add(Dropout(p_drop_1))
      model.add(Convolution2D(n_filters_2, d_filter, d_filter, border_mode='same')) # 6 x 39
      model.add(Activation('relu'))
      model.add(Convolution2D(n_filters_2, d_filter, d_filter), border_mode='same') # 6 x 39
      model.add(Activation('relu'))
      model.add(MaxPooling2D(pool_size=(2, 2))) # 3 x 19
      model.add(Dropout(p_drop_1))
    

    如果不是,您需要删除一些 Convolution2DMaxPooling2D 层,以便生成非零的过滤器输出。做我上面做的同样的工作来计算你需要多少层来删除你需要的层。我建议使用n_filters_2 过滤器删除第一个Convolution2DActivation 层之后的层:

      model.add(Convolution2D(n_filters_1, d_filter, d_filter, border_mode='valid', input_shape=(data_w, data_h,2))) # 11 x 76
      model.add(Activation('relu'))
      model.add(Convolution2D(n_filters_1, d_filter, d_filter)) # 9 x 74
      model.add(Activation('relu'))
      model.add(MaxPooling2D(pool_size=(2, 2))) # 4 x 37
      model.add(Dropout(p_drop_1))
      model.add(Convolution2D(n_filters_2, d_filter, d_filter, border_mode='valid')) # 2 x 35
      model.add(Activation('relu'))
    #  model.add(Convolution2D(n_filters_2, d_filter, d_filter)) # 0 x 33 (!!!!)
    #  model.add(Activation('relu'))
    #  model.add(MaxPooling2D(pool_size=(2, 2)))
    #  model.add(Dropout(p_drop_1))
    

    【讨论】:

    • border_mode='same' 解决了这个问题。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2018-08-23
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多