CV-BN

article/2025/10/6 17:47:09

what

Normalization是数据标准化(归一化,规范化),Batch 可以理解为批量,加起来就是批量标准化。

和卷积层,激活层,全连接层一样,BN层也是属于网络中的一层,常见排列 conv -> BN ->relu。

why

BN算法的强大之处在下面几个方面:

可以选择较大的学习率,使得训练速度增长很快,具有快速收敛性。

可以不去理会Dropout,L2正则项参数的选择,如果选择使用BN,甚至可以去掉这两项。

去掉局部响应归一化层。(AlexNet中使用的方法,BN层出来之后这个就不再用了)

关于归一化,神经网络训练开始前,都要对数据做一个归一化处理,原因是:

1、网络学习的过程的本质就是学习数据分布,一旦训练数据和测试数据的分布不同,那么网络的泛化能力就会大大降低;

2、每一批次的数据分布如果不相同的话,那么网络就要在每次迭代的时候都去适应不同的分布,这样会大大降低网络的训练速度,这也就是为什么要对数据做一个归一化预处理的原因;

3、另外对图片进行归一化处理还可以处理光照,对比度等影响。

网络一旦训练起来,参数就要发生更新,出了输入层的数据外,其它层的数据分布是一直发生变化的,BN就是为了解决这个问题的。在每一层输入的时候,在加一个预处理多好。比如归一化到均值为0,方差为1,然后再送入输入进行学习:

但这样简单的归一化是的网络学习的特征被破坏,所以做了一些改进:变换重构,引入了可以学习的参数,这就是算法的关键之处:这两个希腊字母就是要学习的:

这样的时候可以恢复出原始的某一层学习到的特征的,因此我们引入这个可以学习的参数使得我们的网络可以恢复出原始网络所要学习的特征分布,最后BN层的前向传导公式为:

how

输入:输入数据x1…xm(这些数据是准备进入激活函数的数据)

计算过程中可以看到,

1.求数据均值

2.求数据方差

3.数据进行标准化(个人认为称作正态化也可以)

4.训练参数γ,β

5.输出y通过γ与β的线性变换得到新的值

在正向传播的时候,通过可学习的γ与β参数求出新的分布值

在反向传播的时候,通过链式求导方式,求出γ与β以及相关权值

代码

Python实现,使用类似pytorch的框架时发现,由于每个mini-batch中的数据是不同的,所以需要统计整个数据集中的均值和方差需要动态的追踪各个mini-batch,动态统计方式如下:

在测试阶段,不再更新BN层,直接使用之前的统计结果。

因为BN计算过程中需要保存running_mean和running_var,以及更新动量momentum和防止数值计算错误的eps,所以需要设计为类。

# -*- coding:utf-8 -*-
import numpy as np
from matplotlib import pyplotclass MyBN:def __init__(self, momentum, eps, num_features):"""初始化参数值:param momentum: 追踪样本整体均值和方差的动量:param eps: 防止数值计算错误:param num_features: 特征数量"""# 对每个batch的mean和var进行追踪统计self._running_mean = 0self._running_var = 1# 更新self._running_xxx时的动量self._momentum = momentum# 防止分母计算为0self._eps = eps# 对应论文中需要更新的beta和gamma,采用pytorch文档中的初始化值self._beta = np.zeros(shape=(num_features, ))self._gamma = np.ones(shape=(num_features, ))def batch_norm(self, x):"""BN向传播:param x: 数据:return: BN输出"""x_mean = x.mean(axis=0)x_var = x.var(axis=0)# 对应running_mean的更新公式self._running_mean = (1-self._momentum)*x_mean + self._momentum*self._running_meanself._running_var = (1-self._momentum)*x_var + self._momentum*self._running_var# 对应论文中计算BN的公式x_hat = (x-x_mean)/np.sqrt(x_var+self._eps)y = self._gamma*x_hat + self._betareturn y

注意(BN 在CNN的实现):

1、全连接层和卷积层的BN是不太一样的(分别是在什么维度上求均值方差)

1)上面所说的是BN对于每一个神经元都做处理,对于卷积神经网络来说呢?比如某一层卷积层的维度是:100 * 100 * 6,如果对每一个神经元都进行BN的话,那就需要600万的参数,这是相当恐怖的,所以其实卷积神经网络使用BN的时候,也做了权重共享的策略,把一张特征图当做一个神经元来处理。

比如某层的特征维度是[n,c,h,w],分别是batch_num:n,维度: c,特征尺寸h,w。CNN中可把每个特征图看成是一个特征处理(神经元),因此在使用BN的时候,Mini-batch size的大小就是c * h * w,对于每一个特征图只有一对科学系的参数。说白了,就是相当于求所有样本(batch_num:n个)所对应的的一个特征图的所有神经元的平均值和方差,然后对这一个神经元做归一化。

2)FC层就是对每一个神经元求,不同于CNN。

2、训练和预测时的BN是不一样的

训练的时候是每个训练iter都要去计算均值,测试是直接使用全局的均值(这个全局的均值是每次训练1iteration都会使用移动平均法迭代地更新一个全局的值,训练结束后就先相当于使用全量训练数据产生了一个全局的固定值了)。

BN LN IN GN 区别

注意上图由于为了好展示(将H和W维度合并,不然的话是四维NCHW,现在降低为三维NC(HW合并))

可以看出,除了BN作用于N维度,其他都不在N维度。

可以粗略的进行如下总结:

BN是最传统的,如果batchsize允许够大的话,用在CNN中的效果依然是最好的;LN适合RNN;IN适合图像风格化任务;GN更适合小batchsize的CNN训练。

参考链接:

1、https://zhuanlan.zhihu.com/p/100672008

2、https://blog.csdn.net/Fate_fjh/article/details/53375881

3、https://zhuanlan.zhihu.com/p/115949091


http://chatgpt.dhexx.cn/article/fgmQ06fO.shtml

相关文章

BN算法

Motivation 2015年的论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》阐述了BN算法,这个算法目前已经被大量应用,很多论文都会引用这个算法,进行网络训练,可见其强大之处…

BN使用总结及启发

声明:文章仅作知识整理、分享,如有侵权请联系作者删除博文,谢谢! Batch Normalization视神经网络的经典结构,本文对BN的引入,训练、推理过程及BN的特性,进行整理。 1、数据预算处理&#xff0…

Batch Normalization (BN)简洁介绍

提出BN的文献: Ioffe, S., & Szegedy, C. (2015). Batch normalization: Accelerating deep network training by reducing internal covariate shift. 32nd International Conference on Machine Learning, ICML 2015, 1, 448–456. Batch Normalization&…

PyTorch 源码解读之 BN SyncBN:BN 与 多卡同步 BN 详解

目录 1. BatchNorm 原理 2. BatchNorm 的 PyTorch 实现 2.1 _NormBase 类 2.1.1 初始化 2.1.2 模拟 BN forward 2.1.3 running_mean、running_var 的更新 2.1.4 \gamma, \beta 的更新 2.1.5 eval 模式 2.2 BatchNormNd 类 3. SyncBatchNorm 的 PyTorch 实现 3.1 for…

BN和LN

covariate shift 是分布不一致假设之下的分支问题,指源空间和目标空间的条件概率是一致的,但边缘概率不同;而统计机器学习中的经典假设是 “源空间(source domain)和目标空间(target domain)的数…

BN的理解

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

BN的作用

BN的作用一共有三个: 1 加速网络的收敛速度 2 控制了梯度消失的问题 3 防止过拟合 BN可以认为是在每一层的输入和上一层的输出之间加入一个计算层,对数据的分布进行额外的约束,从而增强模型的泛化能力。但是BN同时也降低了模型的拟合能力&am…

BN 层原理解析

1 训练数据为什么要和测试数据同分布? 看看下图,如果我们的网络在左上角的数据训练的,已经找到了两者的分隔面w,如果测试数据是右下角这样子,跟训练数据完全不在同一个分布上面,你觉得泛化能力能好吗&…

BN128曲线

1. 引言 BN系列椭圆曲线 E ( F p ) : y 2 x 3 b , 其 中 b ≠ 0 E(\mathbb{F}_p):y^2x^3b,其中b\neq 0 E(Fp​):y2x3b,其中b​0,由Paulo S. L. M. Barreto1 和 Michael Naehrig 在2005年论文 Pairing-Friendly Elliptic Curv…

【YOLO v4 相关理论】Normalization: BN、CBN、CmBN

一、Batch Normalization 论文:https://arxiv.org/pdf/1502.03167.pdf 源码: link. Batch Normalization是google团队在2015年论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的。 个人认为…

Betaflight BN880 GPS 简单测试

Betaflight BN880 GPS 简单测试 1. 源由2. 窗台对比测试3. 开阔区域测试3.1 GPS安装位置3.1.1 BN880 GPS 机尾打印支架 安装位置3.1.2 BN880 GPS 机头固定 安装位置3.1.3 M8N GPS 机尾打印支架 安装位置 3.2 M8N模块历史记录3.3 BN880模块第一次(机尾安装&#xff0…

BN(Batch Normalization):批量归一化

现在的神经网络通常都特别深,在输出层像输入层传播导数的过程中,梯度很容易被激活函数或是权重以指数级的规模缩小或放大,从而产生“梯度消失”或“梯度爆炸”的现象,造成训练速度下降和效果不理想。 随着训练的进行,…

通俗理解BN(Batch Normalization)

1. 深度学习流程简介 1)一次性设置(One time setup) - 激活函数(Activation functions) ​ - 数据预处理(Data Preprocessing) ​ - 权重初始化(Weight Initialization&#xff0…

为什么BN?batch normalization的原理及特点

1 什么是BN? 数据归一化方法,往往用在深度神经网络中激活层之前。其作用可以加快模型训练时的收敛速度,使得模型训练过程更加稳定,避免梯度爆炸或者梯度消失。并且起到一定的正则化作用,几乎代替了Dropout 2 原理 B…

【深度学习基础知识 - 07】BN的原理和作用

Batch Normalization也是深度学习中的一个高频词汇,这篇文章将会对其做一个简单介绍。 目录 1. BN的原理2. BN的作用3. BN层的可学习参数4. infer时BN的处理5. BN的具体计算步骤以及公式6. BN和L2参数权重正则化的区别 1. BN的原理 BN就是在激活函数接收输入之前对…

什么是BN(Batch Normalization)

什么是BN(Batch Normalization)? 在之前看的深度学习的期刊里,讲到了BN,故对BN做一个详细的了解。在网上查阅了许多资料,终于有一丝明白。 什么是BN? 2015年的论文《Batch Normalization: Accelerating Deep Networ…

深度学习—BN的理解(一)

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

Batch Normalization详解以及pytorch实验

Batch Normalization是google团队在2015年论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的。通过该方法能够加速网络的收敛并提升准确率。在网上虽然已经有很多相关文章,但基本都是摆上论文中的公式泛…

Java参数校验validation和validator区别

Java参数校验validation和validator区别 1. 参数校验概述2. validation与validator区别3. validation注解说明4. validator注解说明5. 日期格式化说明6. 实现验证6.1 引入依赖6.2 代码实现6.3 实现验证 1. 参数校验概述 常见的业务开发中无可避免的会进行请求参数校验&#xf…

hibernate-validator

validator 简介各种注解好处 validator.validate方法业务逻辑代码中检查传入的参数时为传入的参数类型中各个属性添加注解NotNull、NotBlank、NotEmpty间的区别 简介 validator,翻译过来,就是“验证器”的意思。它是一种注解式参数校验,包名…