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

时间:2019-04-30 18:30:20

标签: python tensorflow keras conv-neural-network

我正在喀拉拉邦开发CNN,以对具有10个光谱带的卫星图像进行分类。我在下面的网络中获得了不错的精度(在15个类别中的val精度约为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'))

1 个答案:

答案 0 :(得分:2)

让我详细解释您提到的操作,以便您了解其直觉和用法之间的区别:

级联的跨通道参数池:

此内容在Network-in-Network文件中进行了介绍,并在Keras中以GlobalAveragePooling2D()的形式实现。此操作对上一层中每个要素地图的输出取平均值。

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

GlobalAveragePooling2D()通常在其模型中没有Dense()层的情况下使用。

Conv1D:

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

深度可分卷积:

引用Keras documentation

  

可分离的卷积包括首先执行深度空间卷积(其分别作用于每个输入通道),然后是将所有结果输出通道混合在一起的逐点卷积。 depth_multiplier参数控制在深度步骤中每个输入通道生成多少个输出通道。

blog很好地解释了深度可分离卷积。

Conv2D(num_filters,(1,1)):

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

1x1卷积滤波器用于在不影响空间尺寸的情况下减小/增加滤波器尺寸。 Google Inception体系结构中也使用了这种方法,以减少过滤器空间的维数。

在您的特定情况下,我不确定您可以使用哪种技术。我认为Conv1D没什么用。只要您不使用GlobalMaxPooling,就可以肯定使用GlobalAveragePoolingDense。这有助于获取空间信息。深度分离卷积也可以用来代替Conv2D层。 Conv2D(num_filters, (1, 1))对于减少过滤器空间的维数非常有帮助,主要是在模型架构即将结束时。

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