Sequeeze-and Excitation Networks
注意力机制(Attention Mechanism)最初是应用在NLP上面的,计算机视觉发展到现在,注意力机制也被越来越多地应用在了CV领域。在这篇论文里面,作者把注意力机制应用在了通道层面,目的在于使得不同的特征通道拥有不同的权重大小,这样就能使得计算机能够有选择性地重视或忽视某些特征。
通常来说注意力机制的实现是通过一个专门的网络来实现的,很明显这就会对计算增加成本。但是作者说,他所提出的这套方法,可以以最小的额外计算成本获得最大的收益,因为这个网络的模型十分轻量。
该模型所提出的方法总共分为三个主要步骤,Sequeeze,Excitation,Scale。
首先,一个特征图X,经过卷积后得到了一个HxWxC的特征图U,U经过Sequence处理之后变成了1x1xC的形状,在经过Excitation处理之后,使得每一个通道获得了不同的权重,最后这个权重矩阵再与原特征图U经过Scale操作得到网络的最终输出
Sequeeze
该操作对应的就是Figure1中的Fsq操作,输入是一个HxWxC的矩阵,输出是一个1x1xC的矩阵。具体操作如下:
通过全局平均池化,将每个通道的二维特征(HxW)压缩为一个实数。这属于空间维度的一种特征压缩,因为这个实数是根据所有特征值计算出来的,所以在某种程度上具有平均感受野,保持通道数不变,所以通过squeeze操作后变为1x1xC
上式中的zc就是1x1xC这个矩阵中的第C个通道中的值,这个值其实就是特征图U的第C个通道的所有像素的平均值
Excitation
这个操作就是为每个通道分配权重,我们把经过Sequeeze操作之后生成的那个1x1xC的矩阵称作Z,具体操作如下:
Z矩阵经过一个全连接层,把维度压缩为C/r,经过ReLu激活之后,再接一个全连接层把维度变回C,最后经过sigmoid激活得到输出。
其中δ表示ReLu,σ表示sigmoid
Scale
作者就是将Excitation得到的每个通道的权重,对应通道乘回原特征图U
其中uc就是特征图U的第c个通道,sc就是Excitation输出的1x1xC的权重矩阵的第c个通道
代码实现
import torch.nn as nn
class SE_NET(nn.Module):
def __init__(self,width,height,channel,dimention):
super(SE_NET, self).__init__()
self.width = width
self.height = height
self.channel = channel
self.dimention = dimention
self.avgpooling = nn.AvgPool2d(self.width,stride=1)
self.layer = nn.Sequential(
nn.Linear(self.channel, self.dimention),
nn.ReLU(inplace=True),
nn.Linear(self.dimention,self.channel),
nn.Sigmoid()
)
def forward(self,x):
res = self.Squeeze(x)
res = res.view(1,-1)
res = self.excitation(res)
res = self.scale(res,x)
return res
def Squeeze(self,x):
res = self.avgpooling(x)
return res
def excitation(self,x):
res = self.layer(x)
return res
def scale(self,x,y):
res = x*y
return res