在Keras卷积神经网络中的跨通道卷积:Conv1D、深度可分离卷积、CCCP?

6
我正在使用keras开发CNN,用于分类具有10个光谱波段的卫星图像。我在下面的网络中获得了不错的准确性(在15个类别中获得了约60%的验证准确性),但我希望更好地将单个像素的光谱波段之间的关系纳入到模型中,从而可以获得有关像素类别的大量信息。我看到很多论文都这样做,但通常被称为不同的方法,例如:
  • 级联交叉通道参数汇聚
  • Conv1D
  • 深度可分离卷积
  • Conv2D(num_filters,(1,1))
我不确定这些方法之间的区别(如果有的话)以及如何在我简单的CNN中实现它们。我也不清楚我应该在最开始还是最后阶段进行这个操作。我倾向于在通道仍然是原始光谱数据而不是特征图时立即执行此操作。
input_shape = (32,32,10)
num_classes = 15

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same', input_shape=input_shape))
model.add(Activation('relu'))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

我知道这不是你具体要问的问题,但对于这种深度网络来说,15个类似乎太多了,你尝试增加层数了吗?那会有什么影响? - Recessive
1个回答

5
让我稍微详细解释一下你提到的操作,以便你了解它们的直觉和用法之间的差异:
级联跨通道参数池化:
这是在Network-in-Network论文中介绍的,并且在Keras中实现为GlobalAveragePooling2D()。此操作对先前层中每个特征映射的输出进行平均。
它是一种结构正则化器,强制执行特征映射和类别之间的对应关系,因此可以将特征映射解释为类别置信度。它减少了参数数量并总结了空间信息,因此对输入的空间平移更加稳健。
通常在模型中不使用Dense()层之前使用GlobalAveragePooling2D()
Conv1D: Conv1D()是一种卷积操作,与Conv2D()完全相似,但仅适用于一个维度。 Conv1D()通常用于序列或其他1D数据,而不是图像。
深度可分离卷积:

引用自Keras 文档

可分离卷积首先执行深度空间卷积(逐个处理每个输入通道),然后进行点卷积,将生成的输出通道混合在一起。depth_multiplier参数控制在深度步骤中每个输入通道生成多少个输出通道。

这篇博客很好地解释了深度可分离卷积。

Conv2D(num_filters, (1, 1)):

这通常被称为1x1卷积,在Network-in-Network论文中介绍。

1x1卷积滤波器用于在不影响空间维度的情况下减少/增加滤波器维度。这在Google Inception体系结构中也用于滤波器空间的降维。

在您的特定情况下,我不确定您可以使用哪种技术。我认为Conv1D没有太大用处。只要在它们之前不使用Dense,您肯定可以使用GlobalMaxPoolingGlobalAveragePooling。这有助于获取空间信息。深度可分离卷积也可以用于替代您的Conv2D层。Conv2D(num_filters, (1, 1))非常有助于在模型架构的最后阶段减少滤波器空间维度。

也许,如果您遵循资源,您会更好地理解这些操作并看到它们如何应用于您的问题。


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