我们应该使用一维卷积进行图像分类吗?
TLDR; 不是单独的,但可能是组合的。
图像中像素之间的相关性(无论是 2D 还是 3D,由于多个通道)具有空间性质:给定像素的值受到垂直和水平相邻像素的高度影响。 2D/3D 卷积(Conv2D 或 Conv3D)的优势在于它们设法在两个空间方向(垂直和水平)上捕捉到这种影响。
相比之下,一维卷积或Conv1D 仅捕获两种相关性(垂直或水平)之一,因此产生的信息更加有限。就其本身而言,单个Conv1D 将遗漏大量信息。
尽管如此,由于 Conv2D 可以“分解”为两个 Conv1D 块(这类似于 MobileNet 架构中的 Pointwise 和 Depthwise 卷积),连接一个 Vertical Conv1D 和一个水平Conv1D 捕获两个轴上的空间相关性。这是对图像分类的有效方法,可替代Conv2D。
我们可以使用一维卷积进行图像分类吗?怎么样?
是的,我们可以。
您应该不重塑数据以减小尺寸:如果这样做,您会将图像的一端(如果垂直应用 Conv1D,则说顶部)与另一端(说底部),这打破了空间的连贯性。
这是一个关于如何(实现上述连接)的可能示例:
import tensorflow as tf
x = tf.random.normal(input_shape = (20, 100, 100, 3)) # your input batch
# Horizontal Conv1D
y_h = tf.keras.layers.Conv1D(
filters=32, kernel_size=3, activation='relu', input_shape=x.shape[2:])(x)
# Vertical Conv1D
y_v = tf.transpose(x, perm=[0, 2, 1, 3]) # Image rows to columns
y_v = tf.keras.layers.Conv1D(
filters=32, kernel_size=3, activation='relu', input_shape=x.shape[2:])(x)
# y_v = tf.transpose(y_v, perm=[0, 2, 1, 3]) # Undo transpose, optional
# Concatenate results
y = tf.keras.layers.Concatenate(axis=3)([y_h, y_v]) # Concatenate on the feature_maps
请注意,您需要多次操作才能获得结果(垂直和水平轴上的卷积),直接应用Conv2D 会更容易、更快捷地获得。
我们什么时候应该使用这个?
如果您的图像数据在一个轴上特别缺乏信息,而在另一个空间轴上却特别有趣,那么这可能是一个值得探索的想法。否则最好使用标准的Conv2D(大多数情况下,包括几乎所有公共图像数据集)。