如何将CNN图像中的输入形状从40x40更改为13x78?

2024-04-24 05:19:33 发布

您现在位置:Python中文网/ 问答频道 /正文

这个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'))

Tags: addlayerinputdatasizemodelfilterchange
1条回答
网友
1楼 · 发布于 2024-04-24 05:19:33

因为您选择了valid作为卷积的border_mode,所以我们将使用3 x 3的滤波器大小,从而在每个Convolution2D层为生成的滤波器输出移除边界周围的1个像素。还要注意,省略参数也会假定填充有效。如果计算出每一层的输出大小的减少值,那么输出过滤器大小的一个维度(行)将为0,从而得到错误。在d_filter = 3中,假设输入图像大小为13x78,让我们遍历每一层的输出滤波器大小。请注意,我省略了在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))

相关问题 更多 >