2017ImageNet分类比赛冠军模型SENet(Squeeze-and-Excitation Networks)。paper、Code
一、
提出的动机:考虑通道之间的关系,以此来提升网络性能。希望能够显式地建模特征通道之间的相互依赖关系。
思想:通过学习的方式来获得每个特征通道的重要程度,依照这个重要程度来提升有用的特征并抑制对当前任务用处不大的特征。
二、模型结构
经过原有卷积变化Ftr得到特征图,首先是squeeze操作,仅包括一个全局平均池化。接着是excitation操作,包括两个全连接层和一个Relu。其中第一个FC对特征维度降低到输入的r分之一(减少率),然后经过Relu激活后再经过一个FC,这样比一个FC的好处在于:1)具有更多的非线性,可以拟合通道间复杂的相关性;2)极大地减少了参数量和计算量。最后经过一个sigmoid门控得到0~1之间归一化的权重,并利用scale操作将归一化后的权重加权到每个通道的特征上。这样就完成了上面提到的思想了:提升有用的特征并抑制对当前任务用处不大的特征。
公式:1)squeeze的全局平均池化
2)Excitation: Adaptive Recalibration
,其中W1是第一个FC的参数,是Relu激活,W2是第二个FC的参数,是sigmiod激活。最终得到scale的参数s。
3)scale特征图
三、实例
其中左边为Inception,直接在Inception得到的特征图之后做SE就可以了。Resnet则稍有些技巧,需要在Addition后主支上Residual特征进行特征重标定。如果对Addition后主支上的特征重标定,由于在主支上存在0~1的scale操作,在网络较深BP优化时就会在靠近输入层容易出现梯度消失,导致模型难以优化。
四、添加SEnet层
将github中的文件放到原caffe路径中,重新编译。在prototxt中添加以下模块。
layer {
name: "pool2_1/gap"
type: "Pooling"
bottom: "conv2_1/x3"
top: "pool2_1/gap"
pooling_param {
pool: AVE
global_pooling: true
}
}
layer {
name: "fc2_1/sqz"
type: "InnerProduct"
bottom: "pool2_1/gap"
top: "fc2_1/sqz"
param {
lr_mult: 1.0
decay_mult: 1.0
}
param {
lr_mult: 2.0
decay_mult: 0.0
}
inner_product_param {
num_output: 16
weight_filler {
type: "msra"
}
bias_filler {
type: "constant"
value: 0.0
}
}
}
layer {
name: "relu2_1/sqz"
type: "ReLU"
bottom: "fc2_1/sqz"
top: "fc2_1/sqz"
}
layer {
name: "fc2_1/exc"
type: "InnerProduct"
bottom: "fc2_1/sqz"
top: "fc2_1/exc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
param {
lr_mult: 2.0
decay_mult: 0.0
}
inner_product_param {
num_output: 256
weight_filler {
type: "msra"
}
bias_filler {
type: "constant"
value: 0.0
}
}
}
layer {
name: "sigm2_1/gate"
type: "Sigmoid"
bottom: "fc2_1/exc"
top: "fc2_1/exc"
}
layer {
name: "scale2_1"
type: "Scale"
bottom: "conv2_1/x3"
bottom: "fc2_1/exc"
top: "scale2_1"
scale_param {
axis: 0
bias_term: false
}
}