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

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

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

最佳答案

因为您选择了 valid 作为卷积的 border_mode,因此,在您的 3 x 3 过滤器大小下,我们将删除周围的 1 个像素每个 Convolution2D 层生成的滤波器输出的边界。另请注意,省略参数也假定填充有效。如果您计算出每一层输出大小的减少量,您将到达输出过滤器大小的其中一个维度(行)将为 0 的点,因此您会得到错误。使用 d_filter = 3,假设输入图像大小为 13 x 78,让我们浏览一下每一层的输出滤波器大小。请注意,我省略了在激活时显示滤波器大小输出。 code> 和 Dropout 层,因为我们已经知道它们保持与简洁性相同的输出大小:

  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,使其“相同”。这样,每个 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))

关于python - 如何将 CNN 图像中的输入形状从 40x40 更改为 13x78?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56095153/

相关文章:

python - Python中的货币格式

python - python读取具有不同列数的数据文件

python - 如何比较Python中数据框中的一行中的连续字符串值

machine-learning - 已提取特征的手写数字数据集

tensorflow - Keras image_dataset_from_directory 未找到图像

python - Python 中向量的高性能全面比较

machine-learning - 如何使用机器学习算法找到值流中的特殊点?

python - 将 scikit 缩放数据映射回 ID

tensorflow - 使用 tf.py_func 生成输入数据

定义自定义损失函数后出现keras "unknown loss function"错误