总体介绍:
SEnet的主要思想是在图片的通道中加入注意力机制,提出了一种可应用于多种网络结构的Squeeze-and-Exitation结构(SE block)。
Squeeze and Excitation Blocks
如图所示,输入矩阵X通过卷积神经网络转化为矩阵U,再使用全局平均池化将矩阵压缩为1x1xchannel的矩阵,相当于提取了每一个通道的全局特征,通道上的实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野。
之后会使用门限机制,通过两个全连接层,如下图FC → ReLU → FC → Sigmoid的流程,获取到通道间的相关信息。最后通过乘法将权重加权给每一个通道。其中第一个全连接层的通道数为C/r,r为缩放比例,用来减少计算量。再在第二个全连接层将通道数重新放大到与原来相同的大小。
Instantiations
在inception和ResNet中加入SE block,通常是如下图所示添加。
Model and Computational Complexity
文中表示,SE-ResNet的计算量主要增加在最后几层,会大约新增10%的参数,去掉最后阶段的SE block性能并没有太大的影响,而新增加的参数减少到4%。
Experiment
在各计算机视觉场景中都有较大的提升。
Ablation Study
Reduction ratio(降维系数)
通过实验测得r=16时的效果最好
Squeeze Operator
全局平均池化远优于全局最大池化
Intergration strategy(插入位置)
测试了四种位置的嵌入,大多效果都非常理想。
总结
提出了SENets,是利用了注意力机制的一种网络结构
该结构可以方便加入到其他网络中
参考文章:https://blog.csdn.net/hwl19951007/article/details/84961735
第一次写论文笔记,借鉴了很多,之后按这种格式记录读过的论文。
代码
import torch.nn as nn
import torch.nn.functional as F
class SE(nn.Module):
def __init__(self, inchannel, ratio):
super(SE, self).__init__()
self.squeeze = nn.AdaptiveAvgPool2d((1, 1))
self.compress = nn.Conv2d(inchannel, inchannel//ratio, 1, 1, 0)
self.excitation = nn.Conv2d(inchannel//ratio, inchannel, 1, 1, 0)
def forward(self, x):
out = self.squeeze(x)
out = self.compress(out)
out = F.relu(out)
out = self.excitation(out)
return F.sigmoid(out)
该代码中使用1x1的卷积核代替了全连接的操作,是因为在全局平均池化操作后,矩阵形状也为1x1xc。该做法可以可以省去将张量进行降维和升维的过程。