前言:经典重温,不怎么加参数提升性能的模块SENet
代码:【here】
Squeeze-and-Excitation Networks
引言
神经网络中每一层的卷积实际就是一组卷积核作用在带着通道的空间局部区域上,一起融合有着感受野的空间信息和通道信息
At each convolutional layer in the network, a collection of filters expresses neighbourhood spatial connectivity patterns along input channels—fusing spatial
and channel-wise information together within local receptive fields.
现有研究表明,学习特征层之间的空间关系是能帮助提升网络性能的
Recent research has shown that the representations produced by CNNs can
be strengthened by integrating learning mechanisms into the network that help capture spatial correlations between features.
因此,设计一个SENet,一个可以插入到其他网络的模块
SENet表示如下:
具体的带尺寸的特征图表示
方法
由于设计实在过于简单,就略过公式部分,代码如下:
from torch import nn
class SELayer(nn.Module):
def __init__(self, channel, reduction=16):
super(SELayer, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(channel, channel // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(channel // reduction, channel, bias=False),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.size()
y = self.avg_pool(x).view(b, c)
y = self.fc(y).view(b, c, 1, 1)
return x * y.expand_as(x)
其中,插入到其他网络中的表示为
Inception(单通路,插入到原有的模块的之后,很好理解)
ResNet(带有旁路)
模块参数:
由于添加的需要学习的部分,仅仅只有一个降通道的MLP( C * C/r)和一个升通道的MLP(r/C * C),因此,多层(s层)的SENet的参数
实验
分类实验
ImageNet(插入到各种网络中比较)
CIFAR
还有一些其他的可以证明模块性能强大的实验,就不放了
消融实验
- 对于降通道超参数r,
-
对于Pooling选max还是average,以及激活函数的选择
-
以及对于ResNet有旁路的网络的情况,SEnet放哪里的问题
不过作者还提到,可以把SENEet放到具体的残差block里面的某个3 * 3 卷积之后,这样性能会更好,不过具体网络的问题具体设计 -
同时作者比较了对于不同层的SENet的作用,在网络的深层的作用效果更明显,不过可以混叠起来,每一层都加一个SENet
- 对于全局信息的利用,作者比较了进行squeeze(pooling)和不进行squeeze的区别
总结
看完论文感慨,那个时代真是卷积的最好的发展时代,各种惊艳的设计层出不穷,让人感觉找个方向切入做都能出效果,如今Cv卷到不行,而卷积的设计都做的差不多了,也慢慢的审美疲劳了…