比特派app下载苹果|batchno

作者: 比特派app下载苹果
2024-03-07 17:14:08

什么是批标准化 (Batch Normalization) - 知乎

什么是批标准化 (Batch Normalization) - 知乎首发于莫烦切换模式写文章登录/注册什么是批标准化 (Batch Normalization)莫烦​机器学习话题下的优秀答主数学是达成目的的工具, 理解才是达成目的桥梁, 所以这篇文章用浅显易懂的动画阐述了复杂的机器学习概念.强烈推荐通过动画的形式了解.所以首先放视频链接: Youtube 或者 优酷.代码实现请来这里看: Python 实现普通数据标准化Batch Normalization, 批标准化, 和普通的数据标准化类似, 是将分散的数据统一的一种做法, 也是优化神经网络的一种方法. 在之前 Normalization 的简介视频中我们一提到, 具有统一规格的数据, 能让机器学习更容易学习到数据之中的规律.每层都做标准化在神经网络中,

数据分布对训练会产生影响. 比如某个神经元 x 的值为1, 某个 Weights 的初始值为 0.1, 这样后一层神经元计算结果就是 Wx = 0.1; 又或者 x = 20,

这样 Wx 的结果就为 2.

现在还不能看出什么问题, 但是,

当我们加上一层激励函数, 激活这个

Wx 值的时候,

问题就来了. 如果使用

像 tanh

的激励函数, Wx

的激活值就变成了 ~0.1 和 ~1, 接近于 1

的部已经处在了 激励函数的饱和阶段,

也就是如果 x

无论再怎么扩大, tanh

激励函数输出值也还是 接近1. 换句话说, 神经网络在初始阶段已经不对那些比较大的 x 特征范围

敏感了.

这样很糟糕,

想象我轻轻拍自己的感觉和重重打自己的感觉居然没什么差别, 这就证明我的感官系统失效了.

当然我们是可以用之前提到的对数据做 normalization 预处理,

使得输入的 x

变化范围不会太大,

让输入值经过激励函数的敏感部分. 但刚刚这个不敏感问题不仅仅发生在神经网络的输入层,

而且在隐藏层中也经常会发生.只是时候 x

换到了隐藏层当中,

我们能不能对隐藏层的输入结果进行像之前那样的normalization 处理呢? 答案是可以的, 因为大牛们发明了一种技术,

叫做 batch

normalization,

正是处理这种情况.BN 添加位置Batch normalization 的 batch 是批数据, 把数据分成小批小批进行 stochastic gradient descent. 而且在每批数据进行前向传递 forward propagation 的时候, 对每一层都进行 normalization 的处理, BN 效果Batch normalization 也可以被看做一个层面. 在一层层的添加神经网络的时候,

我们先有数据 X, 再添加全连接层,

全连接层的计算结果会经过 激励函数 成为下一层的输入, 接着重复之前的操作. Batch Normalization (BN)

就被添加在每一个全连接和激励函数之间.之前说过,

计算结果在进入激励函数前的值很重要, 如果我们不单单看一个值,

我们可以说,

计算结果值的分布对于激励函数很重要. 对于数据值大多分布在这个区间的数据, 才能进行更有效的传递. 对比这两个在激活之前的值的分布.

上者没有进行 normalization, 下者进行了 normalization, 这样当然是下者能够更有效地利用 tanh

进行非线性化的过程.没有 normalize

的数据 使用 tanh

激活以后,

激活值大部分都分布到了饱和阶段, 也就是大部分的激活值不是-1,

就是1,

而 normalize 以后, 大部分的激活值在每个分布区间都还有存在.

再将这个激活后的分布传递到下一层神经网络进行后续计算, 每个区间都有分布的这一种对于神经网络就会更加有价值.

Batch

normalization 不仅仅 normalize 了一下数据, 他还进行了反 normalize 的手续. 为什么要这样呢?BN 算法我们引入一些

batch

normalization 的公式. 这三步就是我们在刚刚一直说的 normalization 工序, 但是公式的后面还有一个反向操作,

将 normalize 后的数据再扩展和平移. 原来这是为了让神经网络自己去学着使用和修改这个扩展参数 gamma, 和 平移参数 β, 这样神经网络就能自己慢慢琢磨出前面的 normalization 操作到底有没有起到优化的作用,

如果没有起到作用,

我就使用 gamma

和 belt

来抵消一些 normalization 的操作.最后我们来看看一张神经网络训练到最后,

代表了每层输出值的结果的分布图. 这样我们就能一眼看出 Batch

normalization 的功效啦. 让每一层的值在有效的范围内传递下去.如果你对 Batch Normalization 感兴趣, 也想实际动手做做看, 这还有更多使用 python 来编写 Batch Normalization 的教程: 莫烦 Python编辑于 2017-05-12 14:11深度学习(Deep Learning)机器学习神经网络​赞同 1350​​56 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录莫烦机器学习本来可以

浅析深度学习中BatchNorm - 知乎

浅析深度学习中BatchNorm - 知乎首发于人工智能学习专栏切换模式写文章登录/注册浅析深度学习中BatchNorm极光我们都知道,深度学习的话尤其是在CV上都需要对数据做归一化,因为深度神经网络主要就是为了学习训练数据的分布,并在测试集上达到很好的泛化效果,但是,如果我们每一个batch输入的数据都具有不同的分布,显然会给网络的训练带来困难。另一方面,数据经过一层层网络计算后,其数据分布也在发生着变化,此现象称为Internal Covariate Shift,接下来会详细解释,会给下一层的网络学习带来困难归一化公式如下:import paddle.fluid as fluid

from paddle.fluid.dygraph.base import to_variable

import numpy as np

x = np.random.random(size=(3, 10, 3, 7)).astype('float32')

with fluid.dygraph.guard():

x = to_variable(x)

batch_norm = fluid.BatchNorm(10)

hidden1 = batch_norm(x)“批量归一化”这个名称有些失败。归一化,意味着把 tensor 中的每个 element(或其 L1 范数)规范化到 [0, 1] 区间内(或者使其均值为 0 方差为 1)。按照这种叫法,在形式自由主义者看来,Sigmoid 是归一化,Tanh 也是归一化。归一化反倒成了一种特殊的激活函数。这显然不是我们想表达的。批量归一化的真正精妙之处在于,在归一化的过程中,BN 用一种极为节能的方式建模了整体与个体的相对关系。而 Sigmoid、Tanh 等激活函数虽然借助于其非线性性将每个 element(个体)规范化了,但是 element-wise 的操作始终不涉及到整体的统计特征。BatchNorm的改变:计算/更新均值计算/更新方差使用均值和方差将每个元素标准化batchnorm 的意义对于不同的激活函数有不用的意义。先说sigmoid函数,batchnorm对sigmoid函数最大的贡献是使得输入分布在sigmiod敏感区域, 这样使得sigmiod函数对不同样本的输出保持一种“区分”状态,不至于使它们全0或者全1。batchnorm对sigmoid另一个贡献主要是使得在反向传播过程中,梯度的衰减被减缓了(使用sigmoid函数很难出现梯度爆炸的情况)。再说relu函数,batchnorm对relu函数最大的贡献是防止了梯度的爆炸或者衰减(脑补一下relu的形态,再脑补一下权重矩阵连乘的结果)。 batchnorm对relu的另一个贡献不太确定,因为batchnorm有专门的缩放因子和偏移因子,它会依据梯度将部分样本至于零以下,或者将部分样本置于零以上,有效的配合了relu函数的过滤作用。...

if self.training:

# 计算当前 batch 的均值

mean = input.mean([0, 2, 3])

# 计算当前 batch 的方差

var = input.var([0, 2, 3], unbiased=False)

n = input.numel() / input.size(1)

with torch.no_grad():

# 使用移动平均更新对数据集均值的估算

self.running_mean = exponential_average_factor * mean\

+ (1 - exponential_average_factor) * self.running_mean

# 使用移动平均更新对数据集方差的估算

self.running_var = exponential_average_factor * var * n / (n - 1)\

+ (1 - exponential_average_factor) * self.running_var

else:

mean = self.running_mean

var = self.running_var

# 使用均值和方差将每个元素标准化

input = (input - mean[None, :, None, None]) / (torch.sqrt(var[None, :, None, None] + self.eps))

# 对标准化的结果进行缩放(可选)

if self.affine:

input = input * self.weight[None, :, None, None] + self.bias[None, :, None, None]

...1、BN 时作用于 batch 中所有样本 feature map 的归一化方法,统计 (N, H, W) 的均值和方差;这里,统计的对象可以魔改2、在规范化每个元素时,BN 使用了减均值除以方差的方法;这里,规范化的方式可以魔改;3、对标准化的结果进行缩放时,BN 使用了一个简单的仿射变换(线性变换),这里仿射变换的方式可以魔改。import torch

import torch.nn as nn

import torch.nn.functional as F

# 实现细节尽量贴合 official,使用习惯尽量贴合 pytorch

class AdaptiveBatchNorm2d(nn.Module):

"""Adaptive Batch Normalization

Parameters

num_features – C from an expected input of size (N, C, H, W)

eps – a value added to the denominator for numerical stability. Default: 1e-5

momentum – the value used for the running_mean and running_var computation. Can be set to None for cumulative moving average (i.e. simple average). Default: 0.1

affine – a boolean value that when set to True, this module has learnable affine parameters. Default: True

Shape:

Input: (N, C, H, W)

Output: (N, C, H, W) (same shape as input)

Examples:

>>> m = AdaptiveBatchNorm2d(100)

>>> input = torch.randn(20, 100, 35, 45)

>>> output = m(input)

"""

def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True):

super(AdaptiveBatchNorm2d, self).__init__()

self.bn = nn.BatchNorm2d(num_features, eps, momentum, affine)

self.a = nn.Parameter(torch.FloatTensor(1, 1, 1, 1))

self.b = nn.Parameter(torch.FloatTensor(1, 1, 1, 1))

def forward(self, x):

return self.a * x + self.b * self.bn(x)

# 这里是测试用例,可以作为示例使用

if __name__ == '__main__':

m = AdaptiveBatchNorm2d(100)

input = torch.randn(20, 100, 35, 45)

output = m(input)首先计算均值和方差,然后归一化,然后缩放和平移,完事!但是这是在训练中完成的任务,每次训练给一个批量,然后计算批量的均值方差,但是在测试的时候可不是这样,测试的时候每次只输入一张图片,这怎么计算批量的均值和方差,于是,就有了代码中下面两行,在训练的时候实现计算好mean没有它之前,需要小心的调整学习率和权重初始化,但是有了BN可以放心的使用大学习率,但是使用了BN,就不用小心的调参了,较大的学习率极大的提高了学习速度,Batchnorm本身上也是一种正则的方式,可以代替其他正则方式如dropout等另外,个人认为,batchnorm降低了数据之间的绝对差异,有一个去相关的性质,更多的考虑相对差异性,因此在分类任务上具有更好的效果。slim.batchnorm(

decay=0.999,

epsilon=0.001,

tf.layers.batch_normalization(

inputs,

axis=-1,

momentum=0.99,

epsilon=0.001,import numpy as np

import torch

from torch import nn

from torch.nn import Parameter

class BatchNorm(nn.Module):

def __init__(self, num_features, eps=1e-5, momentum=0.1):

super().__init__()

self.gamma = Parameter(torch.Tensor(num_features))

self.beta = Parameter(torch.Tensor(num_features))

self.register_buffer("moving_avg", torch.zeros(num_features))

self.register_buffer("moving_var", torch.ones(num_features))

self.register_buffer("eps", torch.tensor(eps))

self.register_buffer("momentum", torch.tensor(momentum))

self._reset()

def _reset(self):

self.gamma.data.fill_(1)

self.beta.data.fill_(0)

def forward(self, x):

if self.training:

mean = x.mean(dim=0)

var = x.var(dim=0)

self.moving_avg = self.moving_avg * momentum + mean * (1 - momentum)

self.moving_var = self.moving_var * momentum + var * (1 - momentum)

else:

mean = self.moving_avg

var = self.moving_var

x_norm = (x - mean) / (torch.sqrt(var + self.eps))

return x_norm * self.gamma + self.beta需要注意的是,BatchNorm 在训练阶段和测试阶段的行为是不一样的,要通过切换 model 的模式来合理应用。发布于 2020-08-06 00:12AI技术​赞同 48​​6 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录人工智能学习专栏聚焦人工智能,实战经

基础 | BatchNorm详解 - 知乎

基础 | BatchNorm详解 - 知乎首发于机器学习基础复习切换模式写文章登录/注册基础 | BatchNorm详解魔法学院的Chilia​哥伦比亚大学 理学硕士A) 简单了解BN层 (In 30 seconds)Batch-Normalization (BN)是一种让神经网络训练更快、更稳定的方法(faster and more stable)。它计算每个mini-batch的均值和方差,并将其拉回到均值为0方差为1的标准正态分布。BN层通常在nonlinear function的前面/后面使用。MLP without BNMLP with BNB). BN层的具体计算方法 (In 3 minutes)B.1)BN层的计算在training和testing阶段是不一样的。在training阶段:首先,用(1)(2)式计算一个mini-batch之内的均值 \mu_B 和方差 \sigma_B^2 .然后,用(3)式来进行normalize。这样,每个神经元的output在整个batch上是标准正态分布。Example of a 3-neurons hidden layer, with a batch of size b. Each neuron follows a standard normal distribution.最后,使用可学习的参数 \gamma 和 \beta 来进行线性变换。这是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入,从而保证整个network的capacity。也可以理解为找到线性/非线性的平衡:以Sigmoid函数为例,batchnorm之后数据整体处于函数的非饱和区域,只包含线性变换,破坏了之前学习到的特征分布 。增加\gamma 和 \beta能够找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头"死区"(如sigmoid)使得网络收敛速度太慢。在testing阶段:和training阶段不同,在testing阶段,可能输入就只有一个实例,看不到Mini-Batch其它实例,那么这时候怎么对输入做BN呢?为了解决这一问题,我们计算( \mu _pop ,σ_pop),其中:\mu_pop : estimated mean of the studied population ;σ_pop : estimated standard-deviation of the studied population.(\mu_pop ,σ_pop)是由训练时的(\mu_batch ,σ_batch)计算得到的。这两个值代替了在(1)(2)中算出的均值和方差,可以直接带入(3)式。如果阅读了BatchNorm的源码就会发现,这个全局统计量--均值和方差都是通过滑动平均的方法来实现的:running_mean = momentum * running_mean + (1 - momentum) * x_mean

running_var = momentum * running_var + (1 - momentum) * x_varB.2) 实际应用Pytorch: torch.nn.BatchNorm1d, torch.nn.BatchNorm2d, torch.nn.BatchNorm3d.Tensorflow / Keras: tf.nn.batch_normalization, tf.keras.layers.BatchNormalization在全连接网络中是对每个神经元进行归一化,也就是每个神经元都会学习一个γ和β;在CNN中应用时,需要注意CNN的参数共享机制。每层有多少个卷积核,就学习几个γ和β。B.3) BN层的效果虽然你可能还不完全理解BN层究竟为什么有用,但是我们都知道,BN层的确有用!可以看出,BN层能够让网络更快收敛、而且对不同的学习率鲁棒。在30倍的学习率下,模型依旧能够收敛,而且效果更好(可能因为高学习率帮助模型跳出了local minima)。C) 深入理解BN层Before BN, we thought that it was almost impossible to efficiently train deep models using sigmoid in the hidden layers. We considered several approaches to tackle training instability, such as looking for better initialization methods. Those pieces of solution were heavily heuristic, and way too fragile to be satisfactory. Batch Normalization makes those unstable networks trainable ; that's what this example shows. — Ian Goodfellow (rephrased from : source)C.1) BN层的缺点C.1.1) Stability Issue在testing阶段,我们使用 (\mu_pop ,σ_pop)做为evaluation set的估计值。但是,假如训练集和测试集分布不同会怎样呢?比如下图中,训练集是形如左图的sneakers,但是测试集中是形如右图的皮鞋。所以,在测试集中如果还用(\mu_pop,σ_pop)会导致测试集经过batchnorm之后并不是 \mu = 0, \sigma^2 = 1 的分布。Remark: 训练集和测试集的分布偏差叫做"covariate shift".C.2) 放在非线性激活函数之前还是之后?虽然在原论文中,BN层是放在激活函数之前的。因为的确,只有放在激活函数之前才能够起到让输入远离"死区"的效果。但是,后来的实验也表示放在激活函数之后能带来更好的结果。Keras的创始人之一François Chollet 如是说:“I haven't gone back to check what they are suggesting in their original paper, but I can guarantee that recent code written by Christian [Szegedy] applies relu before BN. It is still occasionally a topic of debate, though.” — François Chollet (source)所以,这个问题没有定论...C.3 BN层到底为啥有用?C.3.1) Hypothesis 1° — BN 降低了 internal covariance shift (ICS) ❌原论文 中提到,Batch Normalization是用来解决"Internal Covariance Shift"问题的。其主要描述的是训练深度网络的时候经常发生训练困难的问题。对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临 "covariance shift" 的问题 --- 这就是所谓的"Internal Covariance Shift",Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariance shift问题只发生在输入层。原论文的逻辑是这样的:随着网络训练的进行, 每个隐层的参数变化使得后一层的输入发生变化->每批训练数据的分布也随之改变->致使网络在每次迭代中都需要拟合不同的数据分布->增大训练的复杂度以及过拟合的风险。C.3.2) Hypothesis 2° — BN降低了每层网络之间的依赖网络层 a 的梯度为:更新了网络层 a 的参数之后,就会影响后面 b,c,d,e 的输入,这是SGD这样的优化器想不到的,因为优化器只能考虑网络层之间的一阶关系,不能考虑整个网络层序列!BN层则像一个"阀门"一样控制着水流,每次都标准化、但是还保留了 \gamma, \beta 来做一些变换。C.3.3) Hypothesis 3° — BN makes the optimization landscape smoother2019年MIT的一项研究 质疑了一直以来"Internal Covariance Shift"的说法。他们训练在CIFAR-10上训练了三个 VGG 网络,第一个没有任何BN层;第二个有 BN 层;第三个与第二个类似,不同之处在于他们在激活函数之前在中明确添加了一些噪声(随机偏差和方差)。结果如下:可以看到,正如预期的那样,第三个网络具有非常高的 ICS。然而,这个"嘈杂"的网络仍然比不含BN层的网络训练得更快,其达到的性能与使用标准 BN 层相当。这个结果表明 BN 的有效性与 ICS 无关。Ooops!这项研究认为,BN效果好是因为BN的存在会引入mini-batch内其他样本的信息,就会导致预测一个独立样本时,其他样本信息相当于正则项,使得loss曲面变得更加平滑,更容易找到最优解。相当于一次独立样本预测可以看多个样本,学到的特征泛化性更强,更加general。BN relies on batch first and second statistical moments (mean and variance) to normalize hidden layers activations. The output values are then strongly tied to the current batch statistics. Such transformation adds some noise, depending on the input examples used in the current batch. Adding some noise to avoid overfitting … sounds like a regularization process, doesn't it ? :)编辑于 2021-12-09 11:19机器学习人工智能机器学习算法​赞同 119​​5 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录机器学习基础复习面试时会问到的机器学习基础知识~看这个

深度学习笔记(三):BatchNorm(BN)层_bn(batch norm)-CSDN博客

>

深度学习笔记(三):BatchNorm(BN)层_bn(batch norm)-CSDN博客

深度学习笔记(三):BatchNorm(BN)层

最新推荐文章于 2023-03-25 21:36:20 发布

AI 菌

最新推荐文章于 2023-03-25 21:36:20 发布

阅读量2.1w

收藏

203

点赞数

52

分类专栏:

深度学习->基础理论

文章标签:

BN层

BatchNorm

标准化

深度学习

卷积神经网络

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/wjinjie/article/details/105028870

版权

深度学习->基础理论

专栏收录该内容

15 篇文章

215 订阅

订阅专栏

文章目录

一、背景二、提出三、原理四、计算五、Scale and Shift六、BN层实现

学习记录:

  深度学习笔记(一):卷积层+激活函数+池化层+全连接层   深度学习笔记(二):激活函数总结   深度学习笔记(三):BatchNorm(BN)层   深度学习笔记(四):梯度下降法与局部最优解   深度学习笔记(五):欠拟合、过拟合

   防止过拟合(一):正则化    防止过拟合(二):Dropout    防止过拟合(三):数据增强

一、背景

  卷积神经网络的出现,网络参数量大大减低,使得几十层的深层网络成为可能。然而,在残差网络出现之前,网络的加深使得网络训练变得非常不稳定,甚至出现网络长时间不更新或者不收敛的情形,同时网络对超参数比较敏感,超参数的微量扰动也会导致网络的训练轨迹完全改变。

二、提出

  2015 年,Google 研究人员Sergey Ioffe等提出了一种参数标准化(Normalize)的手段,并基于参数标准化设计了 Batch Nomalization(简称 BatchNorm或 BN)层 。BN层提出后: (1)使得网络的超参数的设定更加自由,比如更大的学习率,更随意的网络初始化等,同时网络的收敛速度更快,性能也更好。 (2)广泛地应用在各种深度网络模型上,卷积层、BN 层,ReLU 层、池化层一度成为网络模型的标配单元,通过堆叠 Conv-BN-ReLU-Pooling 方式往往可以获得不错的模型性能。

三、原理

  网络层的输入x分布相近,并且分布在较小范围内时(如 0 附近),更有利于函数的迭代优化。那么如何保证输入x的分布相近呢? 数据标准化可以实现此目的,通过数据标准化操作可以将数据x映射

x

^

\widehat{x}

x

:   其中

μ

r

\mu_r

μr​、

δ

r

2

\delta_r^2

δr2​来自统计的所有数据x的均值和方差,

ϵ

\epsilon

ϵ是为防止出现除 0的错误而设置的较小数,比如

ϵ

=

1

e

8

\epsilon=1e-8

ϵ=1e−8。   很容易很看出来:上面的公式表示的是正太分布。也就是说,通过上面的公式计算,可以将原本随机分布的输入数据x,转化成按正太分布分布的数据

x

^

\widehat{x}

x

,从而使得输入网络的数据分布较近,有利于网络的迭代优化。

四、计算

  要使得原本的输入x映射到正太分布的

x

^

\widehat{x}

x

,就需要分别计算出

μ

r

\mu_r

μr​和

δ

r

2

\delta_r^2

δr2​的值,然后带入下面公式,完成转换。 (1)训练阶段   通过统计可以得到Batch组数据的均值

μ

B

\mu_B

μB​和方差

δ

B

2

\delta_B^2

δB2​,计算公式如下:   其中,m为Batch样本数。在实际应用过程中,

μ

B

\mu_B

μB​、

δ

B

2

\delta_B^2

δB2​近似于

μ

r

\mu_r

μr​和

δ

r

2

\delta_r^2

δr2​。计算时,可直接用

μ

B

\mu_B

μB​、

δ

B

2

\delta_B^2

δB2​代替。   因此,在训练阶段,通过下面公式标准化输入: (2)测试阶段   在测试阶段,

μ

B

\mu_B

μB​、

δ

B

2

\delta_B^2

δB2​计算原理和训练阶段相同。需要注意的是,这里的

x

i

x_i

xi​是测试集的数据,m是测试集一次输入的batch数。   因此,在测试阶段,通过下面公式标准化输入: 注意:测试阶段也进行标准化,并不是为了去优化训练,只是为了和训练解阶段保持一致,这样得到的测试结果才有意义。

五、Scale and Shift

  上述的标准化运算并没有引入额外的待优化变量,

μ

B

\mu_B

μB​、

δ

B

2

\delta_B^2

δB2​ 均由统计得到,不需要参与梯度更新。实际上,为了提高 BN 层的表达能力,BN 层作者引入了“scale and shift”技巧,将

x

^

\widehat{x}

x

变量再次映射变换:   其中

γ

\gamma

γ参数实现对标准化后的

x

^

\widehat{x}

x

再次进行缩放,

β

\beta

β参数实现对标准化的

x

^

\widehat{x}

x

进行平移。不同的是,

γ

\gamma

γ、

β

\beta

β参数均由反向传播算法自动优化,实现网络层“按需”缩放平移数据的分布的目的。 于是,在测试阶段,标准化公式与缩放平移结合变为:

六、BN层实现

  在 TensorFlow 中,通过 layers.BatchNormalization()类可以非常方便地实现 BN 层:

# 插入BN层

layers.BatchNormalization()

优惠劵

AI 菌

关注

关注

52

点赞

203

收藏

觉得还不错?

一键收藏

打赏

知道了

22

评论

深度学习笔记(三):BatchNorm(BN)层

文章目录一、背景二、提出三、原理四、计算五、Scale and Shift六、BN层实现一、背景卷积神经网络的出现,网络参数量大大减低,使得几十层的深层网络成为可能。然而,在残差网络出现之前,网络的加深使得网络训练变得非常不稳定,甚至出现网络长时间不更新或者不收敛的情形,同时网络对超参数比较敏感,超参数的微量扰动也会导致网络的训练轨迹完全改变。二、提出2015 年,Google 研究人员S...

复制链接

扫一扫

专栏目录

BN(Batch Normalization 批量归一化)

laozaoxiaowanzi的博客

07-31

2744

BN(Batch Normalization 批量归一化)

BN(批量归一化)算法在DL中出现的频率很高,因为对于提升模型收敛速度来说具有非常好的效果。

本文将通过以下三个点来理解Batch Normalization。

一、什么是BN

我们在训练模型的时候希望训练集训练出来的模型在通过测试集时能够拥有和训练时一样的效果,为此,有这样一个假设,即训练集数据和测试集数据是满足相同分布的,这个叫做IID(独立同分布假设),就是随机变量相互独立互不影响且具有相同的分布形状和相同的分布参数,也就是训练...

C语言高级笔记:深度学习与实践

最新发布

01-14

《C语言学习笔记》是一套专为C语言学习者打造的综合性学习资料,涵盖了从基础概念到高级应用的各种知识点。这套资料以深入浅出的方式,帮助学习者逐步掌握C语言的语法、数据类型、控制结构、函数和指针等核心内容。

这套资料适用于所有希望系统学习C语言的读者,无论您是初学者还是希望巩固提高已有技能的资深程序员。无论您是在校学生,还是自学爱好者,或者是专业开发人员,这套资料都能满足您对C语言学习的需求。

在学习C语言的过程中,理解和实践同样重要。这套资料通过丰富的示例和练习,帮助读者深入理解C语言的核心概念,同时培养实际编程能力。无论您是在课堂上使用这套资料作为教材,还是在家中自学,都能得到有效的学习支持。

此外,这套资料还特别注重实战应用。除了理论知识外,还提供了大量实际项目和案例分析,帮助读者将所学知识应用于实际开发中。通过这些实战项目,读者不仅能够加深对C语言的理解,还能培养解决实际问题的能力。

22 条评论

您还未登录,请先

登录

后发表或查看评论

CAN总线学习笔记三:验收滤波

08-14

总线上数据帧的ID通过待接收节点的验收滤波后是吻合的,是可以被接收的。

超参数调试与BN(Batch Norm)

行云

04-22

1053

1. 深度学习中的超参数

深度学习最难之一的问题,也是被许多人不喜的愿意就是超参数,深度学习中有许多超参数,例如常见的学习率、隐藏层的数量、优化算法中的超参数等等。这些超参数往往没有一个固定的比较好的值,在不同的领域、不同的场景、甚至是硬件条件不变,最适合的超参数也在变化,因此,想要掌握深度学习,超参数是不得不面对的一件事。

那么超参数那么多,到底怎样选取合适的值呢?

我们首先根据大多数人的...

神经网络学习小记录56——Batch Normalization层的原理与作用

Bubbliiiing的学习小课堂

03-19

1万+

神经网络学习小记录57——Batch Normalization层的原理与作用学习前言什么是Batch NormalizationBatch Normalization的计算公式Bn层的好处为什么要引入γ和β变量Bn层的代码实现

学习前言

Batch Normalization是神经网络中常用的层,解决了很多深度学习中遇到的问题,我们一起来学习一哈。

什么是Batch Normalization

Batch Normalization是由google提出的一种训练优化方法。参考论文:Batch Norma

​超细节的BatchNorm/BN/LayerNorm/LN/SyncLN/ShuffleBN/RMSNorm知识点

taoqick的专栏

05-21

1377

Norm,也即 Normalization,已经是深度神经网络模型中非常常规的操作了,但它背后的实现,原理和作用等,其实我们可以理解的更细致,本文会以最常用的 BatchNorm 和 LayerNorm 为例(其他 Norm 方法大同小异),通过 Q&A 的形式,去深入理解关于 Norm 的细节知识点。

BN 在训练和测试时的差异

BN 中的移动平均 Moving Average 是怎么做的?

移动平均中 Momentum 参数的影响

Norm 中的标准化、平移

ResNet网络结构,BN以及迁移学习详解

pyscl01的博客

10-30

2503

ResNet残差结构详解,以及Batch Normalization和迁移学习的详解

no.6 ResNet网络结构 BN层以及迁移学习详解

weixin_44581312的博客

03-25

494

(Layer2的生成就有讲究了),由于第一层maxpooling帮第一层提前缩小了size,而layer2没有这么好的资源,他需要自己做这件事,首先在medel中就写了:self.layer2 = self._make_layer(block, 128, blocks_num[1], stride=2),定义了stride=2,进入make layer函数之后,满足stride!获得coco数据集中目标检测,图像分割的第一名。但是残差网络很好的解决了这一问题,如下图,随着网络的加深,反而我们的错误率越低。

ResNet(残差网络模型)原理解读-包括residual block与BN原理介绍

panghuzhenbang的博客

04-28

1万+

《Deep Residual Learning for Image Recognition》

《Identity Mappings in Deep Residual Networks》

ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比VGGNet低,效果非常突出。ResNet的结构可以极快的加.

一文弄懂CNN中的BatchNorm

sgzqc的专栏

11-20

908

BatchNorm是2015年提出的网络层,这个层具有以下特性:易于训练:由于网络权重的分布随这一层的变化小得多,因此我们可以使用更高的学习率。我们在训练中收敛的方向没有那么不稳定,这样我们就可以更快地朝着loss收敛的方向前进。提升正则化:尽管网络在每个epoch都会遇到相同的训练样本,但每个小批量的归一化是不同的,因此每次都会稍微改变其值。提升精度:可能是由于前面两点的结合,论文提到他们获得了比当时最先进的结果更好的准确性。

ansible学习笔记三:roles

01-07

ansible学习笔记三:roles环境:测试roles测试1,基本使用:1.1 结构1.2 role内各文件内容1.3 模板文件改动1.4 执行剧本1.5 检查测试2:2.1 结构2.2 各文件内容2.3 执行2.4 检查3. 多个角色一起使用的话:指定只运行...

MXNet设计笔记之:深度学习的编程模式比较

02-26

摘要:不同的深度学习库风格各异。...笔记的思想不局限于MXNet,也不局限于深度学习,无论对深度学习初学入门还是对高阶提升,都具有很好的参考价值。本文是第一篇设计笔记的译文,深入讨论了不同深度学习库

百面深度学习-读书笔记:视频处理

04-16

百面深度学习-读书笔记:视频处理

深度学习笔记(一):卷积层+池化层+激活函数+全连接层

热门推荐

不积跬步,无以至千里!

03-22

3万+

本博客会持续更新,后面会加入各个部分的代码实现。

前沿

在图像分类以及目标定位等任务中,卷积神经网络已经得到了充分地运用。而对于常见的卷积神经网络,我们经常可以看到卷积层、池化层、激活函数、全连接层的身影。直到现在,卷积层+池化层+激活函数+全连接层的结构仍然很实用,似乎已经成为搭建卷积神经网络的基本结构。下面我将从这四个方面分别介绍。

注:通常,池化层和激活函数又归类于卷积层。这里为了讲解方便,...

防止过拟合(三):数据增强(增加训练样本)

不积跬步,无以至千里!

03-14

1万+

数据增强(Date Augmentation)

增加数据集大小是解决过拟合最重要的途径。但是收集样本数据和标注往往是代价昂贵的,在有限的数据集上,通过数据增强技术可以增加训练的样本数量,获得一定程度上的性能提升。

**数据增强(Data Augmentation)**是指在维持样本标签不变的条件下,根据先验知识改变样本的特征,使得新产生的样本也符合或者近似符合数据的真实分布。

常见的数据增强方式:...

深度学习笔记(二):激活函数的前世今生

不积跬步,无以至千里!

03-08

1万+

目录一、激活函数的前世今生二、不得不知的激活函数1. Sigmoid2. Tanh3. ReLU4. Leaky ReLU5. Softmax

一、激活函数的前世今生

早在1958 年,美国心理学家 Frank Rosenblatt 就提出了第一个可以自动学习权重的神经元模型,称为感知机。它的模型如下:

从图中可以看出,他使用的是一个简单的一层网络,其中激活函数是阶跃函数(这也是最早使用的激活函...

深度学习笔记(四):梯度下降法与局部最优解

不积跬步,无以至千里!

03-09

1万+

在深度学习过程中,避免不了使用梯度下降算法。但是对于“非凸问题”,训练得到的结果往往可能陷入局部极小值,而非全局最优解。那么这里就以Himmelblau 函数为例位例,探究待优化参数的初始值对梯度下降方向的影响,从而得到不同的局部极小值。

首先介绍一下Himmelblau 函数:

下图 为 Himmelblau 函数的等高线,大致可以看出,它共有 4 个局部极小值点,并且局

部极小值都是 0,所...

从LeNet-5到GoogLeNet,聊聊深度学习的前世今生!

不积跬步,无以至千里!

10-24

9835

从入门到放弃,从小白到大佬,CVer都是这么过来的!

QT学习笔记7:C++函数默认参数

06-09

好的,我知道了。您的第一个问题是关于C++函数的默认参数的。是的,C++函数可以定义默认参数,这意味着在调用函数时,如果没有提供该参数的值,则会使用预定义的值。例如,以下示例中的函数add()具有两个参数x和y,其中y具有默认值5:

```

int add(int x, int y = 5) {

return x + y;

}

```

如果在调用add()函数时只提供了一个参数,则默认情况下使用5作为第二个参数的值:

```

int result1 = add(2); // result1 的值为 7

int result2 = add(2, 3); // result2 的值为 5

```

在第一个示例中,add()函数将使用默认值5,因此结果将为7。在第二个示例中,提供了两个参数,因此将使用提供的值来计算结果。

希望这个回答对您有所帮助!

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

AI 菌

CSDN认证博客专家

CSDN认证企业博客

码龄7年

人工智能领域优质创作者

311

原创

521

周排名

2634

总排名

190万+

访问

等级

2万+

积分

7万+

粉丝

8234

获赞

3556

评论

3万+

收藏

私信

关注

热门文章

YOLO系列算法精讲:从yolov1至yolov8的进阶之路(2万字超全整理)

207992

NVIDIA驱动失效简单解决方案:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.

102080

2021年4月蓝桥杯软件类省赛:题目+解析(完整版)

82724

面试官:指针都不会,我们不需要你这样的人!

66368

ModuleNotFoundError: No module named ‘mmcv._ext‘解决方案

58200

分类专栏

CV实战项目:图像分类+目标检测+语义分割

付费

22篇

TensorFlow2入门指南

付费

21篇

C++21天养成计划

付费

21篇

YOLO-Darknet 目标检测最强实战

付费

8篇

大模型研读

3篇

Essentia音频处理开发指南

1篇

NLP

2篇

工具类集锦

4篇

人生苦短,我学Python

17篇

OpenCV4机器学习

8篇

深度学习->目标检测

13篇

深度学习->基础理论

15篇

语音处理

8篇

深度学习论文导航

37篇

3D目标检测

6篇

MATLAB深度学习

2篇

深度学习->语义分割

4篇

深度学习->激光雷达点云处理

4篇

算法与数据结构

20篇

OpenCV与图像处理

4篇

无人驾驶技术

19篇

每日一题

29篇

蓝桥杯题库练习

16篇

环境配置与搭建

31篇

git

4篇

C++编程

17篇

视觉SLAM

2篇

立体视觉

4篇

PyTorch

1篇

最新评论

深度学习论文导航 | 01 R-CNN:用于精确目标检测和语义分割的丰富特征层次

qq_42747628:

有没有python的代码啊

NVIDIA驱动失效简单解决方案:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.

Adaem:

Error! Your kernel headers for kernel 5.17.0-051700-generic cannot be found.

Please install the linux-headers-5.17.0-051700-generic package,

or use the --kernelsourcedir option to tell DKMS where it's located这个报错怎么办

YOLO系列算法精讲:从yolov1至yolov8的进阶之路(2万字超全整理)

kylesteve666:

大佬强强强

NVIDIA驱动失效简单解决方案:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.

悠悠青青:

$ ls /usr/src | grep nvidia

nvidia-340-340.108

nvidia-535.113.0

这一步有两个型号怎么办

Jetson AGX Xavier 刷机指南

l_You_K:

刷完没画面了

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

最强文生图跨模态大模型:Stable Diffusion

SMOTE 过采样,解决正负样本不均衡问题

【扩散模型之LDM】Latent Diffusion Models 论文解读

2023年22篇

2022年35篇

2021年116篇

2020年141篇

目录

目录

分类专栏

CV实战项目:图像分类+目标检测+语义分割

付费

22篇

TensorFlow2入门指南

付费

21篇

C++21天养成计划

付费

21篇

YOLO-Darknet 目标检测最强实战

付费

8篇

大模型研读

3篇

Essentia音频处理开发指南

1篇

NLP

2篇

工具类集锦

4篇

人生苦短,我学Python

17篇

OpenCV4机器学习

8篇

深度学习->目标检测

13篇

深度学习->基础理论

15篇

语音处理

8篇

深度学习论文导航

37篇

3D目标检测

6篇

MATLAB深度学习

2篇

深度学习->语义分割

4篇

深度学习->激光雷达点云处理

4篇

算法与数据结构

20篇

OpenCV与图像处理

4篇

无人驾驶技术

19篇

每日一题

29篇

蓝桥杯题库练习

16篇

环境配置与搭建

31篇

git

4篇

C++编程

17篇

视觉SLAM

2篇

立体视觉

4篇

PyTorch

1篇

目录

评论 22

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

打赏作者

AI 菌

你的鼓励将是我创作的最大动力

¥1

¥2

¥4

¥6

¥10

¥20

扫码支付:¥1

获取中

扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

【深度学习】深入理解Batch Normalization批标准化 - 郭耀华 - 博客园

【深度学习】深入理解Batch Normalization批标准化 - 郭耀华 - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

郭耀华's Blog

欲穷千里目,更上一层楼

项目主页:https://github.com/guoyaohua/

博客园

首页

新随笔

联系

订阅

管理

【深度学习】深入理解Batch Normalization批标准化

这几天面试经常被问到BN层的原理,虽然回答上来了,但还是感觉答得不是很好,今天仔细研究了一下Batch Normalization的原理,以下为参考网上几篇文章总结得出。

  Batch Normalization作为最近一年来DL的重要成果,已经广泛被证明其有效性和重要性。虽然有些细节处理还解释不清其理论原因,但是实践证明好用才是真的好,别忘了DL从Hinton对深层网络做Pre-Train开始就是一个经验领先于理论分析的偏经验的一门学问。本文是对论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》的导读。

  机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。

  接下来一步一步的理解什么是BN。

  为什么深度神经网络随着网络深度加深,训练起来越困难,收敛越来越慢?这是个在DL领域很接近本质的好问题。很多论文都是解决这个问题的,比如ReLU激活函数,再比如Residual Network,BN本质上也是解释并从某个不同的角度来解决这个问题的。

一、“Internal Covariate Shift”问题

  从论文名字可以看出,BN是用来解决“Internal Covariate Shift”问题的,那么首先得理解什么是“Internal Covariate Shift”?

  论文首先说明Mini-Batch SGD相对于One Example SGD的两个优势:梯度更新方向更准确;并行计算速度快;(为什么要说这些?因为BatchNorm是基于Mini-Batch SGD的,所以先夸下Mini-Batch SGD,当然也是大实话);然后吐槽下SGD训练的缺点:超参数调起来很麻烦。(作者隐含意思是用BN就能解决很多SGD的缺点)

  接着引入covariate shift的概念:如果ML系统实例集合中的输入值X的分布老是变,这不符合IID假设,网络模型很难稳定的学规律,这不得引入迁移学习才能搞定吗,我们的ML系统还得去学习怎么迎合这种分布变化啊。对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层。

  然后提出了BatchNorm的基本思想:能不能让每个隐层节点的激活输入分布固定下来呢?这样就避免了“Internal Covariate Shift”问题了。

  BN不是凭空拍脑袋拍出来的好点子,它是有启发来源的:之前的研究表明如果在图像处理中对输入图像进行白化(Whiten)操作的话——所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布——那么神经网络会较快收敛,那么BN作者就开始推论了:图像是深度神经网络的输入层,做白化能加快收敛,那么其实对于深度网络来说,其中某个隐层的神经元是下一层的输入,意思是其实深度神经网络的每一个隐层都是输入层,不过是相对下一层来说而已,那么能不能对每个隐层都做白化呢?这就是启发BN产生的原初想法,而BN也确实就是这么做的,可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作。

二、BatchNorm的本质思想

  BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

  THAT’S IT。其实一句话就是:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。因为梯度一直都能保持比较大的状态,所以很明显对神经网络的参数调整效率比较高,就是变动大,就是说向损失函数最优值迈动的步子大,也就是说收敛地快。BN说到底就是这么个机制,方法很简单,道理很深刻。

  上面说得还是显得抽象,下面更形象地表达下这种调整到底代表什么含义。

  图1  几个正态分布

  假设某个隐层神经元原先的激活输入x取值符合正态分布,正态分布均值是-2,方差是0.5,对应上图中最左端的浅蓝色曲线,通过BN后转换为均值为0,方差是1的正态分布(对应上图中的深蓝色图形),意味着什么,意味着输入x的取值正态分布整体右移2(均值的变化),图形曲线更平缓了(方差增大的变化)。这个图的意思是,BN其实就是把每个隐层神经元的激活输入分布从偏离均值为0方差为1的正态分布通过平移均值压缩或者扩大曲线尖锐程度,调整为均值为0方差为1的正态分布。

  那么把激活输入x调整到这个正态分布有什么用?首先我们看下均值为0,方差为1的标准正态分布代表什么含义:

 

图2  均值为0方差为1的标准正态分布图

 

  这意味着在一个标准差范围内,也就是说64%的概率x其值落在[-1,1]的范围内,在两个标准差范围内,也就是说95%的概率x其值落在了[-2,2]的范围内。那么这又意味着什么?我们知道,激活值x=WU+B,U是真正的输入,x是某个神经元的激活值,假设非线性函数是sigmoid,那么看下sigmoid(x)其图形:

图3. Sigmoid(x)

及sigmoid(x)的导数为:G’=f(x)*(1-f(x)),因为f(x)=sigmoid(x)在0到1之间,所以G’在0到0.25之间,其对应的图如下:

图4  Sigmoid(x)导数图

  假设没有经过BN调整前x的原先正态分布均值是-6,方差是1,那么意味着95%的值落在了[-8,-4]之间,那么对应的Sigmoid(x)函数的值明显接近于0,这是典型的梯度饱和区,在这个区域里梯度变化很慢,为什么是梯度饱和区?请看下sigmoid(x)如果取值接近0或者接近于1的时候对应导数函数取值,接近于0,意味着梯度变化很小甚至消失。而假设经过BN后,均值是0,方差是1,那么意味着95%的x值落在了[-2,2]区间内,很明显这一段是sigmoid(x)函数接近于线性变换的区域,意味着x的小变化会导致非线性函数值较大的变化,也即是梯度变化较大,对应导数函数图中明显大于0的区域,就是梯度非饱和区。

  从上面几个图应该看出来BN在干什么了吧?其实就是把隐层神经元激活输入x=WU+B从变化不拘一格的正态分布通过BN操作拉回到了均值为0,方差为1的正态分布,即原始正态分布中心左移或者右移到以0为均值,拉伸或者缩减形态形成以1为方差的图形。什么意思?就是说经过BN后,目前大部分Activation的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。

  但是很明显,看到这里,稍微了解神经网络的读者一般会提出一个疑问:如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了?这意味着什么?我们知道,如果是多层的线性函数变换其实这个深层是没有意义的,因为多层线性网络跟一层线性网络是等价的。这意味着网络的表达能力下降了,这也意味着深度的意义就没有了。所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。当然,这是我的理解,论文作者并未明确这样说。但是很明显这里的scale和shift操作是会有争议的,因为按照论文作者论文里写的理想状态,就会又通过scale和shift操作把变换后的x调整回未变换的状态,那不是饶了一圈又绕回去原始的“Internal Covariate Shift”问题里去了吗,感觉论文作者并未能够清楚地解释scale和shift操作的理论原因。

三、训练阶段如何做BatchNorm

  上面是对BN的抽象分析和解释,具体在Mini-Batch SGD下做BN怎么做?其实论文里面这块写得很清楚也容易理解。为了保证这篇文章完整性,这里简单说明下。

  假设对于一个深层神经网络来说,其中两层结构如下:

  图5  DNN其中两层

  要对每个隐层神经元的激活值做BN,可以想象成每个隐层又加上了一层BN操作层,它位于X=WU+B激活值获得之后,非线性函数变换之前,其图示如下:

  图6. BN操作

  对于Mini-Batch SGD来说,一次训练过程里面包含m个训练实例,其具体BN操作就是对于隐层内每个神经元的激活值来说,进行如下变换:

  要注意,这里t层某个神经元的x(k)不是指原始输入,就是说不是t-1层每个神经元的输出,而是t层这个神经元的线性激活x=WU+B,这里的U才是t-1层神经元的输出。变换的意思是:某个神经元对应的原始的激活x通过减去mini-Batch内m个实例获得的m个激活x求得的均值E(x)并除以求得的方差Var(x)来进行转换。

  上文说过经过这个变换后某个神经元的激活x形成了均值为0,方差为1的正态分布,目的是把值往后续要进行的非线性变换的线性区拉动,增大导数值,增强反向传播信息流动性,加快训练收敛速度。但是这样会导致网络表达能力下降,为了防止这一点,每个神经元增加两个调节参数(scale和shift),这两个参数是通过训练来学习到的,用来对变换后的激活反变换,使得网络表达能力增强,即对变换后的激活进行如下的scale和shift操作,这其实是变换的反操作:

  BN其具体操作流程,如论文中描述的一样:

 

  过程非常清楚,就是上述公式的流程化描述,这里不解释了,直接应该能看懂。

四、BatchNorm的推理(Inference)过程

  BN在训练的时候可以根据Mini-Batch里的若干训练实例进行激活数值调整,但是在推理(inference)的过程中,很明显输入就只有一个实例,看不到Mini-Batch其它实例,那么这时候怎么对输入做BN呢?因为很明显一个实例是没法算实例集合求出的均值和方差的。这可如何是好?

  既然没有从Mini-Batch数据里可以得到的统计量,那就想其它办法来获得这个统计量,就是均值和方差。可以用从所有训练实例中获得的统计量来代替Mini-Batch里面m个训练实例获得的均值和方差统计量,因为本来就打算用全局的统计量,只是因为计算量等太大所以才会用Mini-Batch这种简化方式的,那么在推理的时候直接用全局统计量即可。

  决定了获得统计量的数据范围,那么接下来的问题是如何获得均值和方差的问题。很简单,因为每次做Mini-Batch训练时,都会有那个Mini-Batch里m个训练实例获得的均值和方差,现在要全局统计量,只要把每个Mini-Batch的均值和方差统计量记住,然后对这些均值和方差求其对应的数学期望即可得出全局统计量,即:

  有了均值和方差,每个隐层神经元也已经有对应训练好的Scaling参数和Shift参数,就可以在推导的时候对每个神经元的激活数据计算NB进行变换了,在推理过程中进行BN采取如下方式:

  这个公式其实和训练时

  是等价的,通过简单的合并计算推导就可以得出这个结论。那么为啥要写成这个变换形式呢?我猜作者这么写的意思是:在实际运行的时候,按照这种变体形式可以减少计算量,为啥呢?因为对于每个隐层节点来说:

          

  都是固定值,这样这两个值可以事先算好存起来,在推理的时候直接用就行了,这样比原始的公式每一步骤都现算少了除法的运算过程,乍一看也没少多少计算量,但是如果隐层节点个数多的话节省的计算量就比较多了。

五、BatchNorm的好处

  BatchNorm为什么NB呢,关键还是效果好。①不仅仅极大提升了训练速度,收敛过程大大加快;②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。总而言之,经过这么简单的变换,带来的好处多得很,这也是为何现在BN这么快流行起来的原因。

 

作者:郭耀华

出处:http://www.guoyaohua.com

微信:guoyaohua167

邮箱:guo.yaohua@foxmail.com

本文版权归作者和博客园所有,欢迎转载,转载请标明出处。

【如果你觉得本文还不错,对你的学习带来了些许帮助,请帮忙点击右下角的推荐】

posted @

2018-04-05 21:50 

郭耀华 

阅读(287621) 

评论(22) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

公告

Copyright © 2024 郭耀华

Powered by .NET 8.0 on Kubernetes

Batchnorm原理详解-腾讯云开发者社区-腾讯云

hnorm原理详解-腾讯云开发者社区-腾讯云机器学习算法工程师Batchnorm原理详解关注作者腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动文章/答案/技术大牛搜索搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网机器学习算法工程师首页学习活动专区工具TVP最新优惠活动返回腾讯云官网社区首页 >专栏 >Batchnorm原理详解Batchnorm原理详解机器学习算法工程师关注发布于 2018-03-06 17:53:023.8K0发布于 2018-03-06 17:53:02举报文章被收录于专栏:机器学习算法工程师机器学习算法工程师作者:刘威威小编:赵一帆

前言:Batchnorm是深度网络中经常用到的加速神经网络训练,加速收敛速度及稳定性的算法,可以说是目前深度网络必不可少的一部分。

本文旨在用通俗易懂的语言,对深度学习的常用算法--batchnorm的原理及其代码实现做一个详细的解读。本文主要包括以下几个部分。01Batchnorm主要解决的问题首先,此部分也即是讲为什么深度网络会需要batchnorm,我们都知道,深度学习的话尤其是在CV上都需要对数据做归一化,因为深度神经网络主要就是为了学习训练数据的分布,并在测试集上达到很好的泛化效果,但是,如果我们每一个batch输入的数据都具有不同的分布,显然会给网络的训练带来困难。另一方面,数据经过一层层网络计算后,其数据分布也在发生着变化,此现象称为Internal Covariate Shift,接下来会详细解释,会给下一层的网络学习带来困难。直译过来就是批规范化,就是为了解决这个分布变化问题。Internal Covariate Shift1.1Internal Covariate Shift:此术语是google小组在论文Batch Normailzatoin中提出来的,其主要描述的是:训练深度网络的时候经常发生训练困难的问题,因为,每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难(神经网络本来就是要学习数据的分布,要是分布一直在变,学习就很难了),此现象称之为Internal Covariate Shift。Batch Normailzatoin之前的解决方案就是使用较小的学习率,和小心的初始化参数,对数据做白化处理,但是显然治标不治本。covariate shift1.2Internal Covariate Shift和Covariate Shift具有相似性,但并不是一个东西,前者发生在神经网络的内部,所以是Internal,后者发生在输入数据上。Covariate Shift主要描述的是由于训练数据和测试数据存在分布的差异性,给网络的泛化性和训练速度带来了影响,我们经常使用的方法是做归一化或者白化。想要直观感受的话,看下图:举个简单线性分类栗子,假设我们的数据分布如a所示,参数初始化一般是0均值,和较小的方差,此时y=wx+b拟合的如b图中的橘色线,经过多次迭代后,达到紫色线,此时具有很好的分类效果,但是如果我们将其归一化到0点附近,显然会加快训练速度,如此我们更进一步的通过变换拉大数据之间的相对差异性,那么就更容易区分了。Covariate Shift就是描述的输入数据分布不一致的现象,对数据做归一化当然可以加快训练速度,能对数据做去相关性,突出它们之间的分布相对差异就更好了。Batchnorm做到了,前文已说过,Batchnorm是归一化的一种手段,极限来说,这种方式会减小图像之间的绝对差异,突出相对差异,加快训练速度。所以说,并不是在深度学习的所有领域都可以使用,下文会写到其不适用的情况。02Batchnorm 原理解读本部分BatchNorm主要结合原论文部分,排除一些复杂的数学公式,对的原理做尽可能详细的解释。之前就说过,为了减小Internal Covariate Shift,对神经网络的每一层做归一化不就可以了,假设将每一层输出后的数据都归一化到0均值,1方差,满足正太分布,但是,此时有一个问题,每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。

但是如果稍作修改,加入可训练的参数做归一化,那就是BatchNorm实现的了,接下来结合下图的伪代码做详细的分析: 之所以称之为batchnorm是因为所norm的数据是一个batch的,假设输入数据是β=x_(1...m)共m个数据,输出是y_i=BN(x),batchnorm的步骤如下:先求出此次批量数据x的均值

求出此次batch的方差

接下来就是对x做归一化,得到x_i^-

最重要的一步,引入缩放和平移变量γ和β,计算归一化后的值

接下来详细介绍一下这额外的两个参数,之前也说过如果直接做归一化不做其他处理,神经网络是学不到任何东西的,但是加入这两个参数后,事情就不一样了,先考虑特殊情况下,如果γ和β分别等于此batch的方差和均值,那么y_i不就还原到归一化前的x了吗,也即是缩放平移到了归一化前的分布,相当于batchnorm没有起作用,γ和β分别称之为 平移参数和缩放参数 。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。先用一个简单的代码举个小栗子: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.9,0.99, 0.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复制看完这个代码是不是对batchnorm有了一个清晰的理解,首先计算均值和方差,然后归一化,然后缩放和平移,完事!但是这是在训练中完成的任务,每次训练给一个批量,然后计算批量的均值方差,但是在测试的时候可不是这样,测试的时候每次只输入一张图片,这怎么计算批量的均值和方差,于是,就有了代码中下面两行,在训练的时候实现计算好mean var测试的时候直接拿来用就可以了,不用计算均值和方差。running_mean = momentum * running_mean + (1- momentum) * x_mean

running_var = momentum * running_var + (1 -momentum) * x_var复制所以,测试的时候是这样的:def Batchnorm_simple_for_test(x, gamma,beta, bn_param):"""

param:x : 输入数据,设shape(B,L)

param:gama : 缩放因子 γ

param:beta : 平移因子 β

param:bn_param : batchnorm所需要的一些参数

eps : 接近0的数,防止分母出现0

momentum : 动量参数,一般为0.9,0.99, 0.999

running_mean :滑动平均的方式计算新的均值,训练时计算,为测试数据做准备

running_var : 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备

"""

running_mean = bn_param['running_mean'] #shape = [B]

running_var = bn_param['running_var'] #shape = [B]

results = 0. # 建立一个新的变量

x_normalized=(x-running_mean )/np.sqrt(running_var +eps) # 归一化

results = gamma * x_normalized + beta # 缩放平移

return results , bn_param复制你是否理解了呢?如果还没有理解的话,欢迎再多看几遍。03Batchnorm源码解读本节主要讲解一段tensorflow中Batchnorm的可以使用的代码,如下:

代码来自知乎,这里加入注释帮助阅读。def batch_norm_layer(x, train_phase,scope_bn):

with tf.variable_scope(scope_bn):

# 新建两个变量,平移、缩放因子

beta = tf.Variable(tf.constant(0.0, shape=[x.shape[-1]]), name='beta',trainable=True)

gamma = tf.Variable(tf.constant(1.0, shape=[x.shape[-1]]), name='gamma',trainable=True)

# 计算此次批量的均值和方差

axises = np.arange(len(x.shape) - 1)

batch_mean, batch_var = tf.nn.moments(x, axises, name='moments')

# 滑动平均做衰减

ema = tf.train.ExponentialMovingAverage(decay=0.5)

def mean_var_with_update():

ema_apply_op = ema.apply([batch_mean, batch_var])

with tf.control_dependencies([ema_apply_op]):

return tf.identity(batch_mean),tf.identity(batch_var)

# train_phase 训练还是测试的flag

# 训练阶段计算runing_mean和runing_var,使用mean_var_with_update()函数

# 测试的时候直接把之前计算的拿去用 ema.average(batch_mean)

mean, var = tf.cond(train_phase, mean_var_with_update,

lambda:(ema.average(batch_mean), ema.average(batch_var)))

normed = tf.nn.batch_normalization(x, mean, var, beta, gamma, 1e-3)

return normed复制至于此行代码tf.nn.batch_normalization()就是简单的计算batchnorm过程啦,代码如下:

这个函数所实现的功能就如此公式:def batch_normalization(x, mean, variance, offset,scale, variance_epsilon, name=None):

with ops.name_scope(name, "batchnorm", [x, mean, variance,scale, offset]):

inv = math_ops.rsqrt(variance + variance_epsilon)

if scale is not None:

inv *= scale

return x * inv + (offset - mean * inv

if offset is not Noneelse -mean * inv)复制04Batchnorm的优点及缺点主要部分说完了,接下来对BatchNorm做一个总结:没有它之前,需要小心的调整学习率和权重初始化,但是有了BN可以放心的使用大学习率,但是使用了BN,就不用小心的调参了,较大的学习率极大的提高了学习速度,Batchnorm本身上也是一种正则的方式,可以代替其他正则方式如dropout等另外,个人认为,batchnorm降低了数据之间的绝对差异,有一个去相关的性质,更多的考虑相对差异性,因此在分类任务上具有更好的效果注:或许大家都知道了,韩国团队在2017NTIRE图像超分辨率中取得了top1的成绩,主要原因竟是去掉了网络中的batchnorm层,由此可见,BN并不是适用于所有任务的,在image-to-image这样的任务中,尤其是超分辨率上,图像的绝对差异显得尤为重要,所以batchnorm的scale并不适合。本文参与 腾讯云自媒体分享计划,分享自微信公众号。原始发表:2018-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除神经网络编程算法深度学习本文分享自 机器学习算法全栈工程师 微信公众号,前往查看如有侵权,请联系 cloudcommunity@tencent.com 删除。本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!神经网络编程算法深度学习评论登录后参与评论0 条评论热度最新登录 后参与评论推荐阅读LV.关注文章0获赞0领券社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 |  京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档Copyright © 2013 - 2024 Tencent Cloud.All Rights Reserved. 腾讯云 版权所有登录 后参与评论00

Batch Normalization(BN)超详细解析_batchnorm在预测阶段需要计算吗-CSDN博客

>

Batch Normalization(BN)超详细解析_batchnorm在预测阶段需要计算吗-CSDN博客

Batch Normalization(BN)超详细解析

最新推荐文章于 2022-08-19 20:12:53 发布

浩波的笔记

最新推荐文章于 2022-08-19 20:12:53 发布

阅读量3.5w

收藏

441

点赞数

100

分类专栏:

图像

机器/深度学习

python

文章标签:

神经网络

计算机视觉

机器学习

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_44023658/article/details/105844861

版权

机器/深度学习

同时被 3 个专栏收录

56 篇文章

46 订阅

订阅专栏

python

31 篇文章

1 订阅

订阅专栏

图像

27 篇文章

10 订阅

订阅专栏

单层视角

神经网络可以看成是上图形式,对于中间的某一层,其前面的层可以看成是对输入的处理,后面的层可以看成是损失函数。一次反向传播过程会同时更新所有层的权重W1,W2,…,WL,前面层权重的更新会改变当前层输入的分布,而跟据反向传播的计算方式,我们知道,对Wk的更新是在假定其输入不变的情况下进行的。如果假定第k层的输入节点只有2个,对第k层的某个输出节点而言,相当于一个线性模型y=w1x1+w2x2+b,如下图所示, 假定当前输入x1和x2的分布如图中圆点所示,本次更新的方向是将直线H1更新成H2,本以为切分得不错,但是当前面层的权重更新完毕,当前层输入的分布换成了另外一番样子,直线相对输入分布的位置可能变成了H3,下一次更新又要根据新的分布重新调整。直线调整了位置,输入分布又在发生变化,直线再调整位置,就像是直线和分布之间的“追逐游戏”。对于浅层模型,比如SVM,输入特征的分布是固定的,即使拆分成不同的batch,每个batch的统计特性也是相近的,因此只需调整直线位置来适应输入分布,显然要容易得多。而深层模型,每层输入的分布和权重在同时变化,训练相对困难。

多层视角

上面是从网络中单拿出一层分析,下面看一下多层的情况。在反向传播过程中,每层权重的更新是在假定其他权重不变的情况下,向损失函数降低的方向调整自己。问题在于,在一次反向传播过程中,所有的权重会同时更新,导致层间配合“缺乏默契”,每层都在进行上节所说的“追逐游戏”,而且层数越多,相互配合越困难,文中把这个现象称之为 Internal Covariate Shift,示意图如下。为了避免过于震荡,学习率不得不设置得足够小,足够小就意味着学习缓慢。

为此,希望对每层输入的分布有所控制,于是就有了Batch Normalization,其出发点是对每层的输入做Normalization,只有一个数据是谈不上Normalization的,所以是对一个batch的数据进行Normalization。

Batch Normalization原理

Batch Normalization,简称BatchNorm或BN,翻译为“批归一化”,是神经网络中一种特殊的层,如今已是各种流行网络的标配。在原paper中,BN被建议插入在(每个)ReLU激活层前面,如下所示, 如果batch size为m,则在前向传播过程中,网络中每个节点都有m个输出,所谓的Batch Normalization,就是对该层每个节点的这m个输出进行归一化再输出.

我们在图像预处理过程中通常会对图像进行标准化处理,这样能够加速网络的收敛,如下图所示,对于Conv1来说输入的就是满足某一分布的特征矩阵,但对于Conv2而言输入的feature map就不一定满足某一分布规律了**(注意这里所说满足某一分布规律并不是指某一个feature map的数据要满足分布规律,理论上是指整个训练样本集所对应feature map的数据要满足分布规律)**。而我们Batch Normalization的目的就是使我们的feature map满足均值为0,方差为1的分布规律。 下面是从原论文中截取的原话,注意标黄的部分: “对于一个拥有d维的输入x,我们将对它的每一个维度进行标准化处理。” 假设我们输入的x是RGB三通道的彩色图像,那么这里的d就是输入图像的channels即d=3,,其中就代表我们的R通道所对应的特征矩阵,依此类推。标准化处理也就是分别对我们的R通道,G通道,B通道进行处理。上面的公式不用看,原文提供了更加详细的计算公式: 其操作可以分成2步,

Standardization:首先对m个x进行 Standardization,得到 zero mean unit variance的分布x^。scale and shift:然后再对x^进行scale and shift,缩放并平移到新的分布y,具有新的均值β方差γ。

假设BN层有d个输入节点,则x可构成d×m大小的矩阵X,BN层相当于通过行操作将其映射为另一个d×m大小的矩阵Y,如下所示,

将2个过程写在一个公式里如下 其中,x(b)i表示输入当前batch的b-th样本时该层i-th输入节点的值,xi为[x(1)i,x(2)i,…,x(m)i]构成的行向量,长度为batch size m,μ和σ为该行的均值和标准差,ϵ为防止除零引入的极小量(可忽略),γ和β为该行的scale和shift参数,可知

μ和σ为当前行的统计量,不可学习。γ和β为待学习的scale和shift参数,用于控制yi的方差和均值BN层中,xi和xj之间不存在信息交流(i≠j)

可见,无论xi原本的均值和方差是多少,通过BatchNorm后其均值和方差分别变为待学习的β和γ。

Batch Normalization的反向传播

对于目前的神经网络计算框架,一个层要想加入到网络中,要保证其是可微的,即可以求梯度。BatchNorm的梯度该如何求取?

反向传播求梯度只需抓住一个关键点,如果一个变量对另一个变量有影响,那么他们之间就存在偏导数,找到直接相关的变量,再配合链式法则,公式就很容易写出了。 根据反向传播的顺序,首先求取损失ℓ对BN层输出yi的偏导∂ℓ / ∂yi,然后是对可学习参数的偏导∂ℓ / ∂γ和∂ℓ / ∂β,用于对参数进行更新,想继续回传的话还需要求对输入 x偏导,于是引出对变量μ、σ2和x^的偏导,根据链式法则再求这些变量对x的偏导。

Batch Normalization的预测阶段

在预测阶段,所有参数的取值是固定的,对BN层而言,意味着μ、σ、γ、β都是固定值。

γ和β比较好理解,随着训练结束,两者最终收敛,预测阶段使用训练结束时的值即可。

对于μ和σ,在训练阶段,它们为当前mini batch的统计量,随着输入batch的不同,μ和σ一直在变化。在预测阶段,输入数据可能只有1条,该使用哪个μ和σ,或者说,每个BN层的μ和σ该如何取值?可以采用训练收敛最后几批mini batch的 μ和σ的期望,作为预测阶段的μ和σ,如下所示, 因为Standardization和scale and shift均为线性变换,在预测阶段所有参数均固定的情况下,参数可以合并成y=kx+b的形式,如上图中行号11所示。

Batch Normalization的作用

使用Batch Normalization,可以获得如下好处,

可以使用更大的学习率,训练过程更加稳定,极大提高了训练速度。可以将bias置为0,因为Batch Normalization的Standardization过程会移除直流分量,所以不再需要bias。对权重初始化不再敏感,通常权重采样自0均值某方差的高斯分布,以往对高斯分布的方差设置十分重要,有了Batch Normalization后,对与同一个输出节点相连的权重进行放缩,其标准差σ也会放缩同样的倍数,相除抵消。对权重的尺度不再敏感,理由同上,尺度统一由γ参数控制,在训练中决定。深层网络可以使用sigmoid和tanh了,理由同上,BN抑制了梯度消失。Batch Normalization具有某种正则作用,不需要太依赖dropout,减少过拟合。

几个常见问题

卷积层如何使用BatchNorm?

For convolutional layers, we additionally want the normalization to obey the convolutional property – so that different elements of the same feature map, at different locations, are normalized in the same way. To achieve this, we jointly normalize all the activations in a mini-batch, over all locations.

...

so for a mini-batch of size m and feature maps of size p × q, we use the effective mini-batch of size m′

= |B| = m · pq. We learn a pair of parameters γ(k) and β(k) per feature map, rather than per activation.

—— Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

1个卷积核产生1个feature map,1个feature map有1对γ和β参数,同一batch同channel的feature map共享同一对γ和β参数,若卷积层有n个卷积核,则有n对γ和β参数。

没有scale and shift过程可不可以? BatchNorm有两个过程,Standardization和scale and shift,前者是机器学习常用的数据预处理技术,在浅层模型中,只需对数据进行Standardization即可,Batch Normalization可不可以只有Standardization呢?

答案是可以,但网络的表达能力会下降。

直觉上理解,浅层模型中,只需要模型适应数据分布即可。对深度神经网络,每层的输入分布和权重要相互协调,强制把分布限制在zero mean unit variance并不见得是最好的选择,加入参数γ和β,对输入进行scale and shift,有利于分布与权重的相互协调,特别地,令γ=1,β=0等价于只用Standardization,令γ=σ,β=μ等价于没有BN层,scale and shift涵盖了这2种特殊情况,在训练过程中决定什么样的分布是适合的,所以使用scale and shift增强了网络的表达能力。

表达能力更强,在实践中性能就会更好吗?并不见得,就像曾经参数越多不见得性能越好一样。在caffenet-benchmark-batchnorm 中,作者实验发现没有scale and shift性能可能还更好一些。

BN层放在ReLU前面还是后面? 原paper建议将BN层放置在ReLU前,因为ReLU激活函数的输出非负,不能近似为高斯分布。

The goal of Batch Normalization is to achieve a stable distribution of activation values throughout training, and in our experiments we apply it before the nonlinearity since that is where matching the first and second moments is more likely to result in a stable distribution.

—— Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

但是,在caffenet-benchmark-batchnorm中,作者基于caffenet在ImageNet2012上做了如下对比实验, 实验表明,放在前后的差异似乎不大,甚至放在ReLU后还好一些。

放在ReLU后相当于直接对每层的输入进行归一化,如下图所示,这与浅层模型的Standardization是一致的。 caffenet-benchmark-batchnorm中,还有BN层与不同激活函数、不同初始化方法、dropout等排列组合的对比实验,可以看看。

所以,BN究竟应该放在激活的前面还是后面?以及,BN与其他变量,如激活函数、初始化方法、dropout等,如何组合才是最优?可能只有直觉和经验性的指导意见,具体问题的具体答案可能还是得实验说了算(微笑)。

BN层为什么有效? BN层的有效性已有目共睹,但为什么有效可能还需要进一步研究,这里有一些解释,

BN层让损失函数更平滑。论文How Does Batch Normalization Help Optimization中,通过分析训练过程中每步梯度方向上步长变化引起的损失变化范围、梯度幅值的变化范围、光滑度的变化,认为添加BN层后,损失函数的landscape(losssurface)变得更平滑,相比高低不平上下起伏的loss surface,平滑losssurface的梯度预测性更好,可以选取较大的步长。如下图所示, BN更有利于梯度下降。论文An empirical analysis of the optimization of deep network loss surfaces中,绘制了VGG和NIN网络在有无BN层的情况下,loss surface的差异,包含初始点位置以及不同优化算法最终收敛到的local minima位置,如下图所示。没有BN层的,其loss surface存在较大的高原,有BN层的则没有高原,而是山峰,因此更容易下降。 这里再提供一个直觉上的理解,没有BN层的情况下,网络没办法直接控制每层输入的分布,其分布前面层的权重共同决定,或者说分布的均值和方差“隐藏”在前面层的每个权重中,网络若想调整其分布,需要通过复杂的反向传播过程调整前面的每个权重实现,BN层的存在相当于将分布的均值和方差从权重中剥离了出来,只需调整γ和β两个参数就可以直接调整分布,让分布和权重的配合变得更加容易。

这里多说一句,论文How Does Batch Normalization Help Optimization中对比了标准VGG以及加了BN层的VGG每层分布随训练过程的变化,发现两者并无明显差异,认为BatchNorm并没有改善 Internal Covariate Shift。但这里有个问题是,两者的训练都可以收敛,对于不能收敛或者训练过程十分震荡的模型呢,其分布变化是怎样的?大家可以自己实验看看。

参考自: 日拱一卒

优惠劵

浩波的笔记

关注

关注

100

点赞

441

收藏

觉得还不错?

一键收藏

打赏

知道了

5

评论

Batch Normalization(BN)超详细解析

单层视角神经网络可以看成是上图形式,对于中间的某一层,其前面的层可以看成是对输入的处理,后面的层可以看成是损失函数。一次反向传播过程会同时更新所有层的权重W1,W2,…,WL,前面层权重的更新会改变当前层输入的分布,而跟据反向传播的计算方式,我们知道,对Wk的更新是在假定其输入不变的情况下进行的。如果假定第k层的输入节点只有2个,对第k层的某个输出节点而言,相当于一个线性模型y=w1x1+w2x...

复制链接

扫一扫

专栏目录

理解Batch Normalization(批量归一化)

qq_38156104的博客

06-13

1226

https://www.cnblogs.com/shine-lee/p/11989612.html

写的非常详细,转载一下以作学习。

recurrent batch normalization的pytorch实现

01-24

recurrent batch normalization的pytorch实现

5 条评论

您还未登录,请先

登录

后发表或查看评论

干货 | 这可能全网最好的BatchNorm详解

CAICAI134的博客

04-16

740

其实关于BN层,我在之前的文章“梯度爆炸”那一篇中已经涉及到了,但是鉴于面试经历中多次问道这个,这里再做一个更加全面的讲解。

Internal Covariate Shift(ICS)

Batch Normalization的原论文作者给了Internal Covariate Shift一个较规范的定义:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。

这里做一个简单的数学定义,对于全链接网络而言,第i层的数学表达可以

Batch Normalization 超详细解读(训练、测试、优点、缺点)(算法面试几乎必考)

weixin_41888257的博客

07-18

6394

先占坑,后续再填

参考:

cs231n学习笔记-激活函数-BN-参数优化

BN和Dropout在训练和测试时的差别

BatchNorm&&LayerNorm

like_jmo的博客

07-26

215

BatchNorm与LayerNorm区别比较

批归一化(Batch Normalization)详解

AI视觉Daily

02-02

2万+

批归一化(Batch Normalization)详解

文章目录批归一化(Batch Normalization)详解前言一、数据归一化二、BN解决的问题:Internal Covariate Shift三、BN如何做的数据归一化四、BN的本质总结

前言

批归一化简称BN,是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中“梯度弥散(特征分布较散)”的问题,从而使得训练深层网络模型更加容易和稳定。所以目前BN已经成为几

整理学习之Batch Normalization(批标准化)

你好

04-10

1万+

整理学习Batch Normalization

Batch Normalization 批量归一化 【全方位解释】

IanYue的博客

08-19

6212

批量归一化(Batch Normalization),由Google于2015年提出,是近年来深度学习(DL)领域最重要的进步之一。该方法依靠两次连续的线性变换,希望转化后的数值满足一定的特性(分布),不仅可以加快了模型的收敛速度,也一定程度缓解了特征分布较散的问题,使深度神经网络(DNN)训练更快、更稳定。

Batch Normalization详解

郡酱的博客~

02-01

3489

Batch Normalization 原理

1. Batch Normalization的提处背景

1.1 常见的帮助收敛的方法

在深度学习中,随着网络层数的加深,模型的收敛难度会越来越大。为了让模型更好的收敛,涌现出了各种各样的调参方法:

基于随机梯度下降的各种优化算法,即各种优化器

SGD、Adgrad、Adadelta、Adam…

参数初始化方法

全零初始化、随机初始化、Xavier初始化、He初始化、预训练模型

1.2 收敛困难的原因

为什么随着网络层数的增加,网络会越来越难收敛呢

batch normalization 和 layer normalization 在RNN(LSTM、GRU)上的TensorFlow实现

04-19

batch normalization 和 layer normalization 在RNN(LSTM、GRU)上的TensorFlow实现;运行无误,示例为mnist手写体识别

Batch Normalization简介

11-24

对Batch Normalization论文进行了解读,用通俗的视角理解Batch Normalization。

对Batch Normalization论文进行了解读,用通俗的视角理解Batch Normalization。

对Batch Normalization论文进行了解读,用通俗的视角理解Batch Normalization。

TensorFlow实现Batch Normalization

09-20

主要为大家详细介绍了TensorFlow实现Batch Normalization,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Batch Normalization

12-17

Our method draws its strength from making normalization a part of the model architecture and performing the normalization for each training mini-batch. Batch Normalization allows us to use much ...

Batch Normalization: Accelerating Deep Network Training by Reducing Internal.pdf

02-21

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

LightGBM(lgb)详解

热门推荐

weixin_44023658的博客

06-13

6万+

1. LightGBM简介

GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛,通常被用于多分类、点击率预测、搜索排序等任务;在各种数据挖掘竞赛中也是致命武器,据统计Kaggle上的比赛有一半以上的冠军方案都是基于GBDT。而LightGBM(Light Gradient Boosting Machine)是一个实现GBDT

ResNet——CNN经典网络模型详解(pytorch实现)

weixin_44023658的博客

04-29

3万+

1、前言

ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比VGGNet低,效果非常突出。ResNet的结构可以极快的加速神经网络的训练,模型的准确率也有比较大的提升。同时ResNet的推广...

卷积神经网络性能优化(提高准确率)

weixin_44023658的博客

05-17

3万+

注:本文先讲解理论部分,之后会用pytorch给出示例

神经网络是一种在很多用例中能够提供最优准确率的机器学习算法。但是,很多时候我们构建的神经网络的准确率可能无法令人满意,或者无法让我们在数据科学竞赛中拿到领先名次。所以,我们总是在寻求更好的方式来改善模型的性能。有很多技术可以帮助我们达到这个目标。本文将介绍这些技术,帮助大家构建更准确的神经网络。

过拟合

过拟合,典型的表现为训练集损失远远小于验证集损失。而欠拟合则表现为训练集损失大于验证集损失。

保证神经网络在测试集上运行良好的第一步就是验证神经网络

batch normalization (bn)

最新发布

04-11

批归一化(Batch Normalization,BN)是一种在深度学习中广泛使用的技术,它可以加速神经网络的学习过程。BN可以使神经网络的每一层的输入都有相同的均值和方差,从而降低了输入数据的影响,使神经网络对数据的微小变化更为敏感,提高了训练的速度和效果。同时,BN还可以有效降低过拟合,从而提高了网络的泛化能力。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

浩波的笔记

CSDN认证博客专家

CSDN认证企业博客

码龄5年

暂无认证

192

原创

12万+

周排名

209万+

总排名

73万+

访问

等级

6874

积分

1252

粉丝

1437

获赞

186

评论

9072

收藏

私信

关注

热门文章

LightGBM(lgb)详解

61018

知识图谱入门一:知识图谱介绍

45496

Batch Normalization(BN)超详细解析

35250

ResNet——CNN经典网络模型详解(pytorch实现)

33579

卷积神经网络性能优化(提高准确率)

31444

分类专栏

区块链

2篇

数据分析

14篇

音频

2篇

paper

Leetcode

5篇

算法/数据结构

28篇

工具

13篇

数据挖掘

12篇

机器/深度学习

56篇

可视化

5篇

爬虫

2篇

知识图谱

4篇

操作系统

1篇

c/c++

13篇

推荐系统

16篇

笔记

NLP

9篇

math

6篇

Golang

26篇

SQL

6篇

web

12篇

python

31篇

图像

27篇

汇编

11篇

程序设计

8篇

日常感悟

最新评论

旧电脑从win7更换成Ubuntu系统(U盘安装)

田园大萝卜:

18.04安装成功,

1.安装时断网,时间设置与实际一样,避免安装程序崩溃。

2.安装成功后重启电脑显示大连error,则说明文件缺失,可以考虑换个国内镜像源,重新制作系统盘。

3.重启电脑显示reboot device什么的,则关掉电脑并重启点击F12(戴尔)进入bios setup,更改系统第一启动项为硬件,就是那个ptiority什么的,退出的时候不要按esc,要进入exit界面,点击save再退出。

留给自己以后再次安装时看。

CNN卷积神经网络(超详解析)

一直很任性、ら:

给解释一下呗,兄弟

Batch Normalization(BN)超详细解析

k080921:

每一层进行batch normalization会破坏数据分布吗?

知识图谱入门一:知识图谱介绍

YWAX:

1.生成式人工智能不擅长推论判断

2.生成式人工智能具有黑盒效应,人类无法理解其运行无法评估内容风险,也没办法根本上解决

3.符号学与连接学共同互补才是人工智能的未来

最优二叉查找树(动态规划)——详解

穷的只剩作业103:

为啥j=i-1是虚拟键?

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

[数据分析实践]-Image Matching-2DTo3D-1

[数据分析实践]-音频分析-BirdCLE-3

[数据分析实践]-音频分析-BirdCLE-2

2022年4篇

2021年22篇

2020年175篇

目录

目录

分类专栏

区块链

2篇

数据分析

14篇

音频

2篇

paper

Leetcode

5篇

算法/数据结构

28篇

工具

13篇

数据挖掘

12篇

机器/深度学习

56篇

可视化

5篇

爬虫

2篇

知识图谱

4篇

操作系统

1篇

c/c++

13篇

推荐系统

16篇

笔记

NLP

9篇

math

6篇

Golang

26篇

SQL

6篇

web

12篇

python

31篇

图像

27篇

汇编

11篇

程序设计

8篇

日常感悟

目录

评论 5

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

打赏作者

浩波的笔记

你的鼓励将是我创作的最大动力

¥1

¥2

¥4

¥6

¥10

¥20

扫码支付:¥1

获取中

扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

BatchNorm2d — PyTorch 2.2 documentation

BatchNorm2d — PyTorch 2.2 documentation

Get Started

Ecosystem

Edge

About PyTorch Edge

ExecuTorch

Blog

Tutorials

Docs

PyTorch

torchaudio

torchtext

torchvision

torcharrow

TorchData

TorchRec

TorchServe

TorchX

PyTorch on XLA Devices

Resources

About

Learn about PyTorch’s features and capabilities

PyTorch Foundation

Learn about the PyTorch foundation

Community

Join the PyTorch developer community to contribute, learn, and get your questions answered.

Community Stories

Learn how our community solves real, everyday machine learning problems with PyTorch.

Developer Resources

Find resources and get questions answered

Events

Find events, webinars, and podcasts

Forums

A place to discuss PyTorch code, issues, install, research

Models (Beta)

Discover, publish, and reuse pre-trained models

GitHub

Table of Contents

2.2 ▼

Community

PyTorch Governance | Build + CI

PyTorch Contribution Guide

PyTorch Design Philosophy

PyTorch Governance | Mechanics

PyTorch Governance | Maintainers

Developer Notes

CUDA Automatic Mixed Precision examples

Autograd mechanics

Broadcasting semantics

CPU threading and TorchScript inference

CUDA semantics

Distributed Data Parallel

Extending PyTorch

Extending torch.func with autograd.Function

Frequently Asked Questions

Gradcheck mechanics

HIP (ROCm) semantics

Features for large-scale deployments

Modules

MPS backend

Multiprocessing best practices

Numerical accuracy

Reproducibility

Serialization semantics

Windows FAQ

Language Bindings

C++

Javadoc

torch::deploy

Python API

torch

torch.nn

torch.nn.functional

torch.Tensor

Tensor Attributes

Tensor Views

torch.amp

torch.autograd

torch.library

torch.cpu

torch.cuda

Understanding CUDA Memory Usage

Generating a Snapshot

Using the visualizer

Snapshot API Reference

torch.mps

torch.backends

torch.export

torch.distributed

torch.distributed.algorithms.join

torch.distributed.elastic

torch.distributed.fsdp

torch.distributed.optim

torch.distributed.tensor.parallel

torch.distributed.checkpoint

torch.distributions

torch.compiler

torch.fft

torch.func

torch.futures

torch.fx

torch.hub

torch.jit

torch.linalg

torch.monitor

torch.signal

torch.special

torch.overrides

torch.package

torch.profiler

torch.nn.init

torch.onnx

torch.optim

Complex Numbers

DDP Communication Hooks

Pipeline Parallelism

Quantization

Distributed RPC Framework

torch.random

torch.masked

torch.nested

torch.sparse

torch.Storage

torch.testing

torch.utils

torch.utils.benchmark

torch.utils.bottleneck

torch.utils.checkpoint

torch.utils.cpp_extension

torch.utils.data

torch.utils.deterministic

torch.utils.jit

torch.utils.dlpack

torch.utils.mobile_optimizer

torch.utils.model_zoo

torch.utils.tensorboard

Type Info

Named Tensors

Named Tensors operator coverage

torch.__config__

torch._logging

Libraries

torchaudio

TorchData

TorchRec

TorchServe

torchtext

torchvision

PyTorch on XLA Devices

Docs

>

torch.nn >

BatchNorm2d

Shortcuts

BatchNorm2d¶

class torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None)[source]¶

Applies Batch Normalization over a 4D input (a mini-batch of 2D inputs

with additional channel dimension) as described in the paper

Batch Normalization: Accelerating Deep Network Training by Reducing

Internal Covariate Shift .

y=x−E[x]Var[x]+ϵ∗γ+βy = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \betay=Var[x]+ϵ​x−E[x]​∗γ+βThe mean and standard-deviation are calculated per-dimension over

the mini-batches and γ\gammaγ and β\betaβ are learnable parameter vectors

of size C (where C is the input size). By default, the elements of γ\gammaγ are set

to 1 and the elements of β\betaβ are set to 0. At train time in the forward pass, the

standard-deviation is calculated via the biased estimator, equivalent to

torch.var(input, unbiased=False). However, the value stored in the moving average of the

standard-deviation is calculated via the unbiased estimator, equivalent to

torch.var(input, unbiased=True).

Also by default, during training this layer keeps running estimates of its

computed mean and variance, which are then used for normalization during

evaluation. The running estimates are kept with a default momentum

of 0.1.

If track_running_stats is set to False, this layer then does not

keep running estimates, and batch statistics are instead used during

evaluation time as well.

Note

This momentum argument is different from one used in optimizer

classes and the conventional notion of momentum. Mathematically, the

update rule for running statistics here is

x^new=(1−momentum)×x^+momentum×xt\hat{x}_\text{new} = (1 - \text{momentum}) \times \hat{x} + \text{momentum} \times x_tx^new​=(1−momentum)×x^+momentum×xt​,

where x^\hat{x}x^ is the estimated statistic and xtx_txt​ is the

new observed value.

Because the Batch Normalization is done over the C dimension, computing statistics

on (N, H, W) slices, it’s common terminology to call this Spatial Batch Normalization.

Parameters

num_features (int) – CCC from an expected input of size

(N,C,H,W)(N, C, H, W)(N,C,H,W)

eps (float) – a value added to the denominator for numerical stability.

Default: 1e-5

momentum (float) – the value used for the running_mean and running_var

computation. Can be set to None for cumulative moving average

(i.e. simple average). Default: 0.1

affine (bool) – a boolean value that when set to True, this module has

learnable affine parameters. Default: True

track_running_stats (bool) – a boolean value that when set to True, this

module tracks the running mean and variance, and when set to False,

this module does not track such statistics, and initializes statistics

buffers running_mean and running_var as None.

When these buffers are None, this module always uses batch statistics.

in both training and eval modes. Default: True

Shape:

Input: (N,C,H,W)(N, C, H, W)(N,C,H,W)

Output: (N,C,H,W)(N, C, H, W)(N,C,H,W) (same shape as input)

Examples:

>>> # With Learnable Parameters

>>> m = nn.BatchNorm2d(100)

>>> # Without Learnable Parameters

>>> m = nn.BatchNorm2d(100, affine=False)

>>> input = torch.randn(20, 100, 35, 45)

>>> output = m(input)

Next

Previous

© Copyright 2023, PyTorch Contributors.

Built with Sphinx using a theme provided by Read the Docs.

BatchNorm2d

BatchNorm2d

Docs

Access comprehensive developer documentation for PyTorch

View Docs

Tutorials

Get in-depth tutorials for beginners and advanced developers

View Tutorials

Resources

Find development resources and get your questions answered

View Resources

PyTorch

Get Started

Features

Ecosystem

Blog

Contributing

Resources

Tutorials

Docs

Discuss

Github Issues

Brand Guidelines

Stay up to date

Facebook

Twitter

YouTube

LinkedIn

PyTorch Podcasts

Spotify

Apple

Google

Amazon

Terms

|

Privacy

© Copyright The Linux Foundation. The PyTorch Foundation is a project of The Linux Foundation.

For web site terms of use, trademark policy and other policies applicable to The PyTorch Foundation please see

www.linuxfoundation.org/policies/. The PyTorch Foundation supports the PyTorch open source

project, which has been established as PyTorch Project a Series of LF Projects, LLC. For policies applicable to the PyTorch Project a Series of LF Projects, LLC,

please see www.lfprojects.org/policies/.

To analyze traffic and optimize your experience, we serve cookies on this site. By clicking or navigating, you agree to allow our usage of cookies. As the current maintainers of this site, Facebook’s Cookies Policy applies. Learn more, including about available controls: Cookies Policy.

Get Started

Ecosystem

Mobile

Blog

Tutorials

Docs

PyTorch

torchaudio

torchtext

torchvision

torcharrow

TorchData

TorchRec

TorchServe

TorchX

PyTorch on XLA Devices

Resources

About

PyTorch Foundation

Community

Community Stories

Developer Resources

Events

Forums

Models (Beta)

Github

Batch normalization和Instance normalization的对比? - 知乎

Batch normalization和Instance normalization的对比? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册计算机视觉深度学习(Deep Learning)Batch normalization和Instance normalization的对比?看到最近有不少CNN模型用到了instance normalization,比如最近的DeblurGAN [ 拍照手抖有救了!DeblurGAN消除运…显示全部 ​关注者1,035被浏览299,869关注问题​写回答​邀请回答​好问题 15​添加评论​分享​22 个回答默认排序Naiyan Wang​机器学习等 3 个话题下的优秀答主​ 关注私以为对这个的理解还是比较透彻的,恰好我们有几篇paper其实都是和这个问题相关的,所以来简答一下,希望能够帮助大家梳理清楚背后的本质。BN和IN其实本质上是同一个东西,只是IN是作用于单张图片,但是BN作用于一个batch。但是为什么IN还会被单独提出,而且在Style Transfer的这个任务中大放异彩呢?简言之,这背后的逻辑链是这样的:1. 通过调整BN统计量,或学习的参数beta和gamma,BN可以用来做domain adaptation。[1]2. Style Transfer是一个把每张图片当成一个domain的domain adaptation问题。[2]这恰恰分别对应了我和一位优秀实习生的两篇paper。以上其实都是对paper的一句话总结,下面稍微展开说一下具体内容。TLDR在[1]中,我们提出了一个叫做adaBN的方法来做domain adaptation。其实adaBN做的事情看上去非常trivial:在拓展到未知的domain的时候,将BN的统计量在这个domain的unlabel data上重新计算一遍。如果用现有deep learning框架去实现的话,只需要一行就够。但是这样一个操作,可以带来相当显著的性能提升。究其原因,其实BN在做的事情就是将每个batch的数据归一化到standard Gaussian。我们在不同数据上计算统计量,可以将不同domain的数据分布的差异归一。在[2]中,我们从style transfer中使用的Gram matrix出发,试图解释为什么Gram matrix可以代表一个图片的style这个问题。这是我看完style transfer的paper后感觉最为迷惑的一点。一个偶然的机会,我们发现这个匹配两张图的Gram matrix,其实数学上严格等价于极小化这两张图deep activation的2nd poly kernel的MMD距离。其中,MMD距离是用来通过从两个分布中sample的样本来衡量两个分布之间的差异的一种度量。所以本质上,style transfer这个paper做的事情就是将生成图片的deep activation分布和style image的分布进行匹配。这其实可以认为是一个domain adaptation的问题。所以很自然我们可以使用类似于adaBN的想法去做这件事情。这后续有一系列的工作拓展了这个想法,包括adaIN[3]以及若干基于GAN去做style transfer的工作。不得不说,想明白这些之后,再去看style transfer的paper有一种神清气爽的感觉。我想这也就是我们要去探究“炼金术”背后的原理的一大原因。站在更general更高的角度去看待这些问题真的是一件让人身心愉悦的事情,而且很多后续的extension都是非常的直观。 :-)[1] Li, Yanghao, Naiyan Wang, Jianping Shi, Jiaying Liu, and Xiaodi Hou. "Revisiting batch normalization for practical domain adaptation." arXiv preprint arXiv:1603.04779 (2016).[2] Li, Yanghao, Naiyan Wang, Jiaying Liu, and Xiaodi Hou. "Demystifying neural style transfer." arXiv preprint arXiv:1701.01036 (2017).[3] Huang, Xun, and Serge Belongie. "Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization." arXiv preprint arXiv:1703.06868 (2017).编辑于 2017-12-16 13:45​赞同 904​​38 条评论​分享​收藏​喜欢收起​向东​ 关注一.BN和IN的对比假如现有6张图片x1,x2,x3,x4,x5,x6,每张图片在CNN的某一卷积层有6个通道,也就是6个feature map。有关Batch Normalization与Instance Normalization的区别请看下图:Batch NormalizationInstance Normalization上图中,从C方向看过去是指一个个通道,从N看过去是一张张图片。每6个竖着排列的小正方体组成的长方体代表一张图片的一个feature map。蓝色的方块是一起进行Normalization的部分。由此就可以很清楚的看出,Batch Normalization是指6张图片中的每一张图片的同一个通道一起进行Normalization操作。而Instance Normalization是指单张图片的单个通道单独进行Noramlization操作。二.各自适用场景BN适用于判别模型中,比如图片分类模型。因为BN注重对每个batch进行归一化,从而保证数据分布的一致性,而判别模型的结果正是取决于数据整体分布。但是BN对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布;IN适用于生成模型中,比如图片风格迁移。因为图片生成的结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,在风格迁移中使用Instance Normalization不仅可以加速模型收敛,并且可以保持每个图像实例之间的独立。三:BN与IN的公式BNININ公式中,t代表图片的Index,i代表的是feature map的index。四.算法的过程4.1 BN沿着通道计算每个batch的均值u沿着通道计算每个batch的方差σ^2对x做归一化,x’=(x-u)/开根号(σ^2+ε)加入缩放和平移变量γ和β ,归一化后的值,y=γx’+β4.2 IN沿着通道计算每张图的均值u沿着通道计算每张图的方差σ^2对x做归一化,x’=(x-u)/开根号(σ^2+ε)加入缩放和平移变量γ和β ,归一化后的值,y=γx’+β五.其他归一化操作5.1 Layer NormalizationLN是指对同一张图片的同一层的所有通道进行Normalization操作。5.2 Group NormalizationGN是指对同一张图片的同一层的某几个(不是全部)通道一起进行Normalization操作。这几个通道称为一个Group。六:参考资料1.本文图示来自于何凯明大神的2018年的一篇论文:Group Normalization,地址在:https://arxiv.org/pdf/1803.08494.pdf,原图为:(PS:大神就是大神.......画张图一目了然......)2.https://blog.csdn.net/liuxiao214/article/details/81037416编辑于 2019-02-25 09:03​赞同 295​​20 条评论​分享​收藏​喜欢

BatchNorm-API文档-PaddlePaddle深度学习平台

hNorm-API文档-PaddlePaddle深度学习平台You need to enable JavaScript to run this app.\u200E开始使用特性文档API使用指南工具平台工具AutoDLPaddleHubPARLERNIE全部平台AI StudioEasyDLEasyEdge资源模型和数据集学习资料应用案例develop2.62.52.42.32.22.12.01.8中文(简)English(En)

安装指南

Pip 安装

Linux 下的 PIP 安装

MacOS 下的 PIP 安装

Windows 下的 PIP 安装

Conda 安装

Linux 下的 Conda 安装

MacOS 下的 Conda 安装

Windows 下的 Conda 安装

Docker 安装

Linux 下的 Docker 安装

MacOS 下的 Docker 安装

Docker 列表

从源码编译

Linux 下使用 make 从源码编译

macOS 下使用 make 从源码编译

Linux 下使用 ninja 从源码编译

macOS 下使用 ninja 从源码编译

Windows 下从源码编译

飞腾/鲲鹏下从源码编译

申威下从源码编译

兆芯下从源码编译

龙芯下从源码编译

昆仑 XPU 芯片安装及运行飞桨

海光 DCU 芯片运行飞桨

附录

使用指南

模型开发入门

10分钟快速上手飞桨

Tensor 介绍

数据集定义与加载

数据预处理

模型组网

模型训练、评估与推理

模型保存与加载

模型开发更多用法

使用 VisualDL 可视化模型,数据和训练

自动微分机制介绍

使用 paddle.nn.Layer 自定义网络

自定义Loss、Metric 及 Callback

梯度裁剪方式介绍

飞桨模型转 ONNX 模型

动态图转静态图

使用样例

转换原理

支持语法

案例解析

报错调试

Limitations

推理部署

服务器部署 — Paddle Inference

移动端/嵌入式部署 — Paddle Lite

模型自动化压缩工具(ACT)

分布式训练

分布式训练简介

环境部署

快速开始-数据并行

快速开始-参数服务器

数据并行

原理和实践案例

前向重计算

自动混合精度

Gradient Merge

参数服务器

参数服务器概述

纯 GPU 参数服务器

CPUPS 流式训练示例

张量模型并行

流水线并行

分组切分并行

MoE

静态图流水并行时序图可视化工具

性能调优

自动混合精度训练(AMP)

模型性能分析(Profiler)

训练全流程自动调优(Beta)

模型迁移

迁移指南

从 PyTorch 迁移到飞桨

CV - 快速上手

CV - 迁移经验汇总

NLP - 快速上手

NLP - 迁移经验汇总

解读网络结构转换

解读 Bert 模型权重转换

Pytorch 2.1.0 与 Paddle develop API 映射表

Pytorch 自定义算子转写教程

使用 X2Paddle 迁移推理模型

迁移飞桨旧版本

升级指南

版本迁移工具

兼容载入旧格式模型

Paddle 1.8 与 Paddle 2.0 API 映射表

附录: 飞桨框架 2.x

硬件支持

飞桨产品硬件支持表

昆仑芯片运行飞桨

飞桨对昆仑芯 2 代芯片的支持

飞桨框架昆仑 2 代芯片安装说明

飞桨框架昆仑 2 代芯片训练示例

飞桨对昆仑 XPU 芯片的支持

飞桨框架昆仑 XPU 版安装说明

飞桨框架昆仑 XPU 版训练示例

飞桨预测库昆仑 XPU 版安装及使用示例

海光 DCU 芯片运行飞桨

飞桨框架 ROCm 版支持模型

飞桨框架 ROCm 版安装说明

飞桨框架 ROCm 版训练示例

飞桨框架 ROCm 版预测示例

昇腾 NPU 芯片运行飞桨

飞桨框架昇腾 NPU 版安装说明

飞桨框架昇腾 NPU 版训练示例

Graphcore IPU 芯片运行飞桨

飞桨框架 IPU 版安装说明

飞桨框架 IPU 版训练示例

飞桨框架 IPU 版预测示例

寒武纪 MLU 芯片运行飞桨

飞桨框架寒武纪 MLU 版安装说明

飞桨框架 MLU 版训练示例

飞桨框架寒武纪 MLU 版支持模型

自定义算子

自定义 C++算子

自定义 C++ 扩展

自定义 Python 算子

环境变量 FLAGS

cudnn

数值计算

调试

check nan inf 工具

设备管理

分布式

执行器

存储管理

昇腾 NPU

其他

应用实践

快速上手

hello paddle: 从普通程序走向机器学习程序

动态图

飞桨高层API使用指南

模型保存及加载

使用线性回归预测波士顿房价

计算机视觉

使用LeNet在MNIST数据集实现图像分类

使用卷积神经网络进行图像分类

CIFAR-100数据集上基于Vision Transformer 实现图片分类

GAMMA比赛多模态眼底图像数据集下基于EfficientNet和ResNet构造fundus_img和oct_img的分类模型

MosMedData: 新冠肺炎胸部 CT扫描数据集上基于3D-CNN实现二分类

基于图片相似度的图片搜索

基于U-Net卷积神经网络实现宠物图像分割

通过OCR实现验证码识别

通过Sub-Pixel实现图像超分辨率

人脸关键点检测

点云处理:实现PointNet点云分类

点云处理:实现PointNet点云分割

自然语言处理

用N-Gram模型在莎士比亚文集中训练word embedding

IMDB 数据集使用BOW网络的文本分类

使用预训练的词向量完成文本分类任务

使用注意力机制的LSTM的机器翻译

基于Transformer实现英语到西班牙语的翻译任务

使用序列到序列模型完成数字加法

推荐

使用协同过滤实现电影推荐

强化学习

强化学习——Actor Critic Method

强化学习——Advantage Actor-Critic(A2C)

强化学习——Deep Deterministic Policy Gradient (DDPG)

强化学习——DQN玩合成大西瓜

用飞桨框架2.0造一个会下五子棋的AI模型

时序数据

通过AutoEncoder实现时序数据异常检测

Jena Climate时间序列数据集上使用LSTM进行温度的预报

证券数据集下使用LSTM模型预测A股走势

动转静

使用动转静完成以图搜图

生成式对抗网络

图像风格迁移模型-CycleGAN

通过DCGAN实现人脸图像生成

MNIST数据集下用Paddle框架的动态图模式玩耍经典对抗生成网络(GAN)

城市街景分割数据集下使用对抗网络Pix2Pix根据掩码生成街景

API 文档

paddle

Overview

abs

acos

acosh

add

add_

add_n

addmm

all

allclose

amax

amin

angle

any

arange

argmax

argmin

argsort

as_complex

as_real

as_strided

asin

asinh

assign

atan

atan2

atanh

atleast_1d

atleast_2d

atleast_3d

batch

bernoulli

bincount

binomial

bitwise_and

bitwise_not

bitwise_or

bitwise_xor

bmm

broadcast_shape

broadcast_tensors

broadcast_to

bucketize

cast

cdist

ceil

ceil_

chunk

clip

clip_

clone

column_stack

combinations

complex

concat

conj

cos

cosh

count_nonzero

CPUPlace

create_parameter

crop

cross

CUDAPinnedPlace

CUDAPlace

cummax

cummin

cumprod

cumsum

cumulative_trapezoid

DataParallel

deg2rad

diag

diag_embed

diagflat

diagonal

diagonal_scatter

diff

digamma

disable_signal_handler

disable_static

dist

divide

dot

dsplit

dstack

einsum

empty

empty_like

enable_grad

enable_static

equal

equal_all

erf

erfinv

erfinv_

exp

exp_

expand

expand_as

expm1

eye

finfo

flatten

flatten_

flip

floor

floor_

floor_divide

flops

fmax

fmin

frac

frexp

full

full_like

gather

gather_nd

gcd

get_cuda_rng_state

get_default_dtype

get_flags

grad

greater_equal

greater_than

heaviside

histogram

histogramdd

hsplit

hstack

hypot

hypot_

i0

i0e

i1

i1e

iinfo

imag

in_dynamic_mode

increment

index_add

index_add_

index_fill

index_fill_

index_put

index_put_

index_sample

index_select

inner

is_complex

is_empty

is_floating_point

is_grad_enabled

is_integer

is_tensor

isclose

isfinite

isinf

isnan

kron

kthvalue

LazyGuard

lcm

ldexp

lerp

lerp_

less_equal

less_than

lgamma

linspace

load

log

log10

log1p

log2

logaddexp

logcumsumexp

logical_and

logical_not

logical_or

logical_xor

logit

logspace

logsumexp

masked_fill

masked_fill_

masked_scatter

masked_scatter_

masked_select

matmul

max

maximum

mean

median

meshgrid

min

minimum

mm

mod

mode

Model

moveaxis

multigammaln

multigammaln_

multinomial

multiplex

multiply

mv

nan_to_num

nanmean

nanmedian

nansum

neg

nextafter

no_grad

nonzero

normal

not_equal

NPUPlace

numel

ones

ones_like

outer

ParamAttr

pdist

poisson

polar

polygamma

pow

prod

put_along_axis

put_along_axis_

quantile

rad2deg

rand

randint

randint_like

randn

randperm

rank

real

reciprocal

reciprocal_

remainder

remainder_

repeat_interleave

reshape

reshape_

roll

rot90

round

round_

row_stack

rsqrt

rsqrt_

save

scale

scale_

scatter

scatter_

scatter_nd

scatter_nd_add

searchsorted

seed

select_scatter

set_cuda_rng_state

set_default_dtype

set_flags

set_grad_enabled

set_printoptions

sgn

shape

shard_index

sign

signbit

sin

sin_

sinh

slice

sort

split

sqrt

sqrt_

square

squeeze

squeeze_

stack

standard_normal

stanh

std

strided_slice

subtract

subtract_

sum

summary

t

take

take_along_axis

tan

tan_

tanh

tanh_

Tensor

tensor_split

tensordot

tile

to_tensor

tolist

topk

trace

transpose

trapezoid

tril

tril_indices

triu

triu_indices

trunc

unbind

unflatten

unfold

uniform

uniform_

unique

unique_consecutive

unsqueeze

unsqueeze_

unstack

vander

var

view

view_as

vsplit

vstack

where

zeros

zeros_like

paddle.amp

Overview

auto_cast

debugging

check_numerics

collect_operator_stats

compare_accuracy

DebugMode

disable_operator_stats_collection

disable_tensor_checker

enable_operator_stats_collection

enable_tensor_checker

TensorCheckerConfig

decorate

GradScaler

is_bfloat16_supported

is_float16_supported

paddle.audio

Overview

backends

get_current_backend

list_available_backends

set_backend

datasets

ESC50

TESS

features

LogMelSpectrogram

MelSpectrogram

MFCC

Spectrogram

functional

compute_fbank_matrix

create_dct

fft_frequencies

get_window

hz_to_mel

mel_frequencies

mel_to_hz

power_to_db

info

load

save

paddle.autograd

backward

hessian

jacobian

PyLayer

PyLayerContext

saved_tensors_hooks

paddle.callbacks

Overview

Callback

EarlyStopping

LRScheduler

ModelCheckpoint

ProgBarLogger

ReduceLROnPlateau

VisualDL

paddle.device

cuda

current_stream

device_count

empty_cache

Event

get_device_capability

get_device_name

get_device_properties

max_memory_allocated

max_memory_reserved

memory_allocated

memory_reserved

Stream

stream_guard

synchronize

current_stream

Event

get_all_custom_device_type

get_all_device_type

get_available_custom_device

get_available_device

get_cudnn_version

get_device

IPUPlace

is_compiled_with_cinn

is_compiled_with_cuda

is_compiled_with_custom_device

is_compiled_with_ipu

is_compiled_with_mlu

is_compiled_with_npu

is_compiled_with_rocm

is_compiled_with_xpu

MLUPlace

set_device

set_stream

Stream

stream_guard

synchronize

XPUPlace

paddle.distributed

Overview

all_gather

all_gather_object

all_reduce

alltoall

alltoall_single

barrier

broadcast

broadcast_object_list

destroy_process_group

DistAttr

dtensor_from_fn

fleet

DistributedStrategy

Fleet

PaddleCloudRoleMaker

UserDefinedRoleMaker

UtilBase

utils

HDFSClient

LocalFS

recompute

get_backend

get_group

get_rank

get_world_size

gloo_barrier

gloo_init_parallel_env

gloo_release

init_parallel_env

InMemoryDataset

irecv

is_available

is_initialized

isend

launch

new_group

ParallelEnv

Partial

Placement

ProcessMesh

QueueDataset

recv

reduce

reduce_scatter

ReduceOp

ReduceType

Replicate

reshard

rpc

get_all_worker_infos

get_current_worker_info

get_worker_info

init_rpc

rpc_async

rpc_sync

shutdown

scatter

scatter_object_list

send

Shard

shard_layer

shard_optimizer

shard_tensor

sharding

group_sharded_parallel

save_group_sharded_model

spawn

split

Strategy

stream

all_gather

all_reduce

alltoall

alltoall_single

broadcast

recv

reduce

reduce_scatter

scatter

send

to_static

utils

global_gather

global_scatter

wait

paddle.distribution

Overview

AbsTransform

AffineTransform

Bernoulli

Beta

Binomial

Categorical

Cauchy

ChainTransform

ContinuousBernoulli

Dirichlet

Distribution

ExponentialFamily

ExpTransform

Geometric

Gumbel

Independent

IndependentTransform

kl_divergence

Laplace

LogNormal

Multinomial

MultivariateNormal

Normal

Poisson

PowerTransform

register_kl

ReshapeTransform

SigmoidTransform

SoftmaxTransform

StackTransform

StickBreakingTransform

TanhTransform

Transform

TransformedDistribution

Uniform

paddle.fft

Overview

fft

fft2

fftfreq

fftn

fftshift

hfft

hfft2

hfftn

ifft

ifft2

ifftn

ifftshift

ihfft

ihfft2

ihfftn

irfft

irfft2

irfftn

rfft

rfft2

rfftfreq

rfftn

paddle.fluid

Overview

paddle.geometric

Overview

reindex_graph

reindex_heter_graph

sample_neighbors

segment_max

segment_mean

segment_min

segment_sum

send_u_recv

send_ue_recv

send_uv

paddle.hub

Overview

help

list

load

paddle.incubate

asp

add_supported_layer

calculate_density

decorate

prune_model

reset_excluded_layers

set_excluded_layers

autograd

Overview

disable_prim

enable_prim

forward_grad

grad

Hessian

Jacobian

jvp

vjp

autotune

set_config

graph_khop_sampler

graph_reindex

graph_sample_neighbors

graph_send_recv

identity_loss

LookAhead

ModelAverage

nn

functional

fused_ec_moe

fused_feedforward

fused_layer_norm

fused_matmul_bias

fused_multi_head_attention

fused_rms_norm

FusedEcMoe

FusedFeedForward

FusedLinear

FusedMultiHeadAttention

FusedTransformerEncoderLayer

optimizer

functional

minimize_bfgs

minimize_lbfgs

LBFGS

segment_max

segment_mean

segment_min

segment_sum

softmax_mask_fuse

softmax_mask_fuse_upper_triangle

xpu

resnet_block

ResNetBasicBlock

paddle.io

Overview

BatchSampler

ChainDataset

ComposeDataset

ConcatDataset

DataLoader

Dataset

DistributedBatchSampler

get_worker_info

IterableDataset

random_split

RandomSampler

Sampler

SequenceSampler

Subset

SubsetRandomSampler

TensorDataset

WeightedRandomSampler

paddle.jit

Overview

enable_to_static

ignore_module

load

not_to_static

save

set_code_level

set_verbosity

to_static

TranslatedLayer

paddle.linalg

Overview

cholesky

cholesky_solve

cond

corrcoef

cov

det

eig

eigh

eigvals

eigvalsh

householder_product

inv

lstsq

lu

lu_unpack

matrix_exp

matrix_power

matrix_rank

multi_dot

norm

pca_lowrank

pinv

qr

slogdet

solve

svd

triangular_solve

paddle.metric

Overview

Accuracy

accuracy

Auc

Metric

Precision

Recall

paddle.nn

Overview

AdaptiveAvgPool1D

AdaptiveAvgPool2D

AdaptiveAvgPool3D

AdaptiveMaxPool1D

AdaptiveMaxPool2D

AdaptiveMaxPool3D

AlphaDropout

AvgPool1D

AvgPool2D

AvgPool3D

BatchNorm

BatchNorm1D

BatchNorm2D

BatchNorm3D

BCELoss

BCEWithLogitsLoss

BeamSearchDecoder

Bilinear

BiRNN

CELU

ChannelShuffle

ClipGradByGlobalNorm

ClipGradByNorm

ClipGradByValue

Conv1D

Conv1DTranspose

Conv2D

Conv2DTranspose

Conv3D

Conv3DTranspose

CosineEmbeddingLoss

CosineSimilarity

CrossEntropyLoss

CTCLoss

Dropout

Dropout2D

Dropout3D

dynamic_decode

ELU

Embedding

Flatten

Fold

functional

adaptive_avg_pool1d

adaptive_avg_pool2d

adaptive_avg_pool3d

adaptive_max_pool1d

adaptive_max_pool2d

adaptive_max_pool3d

affine_grid

alpha_dropout

avg_pool1d

avg_pool2d

avg_pool3d

batch_norm

bilinear

binary_cross_entropy

binary_cross_entropy_with_logits

celu

channel_shuffle

class_center_sample

conv1d

conv1d_transpose

conv2d

conv2d_transpose

conv3d

conv3d_transpose

cosine_embedding_loss

cosine_similarity

cross_entropy

ctc_loss

dice_loss

dropout

dropout2d

dropout3d

elu

elu_

embedding

fold

gather_tree

gaussian_nll_loss

gelu

glu

grid_sample

gumbel_softmax

hardshrink

hardsigmoid

hardswish

hardtanh

hinge_embedding_loss

hsigmoid_loss

instance_norm

interpolate

kl_div

l1_loss

label_smooth

layer_norm

leaky_relu

linear

local_response_norm

log_loss

log_sigmoid

log_softmax

margin_cross_entropy

margin_ranking_loss

max_pool1d

max_pool2d

max_pool3d

max_unpool1d

max_unpool2d

max_unpool3d

maxout

mish

mse_loss

multi_label_soft_margin_loss

multi_margin_loss

nll_loss

normalize

npair_loss

one_hot

pad

pairwise_distance

pixel_shuffle

pixel_unshuffle

poisson_nll_loss

prelu

relu

relu6

relu_

rnnt_loss

rrelu

selu

sequence_mask

sigmoid

sigmoid_focal_loss

silu

smooth_l1_loss

soft_margin_loss

softmax

softmax_

softmax_with_cross_entropy

softplus

softshrink

softsign

sparse_attention

square_error_cost

swish

tanhshrink

temporal_shift

thresholded_relu

triplet_margin_loss

triplet_margin_with_distance_loss

unfold

upsample

zeropad2d

GaussianNLLLoss

GELU

GLU

GroupNorm

GRU

GRUCell

Hardshrink

Hardsigmoid

Hardswish

Hardtanh

HingeEmbeddingLoss

HSigmoidLoss

Identity

initializer

Assign

Bilinear

calculate_gain

Constant

Dirac

KaimingNormal

KaimingUniform

Normal

Orthogonal

set_global_initializer

TruncatedNormal

Uniform

XavierNormal

XavierUniform

InstanceNorm1D

InstanceNorm2D

InstanceNorm3D

KLDivLoss

L1Loss

Layer

LayerDict

LayerList

LayerNorm

LeakyReLU

Linear

LocalResponseNorm

LogSigmoid

LogSoftmax

LSTM

LSTMCell

MarginRankingLoss

Maxout

MaxPool1D

MaxPool2D

MaxPool3D

MaxUnPool1D

MaxUnPool2D

MaxUnPool3D

Mish

MSELoss

MultiHeadAttention

MultiLabelSoftMarginLoss

MultiMarginLoss

NLLLoss

Pad1D

Pad2D

Pad3D

PairwiseDistance

ParameterList

PixelShuffle

PixelUnshuffle

PoissonNLLLoss

PReLU

ReLU

ReLU6

RNN

RNNCellBase

RNNTLoss

RReLU

SELU

Sequential

Sigmoid

Silu

SimpleRNN

SimpleRNNCell

SmoothL1Loss

SoftMarginLoss

Softmax

Softmax2D

Softplus

Softshrink

Softsign

SpectralNorm

Swish

SyncBatchNorm

Tanh

Tanhshrink

ThresholdedReLU

Transformer

TransformerDecoder

TransformerDecoderLayer

TransformerEncoder

TransformerEncoderLayer

TripletMarginLoss

TripletMarginWithDistanceLoss

Unflatten

Unfold

Upsample

UpsamplingBilinear2D

UpsamplingNearest2D

utils

clip_grad_norm_

clip_grad_value_

parameters_to_vector

remove_weight_norm

spectral_norm

vector_to_parameters

weight_norm

ZeroPad2D

paddle.onnx

export

paddle.optimizer

Overview

Adadelta

Adagrad

Adam

Adamax

AdamW

Lamb

LBFGS

lr

CosineAnnealingDecay

CosineAnnealingWarmRestarts

CyclicLR

ExponentialDecay

InverseTimeDecay

LambdaDecay

LinearLR

LinearWarmup

LRScheduler

MultiplicativeDecay

MultiStepDecay

NaturalExpDecay

NoamDecay

OneCycleLR

PiecewiseDecay

PolynomialDecay

ReduceOnPlateau

StepDecay

Momentum

Optimizer

RMSProp

Rprop

SGD

paddle.profiler

Overview

export_chrome_tracing

export_protobuf

load_profiler_result

make_scheduler

Profiler

ProfilerState

ProfilerTarget

RecordEvent

SortedKeys

SummaryView

paddle.regularizer

L1Decay

L2Decay

paddle.signal

Overview

istft

stft

paddle.sparse

Overview

abs

add

addmm

asin

asinh

atan

atanh

cast

coalesce

deg2rad

divide

expm1

is_same_shape

isnan

log1p

masked_matmul

matmul

multiply

mv

neg

nn

BatchNorm

Conv3D

functional

attention

conv3d

leaky_relu

max_pool3d

relu

relu6

softmax

subm_conv3d

LeakyReLU

MaxPool3D

ReLU

ReLU6

Softmax

SubmConv3D

SyncBatchNorm

pca_lowrank

pow

rad2deg

reshape

sin

sinh

slice

sparse_coo_tensor

sparse_csr_tensor

sqrt

square

subtract

sum

tan

tanh

transpose

paddle.static

Overview

accuracy

append_backward

auc

BuildStrategy

CompiledProgram

cpu_places

create_global_var

cuda_places

data

default_main_program

default_startup_program

deserialize_persistables

deserialize_program

device_guard

Executor

ExponentialMovingAverage

global_scope

gradients

InputSpec

ipu_shard_guard

IpuCompiledProgram

IpuStrategy

load

load_from_file

load_inference_model

load_program_state

mlu_places

name_scope

nn

batch_norm

bilinear_tensor_product

case

cond

conv2d

conv2d_transpose

conv3d

conv3d_transpose

data_norm

deform_conv2d

embedding

fc

group_norm

instance_norm

layer_norm

multi_box_head

nce

prelu

row_conv

sequence_concat

sequence_conv

sequence_enumerate

sequence_expand

sequence_expand_as

sequence_first_step

sequence_last_step

sequence_pad

sequence_pool

sequence_reshape

sequence_reverse

sequence_scatter

sequence_slice

sequence_softmax

sequence_unpad

sparse_embedding

spectral_norm

static_pylayer

switch_case

while_loop

normalize_program

npu_places

Print

Program

program_guard

py_func

save

save_inference_model

save_to_file

scope_guard

serialize_persistables

serialize_program

set_ipu_shard

set_program_state

Variable

WeightNormParamAttr

xpu_places

paddle.sysconfig

get_include

get_lib

paddle.text

Overview

Conll05st

Imdb

Imikolov

Movielens

UCIHousing

viterbi_decode

ViterbiDecoder

WMT14

WMT16

paddle.utils

Overview

cpp_extension

CppExtension

CUDAExtension

get_build_directory

load

setup

deprecated

dlpack

from_dlpack

to_dlpack

download

get_weights_path_from_url

require_version

run_check

try_import

unique_name

generate

guard

switch

paddle.version

Overview

cuda

cudnn

show

xpu

xpu_xccl

paddle.vision

Overview

datasets

Cifar10

Cifar100

DatasetFolder

FashionMNIST

Flowers

ImageFolder

MNIST

VOC2012

get_image_backend

image_load

models

AlexNet

alexnet

DenseNet

densenet121

densenet161

densenet169

densenet201

densenet264

googlenet

GoogLeNet

inception_v3

InceptionV3

LeNet

mobilenet_v1

mobilenet_v2

mobilenet_v3_large

mobilenet_v3_small

MobileNetV1

MobileNetV2

MobileNetV3Large

MobileNetV3Small

ResNet

resnet101

resnet152

resnet18

resnet34

resnet50

resnext101_32x4d

resnext101_64x4d

resnext152_32x4d

resnext152_64x4d

resnext50_32x4d

resnext50_64x4d

shufflenet_v2_swish

shufflenet_v2_x0_25

shufflenet_v2_x0_33

shufflenet_v2_x0_5

shufflenet_v2_x1_0

shufflenet_v2_x1_5

shufflenet_v2_x2_0

ShuffleNetV2

SqueezeNet

squeezenet1_0

squeezenet1_1

VGG

vgg11

vgg13

vgg16

vgg19

wide_resnet101_2

wide_resnet50_2

ops

box_coder

decode_jpeg

deform_conv2d

DeformConv2D

distribute_fpn_proposals

generate_proposals

nms

prior_box

psroi_pool

PSRoIPool

read_file

roi_align

roi_pool

RoIAlign

RoIPool

yolo_box

yolo_loss

set_image_backend

transforms

adjust_brightness

adjust_contrast

adjust_hue

affine

BaseTransform

BrightnessTransform

center_crop

CenterCrop

ColorJitter

Compose

ContrastTransform

crop

erase

Grayscale

hflip

HueTransform

normalize

Normalize

Pad

pad

perspective

RandomAffine

RandomCrop

RandomErasing

RandomHorizontalFlip

RandomPerspective

RandomResizedCrop

RandomRotation

RandomVerticalFlip

Resize

resize

rotate

SaturationTransform

to_grayscale

to_tensor

ToTensor

Transpose

vflip

贡献指南

概述

代码贡献流程

新增 API 开发&提交流程

贡献前阅读

开发 API Python 端

开发 C++ 算子

API 设计和命名规范

API 文档书写规范

API 单测开发及验收规范

算子性能优化 提交流程

算子性能优化 方法介绍

算子性能优化 验收规范

Kernel Primitive API

API 介绍

API 介绍 - IO

API 介绍 - Compute

API 介绍 - OpFunc

API 示例

示例 - ElementwiseAdd

示例 - Reduce

示例 - Model

算子数据类型扩展 提交流程

算子数据类型扩展 验收规范

低精度算子开发贡献指南

低精度算子支持开发规范

低精度算子单测开发规范

曙光开发指南

曙光智算平台-Paddle 源码编译和单测执行

Paddle 适配 C86 加速卡详解

Paddle 框架下 ROCm(HIP)算子单测修复指导

硬件接入飞桨后端指南

硬件接入飞桨后端方案介绍

训练硬件 Custom Device 接入方案介绍

自定义 Runtime

数据类型

Device 接口

Memory 接口

Stream 接口

Event 接口

集合通讯接口

Profiler 接口

自定义 Kernel

Kernel 函数声明

Kernel 实现接口

Context API

Tensor API

Exception API

Kernel 注册接口

新硬件接入示例

文档贡献指南

规范和参考信息

代码规范

报错信息文案书写规范

代码风格检查指南

Paddle CI 测试详解

Python 文档示例代码书写规范

常见问题与解答

2.0 升级常见问题

安装常见问题

数据及其加载常见问题

组网、训练、评估常见问题

模型保存常见问题

参数调整常见问题

分布式训练常见问题

其他常见问题

2.6.0 Release Note

BatchNorm

参数

返回

代码示例

»

BatchNorm

在 GitHub 上修改

BatchNorm¶

class

paddle.nn.

BatchNorm

(

num_channels,

act=None,

is_test=False,

momentum=0.9,

epsilon=1e-05,

param_attr=None,

bias_attr=None,

dtype='float32',

data_layout='NCHW',

in_place=False,

moving_mean_name=None,

moving_variance_name=None,

do_model_average_for_mean_and_var=False,

use_global_stats=False,

trainable_statistics=False

)

[源代码]

构建 BatchNorm 类的一个可调用对象,具体用法参照 代码示例。其中实现了批归一化层(Batch Normalization Layer)的功能,可用作卷积和全连接操作的批归一化函数,根据当前批次数据按通道计算的均值和方差进行归一化。更多详情请参考:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

当 use_global_stats = False 时,\(\mu_{\beta}\) 和 \(\sigma_{\beta}^{2}\) 是 minibatch 的统计数据。计算公式如下:

\[\begin{split}\mu_{\beta} &\gets \frac{1}{m} \sum_{i=1}^{m} x_i \quad &// mini-batch-mean \\ \sigma_{\beta}^{2} &\gets \frac{1}{m} \sum_{i=1}^{m}(x_i - \mu_{\beta})^2 \quad &// mini-batch-variance \\\end{split}\]

\(x\):批输入数据

\(m\):当前批次数据的大小

当 use_global_stats = True 时,\(\mu_{\beta}\) 和 \(\sigma_{\beta}^{2}\) 是全局(或运行)统计数据(moving_mean 和 moving_variance),通常来自预先训练好的模型。计算公式如下:

\[\begin{split}moving\_mean = moving\_mean * momentum + \mu_{\beta} * (1. - momentum) \quad &// global mean \\ moving\_variance = moving\_variance * momentum + \sigma_{\beta}^{2} * (1. - momentum) \quad &// global variance \\\end{split}\]

归一化函数公式如下:

\[\begin{split}\hat{x_i} &\gets \frac{x_i - \mu_\beta} {\sqrt{\sigma_{\beta}^{2} + \epsilon}} \quad &// normalize \\ y_i &\gets \gamma \hat{x_i} + \beta \quad &// scale-and-shift \\\end{split}\]

\(\epsilon\):添加较小的值到方差中以防止除零

\(\gamma\):可训练的比例参数

\(\beta\):可训练的偏差参数

参数¶

num_channels (int) - 指明输入 Tensor 的通道数量。

act (str,可选) - 应用于输出上的激活函数,如 tanh、softmax、sigmoid,relu 等,支持列表请参考 激活函数,默认值为 None。

is_test (bool,可选) - 指示是否在测试阶段,非训练阶段使用训练过程中统计到的全局均值和全局方差。默认值:False。

momentum (float,可选) - 此值用于计算 moving_mean 和 moving_var。默认值:0.9。更新公式如上所示。

epsilon (float,可选) - 为了数值稳定加在分母上的值。默认值:1e-05。

param_attr (ParamAttr,可选) - 指定权重参数属性的对象。默认值为 None,表示使用默认的权重参数属性。具体用法请参见 ParamAttr 。

bias_attr (ParamAttr,可选) - 指定偏置参数属性的对象。默认值为 None,表示使用默认的偏置参数属性。具体用法请参见 ParamAttr 。

dtype (str,可选) - 指明输入 Tensor 的数据类型,可以为 float32 或 float64。默认值:float32。

data_layout (str,可选) - 指定输入数据格式,数据格式可以为 "NCHW" 或 "NHWC",其中 N 是批大小,C 是通道数,H 是特征高度,W 是特征宽度。默认值为 "NCHW"。

in_place (bool,可选) - 指示 batch_norm 的输出是否可以复用输入内存。默认值:False。

moving_mean_name (str,可选) - moving_mean 的名称,存储全局均值。如果将其设置为 None, batch_norm 将随机命名全局均值;否则,batch_norm 将命名全局均值为 moving_mean_name。默认值:None。

moving_variance_name (string,可选) - moving_var 的名称,存储全局方差。如果将其设置为 None, batch_norm 将随机命名全局方差;否则,batch_norm 将命名全局方差为 moving_variance_name。默认值:None。

do_model_average_for_mean_and_var (bool,可选) - 指示是否为 mean 和 variance 做模型均值。默认值:False。

use_global_stats (bool,可选) – 指示是否使用全局均值和方差。在预测或测试模式下,将 use_global_stats 设置为 true 或将 is_test 设置为 true,这两种行为是等效的。在训练模式中,当设置 use_global_stats 为 True 时,在训练期间也将使用全局均值和方差。默认值:False。

trainable_statistics (bool,可选) - eval 模式下是否计算 mean 均值和 var 方差。eval 模式下,trainable_statistics 为 True 时,由该批数据计算均值和方差。默认值:False。

返回¶

代码示例¶

>>> import paddle.base as base

>>> import paddle.nn as nn

>>> from paddle.base.dygraph.base import to_variable

>>> import numpy as np

>>> x = np.random.random(size=(3, 10, 3, 7)).astype('float32')

>>> with base.dygraph.guard():

... x = to_variable(x)

... batch_norm = nn.layer.norm.BatchNorm(10)

... hidden1 = batch_norm(x)