zoukankan      html  css  js  c++  java
  • 批规范化与BatchNorm1d学习

    1.介绍

    https://blog.csdn.net/qq_25737169/article/details/79048516

    Batchnorm是深度网络中经常用到的加速神经网络训练,加速收敛速度及稳定性的算法。

    在训练模型时,学习的是数据集的分布,但是如果每一个批次batch分布不同,那么就会给训练带来困难;

    另一方面,数据经过一层层网络计算后,其数据分布也在发生着变化,此现象称为Internal covariant shift,会给下一层的网络学习带来困难。

    1.1 Internal covariant shift 内部协变量偏移

    即:每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难。

    covariant shift描述的是训练数据和测试数据存在分布的差异性,给网络的泛化性和训练速度带来了影响。

    //链接中有个图讲的很好,经过数据归一化,就能加快训练速度,因为b一般初始化为0?

    2.原理

     对每一层的输出后的数据做归一化,加入可训练的参数做归一化,其实过程非常简单。

     β是平移参数,γ是缩放参数。如果γ=σ,β=μ参数,那么y就取消了归一化。所以,综上保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。

    3.代码

    def Batchnorm_simple_for_train(x, gamma, beta, bn_param):
    """
    param:x    : 输入数据,设shape(B,L)
    param:gama : 缩放因子  γ
    param:beta : 平移因子  β
    param:bn_param   : batchnorm所需要的一些参数
        eps      : 接近0的数,防止分母出现0
        momentum : 动量参数,一般为0.90.990.999
        running_mean :滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
        running_var  : 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
    """
        running_mean = bn_param['running_mean']  #shape = [B]
        running_var = bn_param['running_var']    #shape = [B]
        results = 0. # 建立一个新的变量
        
        x_mean=x.mean(axis=0)  # 计算x的均值
        x_var=x.var(axis=0)    # 计算方差
        x_normalized=(x-x_mean)/np.sqrt(x_var+eps)       # 归一化
        results = gamma * x_normalized + beta            # 缩放平移
    
        running_mean = momentum * running_mean + (1 - momentum) * x_mean
        running_var = momentum * running_var + (1 - momentum) * x_var
        
        #记录新的值
        bn_param['running_mean'] = running_mean
        bn_param['running_var'] = running_var 
        
        return results , bn_param

    其实上述running_mean和var在训练过程中没有用到,主要作用是在测试集的时候用到,因为测试集它是针对一个样本,不存在均值。

    在训练过程中,是直接取running_mean和running_var的, 

    4.BatchNorm1d用法

    https://pytorch.org/docs/stable/nn.html

    https://blog.csdn.net/qsmx666/article/details/109527726

    • num_features – 特征维度
    • eps – 为数值稳定性而加到分母上的值。
    • momentum – 移动平均的动量值。
    • affine – 一个布尔值,当设置为真时,此模块具有可学习的仿射参数。

     其中γ默认为1,β默认为0,并且x是特征,不是样本。。从下面的例子中可以看出:

    复制代码
    import torch.nn as  nn
    import torch
    m = nn.BatchNorm1d(3)
    input = torch.randn(2, 3)
    output = m(input)
    
    #输出
    >>> output
    tensor([[-0.9762,  0.3067, -0.5193],#做一个归一化
            [ 0.9762, -0.3067,  0.5193]], grad_fn=<NativeBatchNormBackward>)
    复制代码
  • 相关阅读:
    配置cinder使用NFS后端
    配置glance使用NFS后端
    制作windows镜像
    fuel健康检查Heat失败的原因
    重启OpenStack服务步骤
    改变nova-compute默认位置的方法
    改变cinder默认vg的方法
    centos lvm常用命令
    【一天一个canvas】图像处理教程(十二)
    【一天一个canvas】阴影效果呈现方法(十一)
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/14272428.html
Copyright © 2011-2022 走看看