在神经网络中,注意力机制通常是一个额外的神经网络,能够硬性的选择输入的某些部分,或者是给输入的不同部分分配不同的权重。注意力机制能够从大量的信息中筛选出重要的信息。并且引用的注意力机制有很多方法,可以在空间维度增加引入注意力机制,也可以在通道维度增加注意力机制(SE),当然也有混合维度(CBAM)即空间维度和通道维度增加注意力机制。
1.通道注意力机制(SENet)
SE注意力机制在通道维度增加注意力机制,一共分为三个步骤:
(1)squeeze(Fsq):通过全局平均池化,将每个通道的二位特征(H*W)压缩为1个实数,将特征图从(C*H*W)压缩为(1*1*C)
(2)excitation(Fex): 给每个特征通道生成一个权重值,论文中通过两个全连接层构建通道间的相关性,输出权重数目和输入特征图的通道数相同。
其中SERatio是一个缩放参数,这个参数的目的是为了减少通道个数从而降低计算量。 第一个全连接层有C*SERatio个神经元,输入为1×1×C,输出1×1×C×SERadio。 第二个全连接层有C个神经元,输入为1×1×C×SERadio,输出为1×1×C。
(3)scale操作:将归一化权重和原输入特征图逐通道相乘,生成加权后的特征图。
(h*w*c)*(1*1*c)==>(H*W*C)
SEnet的和核心思想是通过全连接根据Loss损失来自动学习特征权重,而不是直接根据特征通道的数值分配来判断,使有效的特征通道的权重大。
pytorch 实现SE模块
import torch
from torch import nn
class SE(nn.Module ):
def __init__(self,ch_in,reduction=16):
super(SE, self).__init__()
self.avg_pool=nn.AdaptiveAvgPool2d(1)
self.fc=nn.Sequential(
nn.Linear(ch_in, ch_in // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(ch_in // reduction, ch_in,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) # 注意力作用在每一个通道上
net=SE(64,32) #(输入尺寸,比率)
print(net)