在Keras CNN中跨通道卷积:Conv1D,深度可分离的Conv,CCCP?

cli*_*ray 6 python conv-neural-network keras tensorflow

我正在喀拉拉邦开发CNN,以对具有10个光谱带的卫星图像进行分类。我在下面的网络中获得了不错的准确度(15个类别中的val准确度约为60%),但我想更好地合并单个像素的光谱带之间的关系,这可以产生有关像素类别的大量信息。我看到很多论文都在这样做,但通常被称为不同的事物。例如:

  • 级联跨通道参数池
  • 转换1D
  • 深度可分离卷积
  • 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'))
Run Code Online (Sandbox Code Playgroud)

小智 5

让我详细解释一下您提到的操作,以便您了解它们的直觉和用法之间的差异:

级联跨通道参数池:

这是Network-in-Network论文中介绍的,并在 Keras 中实现为GlobalAveragePooling2D(). 此操作对前一层中每个特征图的输出进行平均。

它是一个结构正则化器,强制特征图和类别之间的对应关系,因此特征图可以解释为类别置信度。它减少了参数数量并总结了空间信息,因此对输入的空间转换更加鲁棒。

GlobalAveragePooling2D()通常Dense()在其之前的模型中不使用任何层。

转换1D:

Conv1D()是一种与卷积运算完全相同的运算Conv2D(),但它仅适用于一维。Conv1D()通常用于序列或其他一维数据,而不是图像。

深度可分离卷积:

引用自 Keras文档

可分离卷积首先执行深度空间卷积(分别作用于每个输入通道),然后执行点向卷积,将所得输出通道混合在一起。height_multiplier 参数控制在深度步骤中每个输入通道生成多少个输出通道。

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

Conv2D(num_filters, (1, 1)):

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

卷积滤波器1x1用于减少/增加滤波器维度的维度,而不影响空间维度。这也被用在Google Inception架构中,用于过滤器空间的降维。

在您的具体情况下,我不确定您可以使用哪种技术。我认为没有Conv1D多大用处。您绝对可以使用 GlobalMaxPoolingorGlobalAveragePooling只要您不在Dense它们之前使用即可。这对于获取空间信息很有帮助。深度可分离卷积也可以用来代替层Conv2DConv2D(num_filters, (1, 1))对于过滤空间的降维非常有帮助,主要是在模型架构的最后阶段。

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