【问题标题】:Convolving Across Channels in Keras CNN: Conv1D, Depthwise Separable Conv, CCCP?在 Keras CNN 中跨通道卷积:Conv1D、Depthwise Separable Conv、CCCP?
【发布时间】:2019-09-19 11:08:17
【问题描述】:

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

  • 级联跨通道参数池
  • 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 个类似乎很多,您是否尝试过增加层数?有什么影响?

标签: python tensorflow keras conv-neural-network


【解决方案1】:

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

级联跨通道参数池化:

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

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

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

Conv1D:

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

深度可分离卷积:

引用 Keras documentation

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

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

Conv2D(num_filters, (1, 1)):

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 2019-07-10
    • 2018-09-08
    • 2018-07-11
    • 1970-01-01
    • 2018-06-21
    • 2019-10-22
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多