在keras中使用2d内核执行1d卷积
Performing 1d convolution using 2d kernel in keras
我目前正在研究 CNN 网络,其中我想在图像上应用 2d 内核,但它只需要执行 1d 卷积,这意味着它只需要沿一个轴(x 轴)移动在这种情况下)。
内核的形状与图像的y轴相同。目前应用的过滤器数量不是问题。
一个例子:
给定大小为 (6,3,3) = (rows, cols, color_channel)
的图像
我应该如何执行给定 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
假设您的图像 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)
的输出。
一个有趣的事实是,这正是 Conv1D
在具有 tf
后端的 Keras
中的工作方式。
我目前正在研究 CNN 网络,其中我想在图像上应用 2d 内核,但它只需要执行 1d 卷积,这意味着它只需要沿一个轴(x 轴)移动在这种情况下)。
内核的形状与图像的y轴相同。目前应用的过滤器数量不是问题。
一个例子: 给定大小为 (6,3,3) = (rows, cols, color_channel)
的图像我应该如何执行给定 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
假设您的图像 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)
的输出。
一个有趣的事实是,这正是 Conv1D
在具有 tf
后端的 Keras
中的工作方式。