摘要
基于batchnormal研究人员们开发出了GroupNormal和SwitchableNormal等方法来从不同的角度考虑minibatch内的均值和方差以及特征归一化,随后进行可学习的逐通道的仿射变换。而局域序列-激活(SE)的逐通道特征注意力方法则着重校准逐通道的特征。在这篇文章中,研究人员提出了一种联合特征归一化和特种通道注意力的方法AttentiveNoramal,将序列激活的优点集成到BN中。AN为每个通道学习小规模的尺度和偏置参数,并将权重的和用于最终的仿射变换。这些权重浴室里相关,并基于逐通道的注意力来学习,基于SE的思想补充了BN的不足。
#Pytorch实现AttentionNorm
class AttenNorm(nn.BatchNorm2d):
def _init_(self,C,K,eps,momentum,running):
super(AttenNorm,self)._init_(C,eps = eps,momentum=momentum,affine=False,track_running_)stats=running)
self.gamma = nn.Parameter(torch.Tensor(K,C))
self.beat = nn.Parameter(torch.Tensor(K,C))
self.avgpool = nn.Adaptiveavgpool2d(1)
self.fc = nn.Linear(C,K)
self.sigmoid = nn.Sigmoid()
def forward(self,x):
output = super(AttenNorm,self).forward(x)
size = output.size()
b,c,_,_, = x.size()
y = self.avgpool(x).view(b,c)
y = self.fc(y)
y = self.sigmoid(y)
gamma = y@self.gamma
beta = y@self.beta
gamma = weight.unsqueeze(-1).unsqueeze(-1).expand(size)
beta = bias.unsqueeze(-1).unsqueeze(-1).expand(size)
return gamma*output + beta