SSD网络中的L2标准化
程序员文章站
2024-03-17 11:28:46
...
- L1标准化:每个元素/L1范数
- L2标准化:每个元素/L2范数
SSD网络中的L2标准化
VGG16的conv4_3
特征图的大小为38*38,网络层靠前,方差比较大,需要加一个L2标准化,以保证和后面的检测层差异不是很大。L2标准化的公式如下:
其中为conv4_3
特征图数据,。 为x的L2范数,
同时,这里还要注意的是如果简单的对一个层的输入进行L2标准化就会改变该层的规模,并且会减慢学习速度,因此这里引入了一个缩放系数 ,对于每一个通道l2标准化后的结果为: ,通常的值设10或者20,效果比较好。
代码如下所示:(代码摘自https://github.com/amdegroot/ssd.pytorch/)
import torch
import torch.nn as nn
import torch.nn.init as init
class L2Norm(nn.Module):
def __init__(self,n_channels, scale):
super(L2Norm,self).__init__()
self.n_channels = n_channels
self.gamma = scale or None
self.eps = 1e-10
#将一个不可训练的类型Tensor转换成可以训练的类型parameter
self.weight = nn.Parameter(torch.Tensor(self.n_channels))
self.reset_parameters()
def reset_parameters(self):
init.constant_(self.weight,self.gamma) #用值填充向量,即给weight赋值
def forward(self, x):
#计算x的L2范数,暂时不知道self.eps参数的意义
norm = x.pow(2).sum(dim=1, keepdim=True).sqrt()+self.eps
#x /= norm
x = torch.div(x,norm)
#乘以缩放系数
out = self.weight.unsqueeze(0).unsqueeze(2).unsqueeze(3).expand_as(x) * x
return out