pytorch基础学习3

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、批归一化

  • 归一化定义
    不同的评价指标往往具有不同的量纲(例如:对于评价房价来说量纲指:面积、房价数、楼层等;对于预测某个人患病率来说量纲指:身高、体重等。)和量纲单位(例如:面积单位:平方米、平方厘米等;身高:米、厘米等),这样的情况会影响到数据分析的结果,为了消除指标之间量纲的影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。
    2.批归一化的原因
  • 在现实生活中,一般的数据量都非常的大,此时若用算法进行处理,需要一次性加载进如此庞大的数据量,通常没有这么大的内存,无法实现。
    用所有数据量的均值和方差,容易造成过拟合,那么将数据分批载入训练模型中,其实就是对每批进行归一化,各批次的数据之间的均值与方差就一定的差别,这个差别一定程度上使得整个模型的训练变的更有鲁棒性,同样能够减少过拟合。

二、BN到底解决了什么?

一个标准的归一化步骤就是减均值除方差,那这种归一化操作有什么作用呢?我们观察下图,
在这里插入图片描述
a中左图是没有经过任何处理的输入数据,曲线是sigmoid函数,如果数据在梯度很小的区域,那么学习率就会很慢甚至陷入长时间的停滞。减均值除 方差后,数据就被移到中心区域如右图所示,对于大多数激活函数而言,这个区域的梯度都是最大的或者是有梯度的(比如ReLU),这可以看做是一种对抗梯度失的有效手段。对于一层如此,如果对于每一层数据都那么做的话,数据的分布总是在随着变化敏感的区域,相当于不用考虑数据分布变化了,这样训练起来更有效率。
在这里插入图片描述
对全局数据量使用归一化,本身就会对数据的分布产生破坏,另外在全局归一化后,处于中心区域的数据量将会减少很多,对于训练模型时,很多数据量将会产生梯度消失。使用批归一化就会如b图一般,对于每个批次的数据量即产生归一化的效果,又使得整个模型在训练过程中更多的数据量起到了相应的作用。

三、pytorchBN注释

对4D输入应用批处理归一化(带有额外通道维数的小批2D输入),如论文“`Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”中所述。
平均值和标准偏差是在小批量中按维度计算的,其中:math: ' \gamma '和:math: ' \beta '是大小为' C '的可学习参数向量(其中' C '是输入大小)。默认情况下,:math: ' \gamma '的元素设置为1,:math: ' \beta '的元素设置为0。标准偏差是通过有偏估计器计算的,相当于pytorch的方差‘torch.var’。
同样在默认情况下,在训练期间,这一层将继续运行其计算的平均值和方差的估计值,然后在评估期间使用这些估计值进行归一化。运行估计值保持默认值:“momentum”为0.1。
如果' track_running_stats '被设置为' ' False ' ',那么这一层就不会继续运行估计值,而在评估期间也会使用批处理统计信息。

四、BN部分参数

num_features: 来自期望输入的特征数,该期望输入的大小为’batch_size x num_features x height x width’。通常是对通道数进行归一化。
eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
momentum: 动态均值和动态方差所使用的动量。默认为0.1。
affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数。

Shape:

输入:(N, C,H, W)
输出:(N, C, H, W)(输入输出相同)


©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页