SSD网络中的L2标准化

  • L1标准化:每个元素/L1范数
  • L2标准化:每个元素/L2范数

SSD网络中的L2标准化

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

                                                                                                    \hat{x}=\frac{x}{\left \| x \right \|^{2}}

其中xconv4_3特征图数据,x=\left ( x_{1} ...x_{d}\right )。   \left \| x \right \|^{2}为x的L2范数,\left \| x \right \|^{2}=\left ( \sum_{i=1}^{d}\left | x_{i} \right |^{2} \right )^{\frac{1}{2}}

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

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值