在Keras中使用2d卷积核执行1d卷积

3
我目前正在处理一个CNN网络,我想在图像上应用一个2D卷积核,但它只需要执行1D卷积,意味着它只需要沿一个轴移动(在这种情况下是x轴)。
卷积核的形状与图像的y轴相同。目前应用的滤波器数量并不重要。
例如: 给定大小为(6,3,3)=(行数,列数,颜色通道)的图像
如何使用2D滤波器进行1D卷积?
尝试了@Marcin Możejko建议的方法。
dim_x = 3
dim_y = 6
color_channels = 3
#model.add(ZeroPadding2D((6,4),input_shape=(6,3,3)))
model.add(Conv2D(filters = 32,kernel_size=(dim_y,1) , activation='linear' , input_shape = (6,3,3)))
print model.output_shape
model.add(Reshape((dim_x,color_channels)))

错误:

The total size of the new array must be unchanged

1
当一个样本进入卷积层时,它的形状会是什么?卷积核的形状会是什么?你期望得到什么输出?如果你能回答这些问题,我们就可以帮助你,否则这个问题太模糊了。 - Nassim Ben
2
我尝试增加一些关于它如何执行的信息..希望这能澄清事情.. - J.Down
1个回答

3

假设你的图片 shape=(dim_x, dim_y, img_channels),你可以通过设置以下参数来获取一个 1D 卷积:

conv1d_on_image = Convolution2D(output_channels, 1, dim_y, border_mode='valid')(input)

请记住,这一层的输出形状应为(dim_x, 1, output_channels)。如果您想要输入是顺序的,可以使用Reshape层并设置:

conv1d_on_image = Reshape((dim_x, output_channels))(conv1d_on_image)

这将产生形状为 (dim_x, output_channels) 的输出。
有趣的是,这正是使用 Kerastf 后端的 Conv1D 的工作方式。

我收到一个错误消息,指出新数组的总大小必须保持不变。我将修改我的问题并添加示例。 - J.Down
奇怪。你能提供完整的代码和产生错误的行吗?你已经切换到Keras 2.0了吗? - Marcin Możejko
是的,我已经转换到Keras 2.0。 - J.Down

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接