论文链接:https://arxiv.org/abs/1709.01507 代码地址:https://github.com/hujie-frank/SENet
SENet赢得了ILSVRC比赛的第一名,将top-5的错误率减少到2.251%,比一年前下降了25%。
SE block是组成网络的一种结构,SE block的堆叠就可以构成SENet。这点可以类比于GooLeNet和Inception的关系。
X ∈ H ′ ∗ W ′ ∗ C ′ X \in H'*W'*C' X∈H′∗W′∗C′是输入, F t r F_{tr} Ftr表示一个或者一堆卷积操作, X X X经过卷积操作变为 U ∈ H ∗ W ∗ C U \in H*W*C U∈H∗W∗C。
对 U U U做Squeeze操作,具体可以理解为做一个平均池化,池化之后的shape为 1 ∗ 1 ∗ C 1*1*C 1∗1∗C。这样做的目的是统计各个channel的分布,公式为:
在Squeeze之后还要做一个Excitation操作,公式如下:
z 是squeeze的输出, W 1 ∈ C r ∗ C W_1\in \frac{C}{r}*C W1∈rC∗C, W 1 z W_1z W1z这个是做了一个全连接操作, δ \delta δ表示Relu操作, W 2 ∈ C ∗ C r W_2 \in C* \frac{C}{r} W2∈C∗rC , W 2 δ ( W 1 z ) ,W_2 \delta(W_1z) ,W2δ(W1z)又是一个全连接操作,最后 σ \sigma σ表示sigmoid操作。其中r是个超参数,文中r选择16
Excitation的目的:为什么要加全连接层呢?这是为了利用通道间的相关性来训练出真正的scale。一次mini-batch个样本的squeeze输出并不代表通道真实要调整的scale值,真实的scale要基于全部数据集来训练得出,而不是基于单个batch,所以后面要加个全连接层来进行训练。
第一个全连接把C个通道压缩成了C/r个通道来降低计算量(后面跟了RELU),第二个全连接再恢复回C个通道(后面跟了Sigmoid),r是指压缩的比例。作者尝试了r在各种取值下的性能 ,最后得出结论r=16时整体性能和计算量最平衡。
最后将求出的scale乘到U上,具体公式为:
SE block主要应用在AlexNet,VGG,Inception等网络上
对于无res结构的网络,例如Inception,使用方法如下图:
对于res结构网络,使用方法见下图:
https://zhuanlan.zhihu.com/p/32702350