欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SSD网络中的L2标准化

程序员文章站 2024-03-17 11:28:46
...
  • L1标准化:每个元素/L1范数
  • L2标准化:每个元素/L2范数

SSD网络中的L2标准化

VGG16的conv4_3特征图的大小为38*38,网络层靠前,方差比较大,需要加一个L2标准化,以保证和后面的检测层差异不是很大。L2标准化的公式如下:

                                                                                                    SSD网络中的L2标准化

其中SSD网络中的L2标准化conv4_3特征图数据,SSD网络中的L2标准化。   SSD网络中的L2标准化为x的L2范数,SSD网络中的L2标准化

同时,这里还要注意的是如果简单的对一个层的输入进行L2标准化就会改变该层的规模,并且会减慢学习速度,因此这里引入了一个缩放系数SSD网络中的L2标准化 ,对于每一个通道l2标准化后的结果为: SSD网络中的L2标准化,通常SSD网络中的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

 

相关标签: SSD