深度学习Batch Normalization

这篇具有很好参考价值的文章主要介绍了深度学习Batch Normalization。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

批标准化(Batch Normalization,简称BN)是一种用于深度神经网络的技术,它的主要目的是解决深度学习模型训练过程中的内部协变量偏移问题。简单来说,当我们在训练深度神经网络时,每一层的输入分布都可能会随着前一层参数的更新而发生变化,这种变化会导致训练过程变得不稳定。BN通过对每一层的输入进行标准化,使其均值为0,方差为1,从而使得网络在每一层都能接收到相对稳定的数据分布。

BatchNorm1d

对2d或3d数据进行批标准化(Batch Normlization)操作:

class torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True):

参数:

1.num_features:特征的维度 ( N , L ) − > L ; ( N , C , L ) − > C (N,L) -> L ;(N,C,L) -> C (N,L)>L;(N,C,L)>C

2.eps:在分母上添加一个定值,不能趋近于0

3.momentum:动态均值和动态方差所使用的动量,这里的momentum是对均值和方差进行的滑动平均。即 μ 1 = ( 1 − m o m e n t u m ) ∗ μ l a s t + m o m e n t u m ∗ μ μ_1 = (1 - momentum)* μ_{last} + momentum * μ μ1=1momentumμlast+momentumμ,这里μ1为输出值,μ_last为上一次的计算值,μ为真实计算的值

4.affine:布尔变量,是否为该层添加可学习的仿设变换,仿射变换的系数即为下式的gamma和beta

原理:

计算各个维度的均值和标准差: y = x − mean ⁡ [ x ] Var ⁡ [ x ] + ϵ ∗ g a m m a +  beta  y=\frac{x-\operatorname{mean}[x]}{\sqrt{\operatorname{Var}[x]}+\epsilon} * g a m m a+\text { beta } y=Var[x] +ϵxmean[x]gamma+ beta 

m = nn.BatchNorm1d(5, affine=False)
m1 = nn.BatchNorm1d(5, affine=True)
input = autograd.Variable(torch.randn(5, 5))
output = m(input)
output1 = m1(input)
print(input, '\n',output,'\n',output1)

tensor([[-0.6046, -0.8939,  1.3246,  0.2621,  1.0777],
        [ 0.9088, -0.6219,  0.9589,  0.7307,  0.5221],
        [ 1.7435,  0.6662, -0.5827,  0.3325, -0.8179],
        [-0.2250,  0.9930,  0.0504, -0.4509,  1.6605],
        [-0.5742,  1.6543,  0.6083,  0.5746, -0.3208]]) 
 tensor([[-0.9212, -1.2920,  1.2648, -0.0680,  0.7249],
        [ 0.7107, -1.0117,  0.7224,  1.0842,  0.1085],
        [ 1.6108,  0.3161, -1.5642,  0.1049, -1.3780],
        [-0.5119,  0.6530, -0.6252, -1.8215,  1.3713],
        [-0.8885,  1.3345,  0.2022,  0.7005, -0.8266]]) 
 tensor([[-0.9212, -1.2920,  1.2648, -0.0680,  0.7249],
        [ 0.7107, -1.0117,  0.7224,  1.0842,  0.1085],
        [ 1.6108,  0.3161, -1.5642,  0.1049, -1.3780],
        [-0.5119,  0.6530, -0.6252, -1.8215,  1.3713],
        [-0.8885,  1.3345,  0.2022,  0.7005, -0.8266]],
       grad_fn=<NativeBatchNormBackward>)

BatchNorm2d

对小批量(mini-batch)3d数据组成的4d输入进行批标准化(Batch Normalization)操作

class torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True):

1.num_features: 来自期望输入的特征数,C from an expected input of size (N,C,H,W)

2.eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5.

3.momentum: 动态均值和动态方差所使用的动量。默认为0.1.

4.affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数。

原理:

计算各个维度的均值和标准差: y = x − mean ⁡ [ x ] Var ⁡ [ x ] + ϵ ∗ g a m m a +  beta  y=\frac{x-\operatorname{mean}[x]}{\sqrt{\operatorname{Var}[x]}+\epsilon} * g a m m a+\text { beta } y=Var[x] +ϵxmean[x]gamma+ beta 

m = nn.BatchNorm2d(2, affine=False)
m1 = nn.BatchNorm2d(2, affine=True)
input = autograd.Variable(torch.randn(1,2,5, 5))
output = m(input)
output1 = m1(input)
print(input, '\n',output,'\n',output1)


tensor([[[[-0.2606, -0.8874,  0.8364,  0.0184,  0.8040],
          [ 1.0593, -0.6811,  1.3497, -0.6840, -2.0859],
          [-0.5399,  1.3321, -0.6281, -0.9044,  1.7491],
          [ 0.7559,  0.5607, -0.0447, -0.3868,  1.2404],
          [ 1.2078, -0.9642,  0.3980,  0.2087, -1.3940]],

         [[ 0.0493,  0.7372,  1.1964,  0.3862,  0.9900],
          [ 0.3544,  0.1767, -1.5780,  0.1642, -2.1586],
          [-0.4891, -0.7272,  1.6860, -1.6091,  0.9730],
          [-2.4161, -2.2096,  0.4617, -0.2965, -0.5663],
          [-0.0222, -0.7628,  0.6404, -1.4428,  0.5750]]]]) 
 tensor([[[[-0.3522, -0.9959,  0.7743, -0.0657,  0.7410],
          [ 1.0032, -0.7840,  1.3015, -0.7870, -2.2266],
          [-0.6390,  1.2833, -0.7296, -1.0134,  1.7116],
          [ 0.6917,  0.4912, -0.1305, -0.4818,  1.1892],
          [ 1.1557, -1.0748,  0.3242,  0.1298, -1.5161]],

         [[ 0.2560,  0.8743,  1.2870,  0.5588,  1.1015],
          [ 0.5302,  0.3705, -1.2066,  0.3593, -1.7285],
          [-0.2280, -0.4420,  1.7271, -1.2346,  1.0862],
          [-1.9599, -1.7743,  0.6266, -0.0549, -0.2974],
          [ 0.1917, -0.4739,  0.7873, -1.0852,  0.7285]]]]) 
 tensor([[[[-0.3522, -0.9959,  0.7743, -0.0657,  0.7410],
          [ 1.0032, -0.7840,  1.3015, -0.7870, -2.2266],
          [-0.6390,  1.2833, -0.7296, -1.0134,  1.7116],
          [ 0.6917,  0.4912, -0.1305, -0.4818,  1.1892],
          [ 1.1557, -1.0748,  0.3242,  0.1298, -1.5161]],

         [[ 0.2560,  0.8743,  1.2870,  0.5588,  1.1015],
          [ 0.5302,  0.3705, -1.2066,  0.3593, -1.7285],
          [-0.2280, -0.4420,  1.7271, -1.2346,  1.0862],
          [-1.9599, -1.7743,  0.6266, -0.0549, -0.2974],
          [ 0.1917, -0.4739,  0.7873, -1.0852,  0.7285]]]],
       grad_fn=<NativeBatchNormBackward>)

使用

用的地方通常在一个全连接或者卷积层与激活函数中间,即 (全连接/卷积)—- BatchNorm —- 激活函数。但也有人说把 BatchNorm 放在激活函数后面效果更好,可以都试一下。

BN的作用:

  1. 加速训练:BN可以使得网络的训练速度更快。因为经过标准化后,权重的更新方向更加明确,可以使用更大的学习率进行训练。
  2. 正则化效果:BN具有轻微的正则化效果,可以在一定程度上防止模型过拟合。
  3. 允许使用各种激活函数:在没有BN之前,某些激活函数(如sigmoid和tanh)在深层网络中容易导致梯度消失或梯度爆炸。但使用BN后,这些问题得到了缓解,因为数据分布被标准化了。

为什么要用

BN的作用

  1. 加速训练:BN可以使得网络的训练速度更快。因为经过标准化后,权重的更新方向更加明确,可以使用更大的学习率进行训练。
  2. 正则化效果:BN具有轻微的正则化效果,可以在一定程度上防止模型过拟合。
  3. 允许使用各种激活函数:在没有BN之前,某些激活函数(如sigmoid和tanh)在深层网络中容易导致梯度消失或梯度爆炸。但使用BN后,这些问题得到了缓解,因为数据分布被标准化了。

参考

(31条消息) BatchNorm2d原理、作用及其pytorch中BatchNorm2d函数的参数讲解_LS_learner的博客-CSDN博客_batchnorm2d

(31条消息) pytorch中批量归一化BatchNorm1d和BatchNorm2d函数_小白827的博客-CSDN博客_batchnorm1d 2d

BatchNorm 到底应该怎么用? - 项脊轩的琵琶树 (gitee.io)文章来源地址https://www.toymoban.com/news/detail-659137.html

到了这里,关于深度学习Batch Normalization的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【卷积层、BN层(Batch Normalization)、激活函数理解】

    卷积层的功能:对数据进行特征提取。 卷积层由输出特征面组成,每个特征面有无数个神经元(像素点)组成。其中输出特征面的每个神经元是通过卷积核对输入特征面中的每个神经元进行卷积操作得到的。 一个卷积核产生一张特征图,n个卷积核产生n个特征图。卷积核的设

    2024年02月07日
    浏览(31)
  • DNNGP模型解读-early stopping 和 batch normalization的使用

    一、考虑的因素(仅代表个人观点) 1.首先我们看到他的这篇文章所考虑的不同方面从而做出的不同改进,首先考虑到了对于基因组预测的深度学习方法的设计 ,我们设计出来这个方法就是为了基因组预测而使用,这也是主要目的,所以要抓住事物的主要方面。 2.DNNGP相比于

    2024年02月12日
    浏览(28)
  • 深度学习中epoch、batch、batch size和iterations详解

    1.epoch 在训练一个模型时所用到的全部数据; 备注:一般在训练时都要使用多于一个的epoch,因为在神经网络中传递完整的数据集仅仅一次是不够的,只有将完整的数据集在同样的神经网络中传递多次,才会得到比较优秀的训练效果,当然也不行,容易过拟合,所以要根据实

    2023年04月25日
    浏览(27)
  • pytorch10:正则化(weight_decay、dropout、Batch Normalization)

    往期回顾 pytorch01:概念、张量操作、线性回归与逻辑回归 pytorch02:数据读取DataLoader与Dataset、数据预处理transform pytorch03:transforms常见数据增强操作 pytorch04:网络模型创建 pytorch05:卷积、池化、激活 pytorch06:权重初始化 pytorch07:损失函数与优化器 pytorch08:学习率调整策略

    2024年02月01日
    浏览(35)
  • 深度学习中Epoch和Batch Size的关系

    在深度学习中,Epoch(周期)和 Batch Size(批大小)是训练神经网络时经常使用的两个重要的超参数。它们之间的关系是通过以下方式连接的: Epoch 表示整个训练数据集被神经网络完整地通过了一次。在一个 Epoch 内,神经网络会看到训练数据集中的所有样本一次,进行前向传

    2024年01月16日
    浏览(33)
  • 深度学习中,什么是batch-size?如何设置?

    batch-size 是深度学习模型在训练过程中一次性输入给模型的样本数量。它在训练过程中具有重要的意义,影响着训练速度、内存使用以及模型的稳定性等方面。 以下是 batch-size 大小的一些影响和意义: 训练速度 :较大的 batch-size 通常可以加快训练速度,因为在每次迭代中处

    2024年02月12日
    浏览(26)
  • 深度学习记录--mini-batch gradient descent

    batch:段,块 与传统的batch梯度下降不同,mini-batch gradient descent将数据分成多个子集,分别进行处理,在 数据量非常巨大 的情况下,这样处理可以及时进行梯度下降,大大加快训练速度 两种方法的梯度下降图如下图所示 batch gradient descent是一条正常的 递减 的曲线 mini-batch

    2024年01月21日
    浏览(38)
  • 深入理解ECAPA-TDNN——兼谈Res2Net、ASP统计池化、SENet、Batch Normalization

    ECAPA-TDNN是说话人识别中基于TDNN的神经网络,是目前最好的单体模型之一 关于TDNN,可以参考深入理解TDNN(Time Delay Neural Network)——兼谈x-vector网络结构 TDNN本质上是1维卷积,而且常常是1维膨胀卷积,这样的一种结构非常注重context,也就是上下文信息,具体而言,是在frame

    2024年02月03日
    浏览(29)
  • 深度学习中epoch、batch、step、iteration等神经网络参数是什么意思?

    epoch: 表示将训练数据集中的所有样本都过一遍 (且仅过一遍)的训练过程。在一个epoch中,训练算法会按照设定的顺序将所有样本输入模型进行前向传播、计算损失、反向传播和参数更新。一个epoch通常包含多个step。 batch:一般翻译为“批次”,表示一次性输入模型的一组

    2024年02月10日
    浏览(29)
  • 【深度学习】神经网络中 Batch 和 Epoch 之间的区别是什么?我们该如何理解?

    随机梯度下降(Stochastic Gradient Descent,SGD)是一种优化算法,用于在机器学习和深度学习中更新模型参数,以最小化损失函数。与传统的梯度下降算法不同,SGD在每次参数更新时只使用一个样本(或一小批样本),而不是使用整个训练数据集。这使得SGD具有更快的收敛速度,

    2024年02月10日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包