我正在喀拉拉邦开发CNN,以对具有10个光谱带的卫星图像进行分类。我在下面的网络中获得了不错的精度(在15个类别中的val精度约为60%),但我想更好地合并单个像素光谱带之间的关系,这样可以在像素类别中产生大量信息。我看到很多论文都在这样做,但通常被称为不同的事物。例如:
我不确定这些方法(如果有)之间的区别以及如何在下面的简单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'))
答案 0 :(得分:2)
让我详细解释您提到的操作,以便您了解其直觉和用法之间的区别:
此内容在Network-in-Network文件中进行了介绍,并在Keras中以GlobalAveragePooling2D()
的形式实现。此操作对上一层中每个要素地图的输出取平均值。
这是一个结构化正则化器,用于强制要素图之间的对应关系 和类别,因此要素图可以解释为类别置信度。它减少了参数数量并汇总了空间信息,因此对输入的空间转换更加健壮。
GlobalAveragePooling2D()
通常在其模型中没有Dense()
层的情况下使用。
Conv1D()
是与Conv2D()
完全相似的卷积运算,但仅适用于一维。 Conv1D()
通常用于序列或其他1D数据,而不是图像。
引用Keras documentation
可分离的卷积包括首先执行深度空间卷积(其分别作用于每个输入通道),然后是将所有结果输出通道混合在一起的逐点卷积。 depth_multiplier参数控制在深度步骤中每个输入通道生成多少个输出通道。
此blog很好地解释了深度可分离卷积。
这通常称为1x1
卷积,在Network-in-Network论文中进行了介绍。
1x1
卷积滤波器用于在不影响空间尺寸的情况下减小/增加滤波器尺寸。 Google Inception体系结构中也使用了这种方法,以减少过滤器空间的维数。
在您的特定情况下,我不确定您可以使用哪种技术。我认为Conv1D
没什么用。只要您不使用GlobalMaxPooling
,就可以肯定使用GlobalAveragePooling
或Dense
。这有助于获取空间信息。深度分离卷积也可以用来代替Conv2D
层。 Conv2D(num_filters, (1, 1))
对于减少过滤器空间的维数非常有帮助,主要是在模型架构即将结束时。
也许,如果您遵循这些资源,则可以更好地了解这些操作,并了解它们如何应用于您的问题。