gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:57:06 24 4
gpt4 key购买 nike

这个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com