边写代码边学习之批归一化(BatchNormalization)

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

1. 为什么要归一化

归一化(Normalization)是指将不同类型、不同取值范围等不同的数据按照一定的规则统一转化为相同的范围,使得数据在同一数值区间内比较、处理更加合理、有意义。归一化可以消除数据特征之间的量纲差异,使得每个特征在权重计算中起到相同的作用,同时还可以增加算法的收敛速度,提高模型的预测精度。

归一化的两种常用方法:

1. [0,1]归一化,使结果值映射到[0 ,1]之间。

2. 正态分布归一化,这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1.

  ,其中为均值,为方差。

2. BN解决的问题:Internal Covariate Shift

我们知道网络一旦训练起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。(你可以理解为连锁反应)我们把在训练过程中,网络中间层数据分布的改变称之为:“Internal Covariate Shift”。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况,即Internal Covariate Shift问题。
 

3. 我们为什么需要BN?

我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。

4. 理解BatchNormalization原理

一个标准的归一化步骤就是减均值除方差,那这种归一化操作有什么作用呢?我们观察下图

边写代码边学习之批归一化(BatchNormalization),学习,算法,人工智能

边写代码边学习之批归一化(BatchNormalization),学习,算法,人工智能

a中左图是没有经过任何处理的输入数据,曲线是sigmoid函数,如果数据在梯度很小的区域,那么学习率就会很慢甚至陷入长时间的停滞。减均值除方差后,数据就被移到中心区域如右图所示,对于大多数激活函数而言,这个区域的梯度都是最大的或者是有梯度的(比如ReLU),这可以看做是一种对抗梯度消失的有效手段。对于一层如此,如果对于每一层数据都那么做的话,数据的分布总是在随着变化敏感的区域,相当于不用考虑数据分布变化了,这样训练起来更有效率。

那么为什么要有第4步,不是仅使用减均值除方差操作就能获得目的效果吗?我们思考一个问题,减均值除方差得到的分布是正态分布,我们能否认为正态分布就是最好或最能体现我们训练样本的特征分布呢?不能,比如数据本身就很不对称,或者激活函数未必是对方差为1的数据最好的效果,比如Sigmoid激活函数,在-1~1之间的梯度变化不大,那么非线性变换的作用就不能很好的体现,换言之就是,减均值除方差操作后可能会削弱网络的性能!针对该情况,在前面三步之后加入第4步完成真正的batch normalization。

BN的本质就是利用优化变一下方差大小和均值位置,使得新的分布更切合数据的真实分布,保证模型的非线性表达能力。BN的极端的情况就是这两个参数等于mini-batch的均值和方差,那么经过batch normalization之后的数据和输入完全一样,当然一般的情况是不同的。

5. BN怎么做?

边写代码边学习之批归一化(BatchNormalization),学习,算法,人工智能

算法过程:

沿着通道计算每个batch的均值u
沿着通道计算每个batch的方差σ^2
对x做归一化,x’=(x-u)/开根号(σ^2+ε)
加入缩放和平移变量γ和β ,归一化后的值,y=γx’+β
加入缩放平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。
 

import numpy as np
def Batchnorm(x, gamma, beta, bn_param):
    # x_shape:[B, C, H, W]
    running_mean = bn_param['running_mean']
    running_var = bn_param['running_var']
    results = 0.
    eps = 1e-5

    x_mean = np.mean(x, axis=(0, 2, 3), keepdims=True)
    x_var = np.var(x, axis=(0, 2, 3), keepdims=True0)
    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

用keras 的代码调用. BatchNormalization调用要在激活函数之前和每一层之后。文章来源地址https://www.toymoban.com/news/detail-627601.html

from keras.models import Sequential
from keras.layers import Dense, BatchNormalization, Activation

model = Sequential()
model.add(Dense(64, input_shape=(input_shape,)))  # Input layer
model.add(BatchNormalization())  # BatchNormalization layer
model.add(Activation('relu'))  # Activation function (ReLU in this case)

到了这里,关于边写代码边学习之批归一化(BatchNormalization)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Qt】边学边写之Qt教程(零基础)

    打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项 弹出New Project对话框,选择Qt Widgets Application, 选择【Choose】按钮,弹出如下对话框 设置项目名称和路径,按照向导进行下一步, 选择编译套件 向导会默认添加一个继承自QMainWindow的类,可

    2024年01月23日
    浏览(39)
  • 用通俗易懂的方式讲解:数据预处理归一化(附Python代码)

    本文来自技术群小伙伴的分享,想加入按照如下方式 目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友 方式①、添加微信号:dkl88191,备注:来自CSDN+技术交流 方式②、微信搜索公众号:Python学习与数据挖掘,后

    2023年04月10日
    浏览(38)
  • 写点东西《边学边写7 种常见的攻击前端的安全性攻击》

    随着网络应用程序对业务运营变得越来越关键,它们也成为网络攻击更具吸引力的目标。但不幸的是,许多网络开发人员在构建安全前端方面落后于他们的后端和 DevOps 同行。这种差距增加了破坏性数据泄露的风险。 最近发生的事件,例如 Balancer Protocol 漏洞,揭示了攻击者在

    2024年02月02日
    浏览(44)
  • matlab中数据归一化方法,矩阵归一化

    matlab中数据一行归一化 默认的map范围是[-1, 1],所以如果需要[0, 1],则按这样的格式提供参数 Data1 = mapminmax(lData, 0, 1); 矩阵归一化

    2024年02月12日
    浏览(51)
  • 【代码已开源】基于Python的全切片(WSI)染色归一化工具,实现了reinhard, macenko, vahadane共三种方法

    为了应对数字病理切片受到不同中心、不同扫描设备的影响,先后有不同的研究提出了针对病理图像的染色归一化(stain normalization)方法。本仓库对三种染色归一化方式进行了封装,针对常见的病理图片处理流程实现了染色归一化工具 https://github.com/HaoyuCui/WSI_Normalizer Reinha

    2024年02月02日
    浏览(43)
  • 【Pytorch基础知识】数据的归一化和反归一化

    一张正常的图,或者说是人眼习惯的图是这样的: 但是,为了 神经网络更快收敛 ,我们在深度学习网络过程中 通常需要将读取的图片转为tensor并归一化 (此处的归一化指 transforms .Normalize()操作)输入到网络中进行系列操作。 如果将转成的tensor再直接转为图片,就会变成下

    2023年04月09日
    浏览(82)
  • 深度学习基础入门篇[七]:常用归一化算法、层次归一化算法、归一化和标准化区别于联系、应用案例场景分析。

    【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、

    2024年02月13日
    浏览(45)
  • 深度学习基本理论下篇:(梯度下降/卷积/池化/归一化/AlexNet/归一化/Dropout/卷积核)、深度学习面试

    深度学习面试必备 1:(MLP/激活函数/softmax/损失函数/梯度/梯度下降/学习率/反向传播/深度学习面试 深度学习面试必备 2:(梯度下降/卷积/池化/归一化/AlexNet/归一化/Dropout/卷积核/深度学习面试 深度学习面试必备 3 :物体检测(Anchor base/NMS/softmax/损失函数/BCE/CE/zip) Momentum、

    2024年02月12日
    浏览(49)
  • 不要再搞混标准化与归一化啦,数据标准化与数据归一化的区别!!

    数据的标准化是将数据按照一定的 数学规则进行转换 ,使得数据满足特定的标准,通常是使数据满足正态分布或标准差为1的标准。 标准化的常见方法包括 最小-最大标准化 和 Z-score标准化 。最小-最大标准化将数据映射到 [0,1 ]的范围内,最小-最大标准化将数据映射到0-1区间

    2024年01月21日
    浏览(54)
  • 归一化(Normalization)

    归一化是一种数据处理方式,能将数据经过处理后限制在某个固定范围内。 归一化存在两种形式,一种是在通常情况下,将数处理为 [0, 1] 之间的小数,其目的是为了在随后的数据处理过程中更便捷。例如,在图像处理中,就会将图像从 [0, 255] 归一化到 [0, 1]之间,这样既不

    2024年02月07日
    浏览(93)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包