##BN 简介

背景

批标准化(Batch Normalization )简称BN算法,是为了克服神经网络层数加深导致难以训练而诞生的一个算法。根据ICS理论,当训练集的样本数据和目标样本集分布不一致的时候,训练得到的模型无法很好的泛化。

而在神经网络中,每一层的输入在经过层内操作之后必然会导致与原来对应的输入信号分布不同,并且前层神经网络的增加会被后面的神经网络不对的累积放大。这个问题的一个解决思路就是根据训练样本与目标样本的比例对训练样本进行一个矫正,而BN算法(批标准化)则可以用来规范化某些层或者所有层的输入,从而固定每层输入信号的均值与方差。

使用方法

批标准化一般用在非线性映射(激活函数)之前,对y= Wx + b进行规范化,是结果(输出信号的各个维度)的均值都为0,方差为1,让每一层的输入有一个稳定的分布会有利于网络的训练

在神经网络收敛过慢或者梯度爆炸时的那个无法训练的情况下都可以尝试
###优点

  • 减少了参数的人为选择,可以取消dropout和L2正则项参数,或者采取更小的L2正则项约束参数
  • 减少了对学习率的要求
  • 可以不再使用局部响应归一化了,BN本身就是归一化网络(局部响应归一化-AlexNet)
  • 更破坏原来的数据分布,一定程度上缓解过拟合

计算公式

其过程类似于归一化但是又不同.

参考

BN原理的详细参考建议:BN学习笔记:点击这里

BN with TF

组成部分

BN在TensorFlow中主要有两个函数:tf.nn.moments以及tf.nn.batch_normalization,两者需要配合使用,前者用来返回均值和方差,后者用来进行批处理(BN)

tf.nn.moments

TensorFlow中的函数

moments(x,axes,shift=None,name=None,keep_dims=False
)Returns:Two `Tensor` objects: `mean` and `variance`.

其中参数 x 为要传递的tensor,axes是个int数组,传递要进行计算的维度,返回值是两个张量: mean and variance,我们需要利用这个函数计算出BN算法需要的前两项,公式见前面的原理部分
参考代码如下:

# 计算Wx_plus_b 的均值与方差,其中axis = [0] 表示想要标准化的维度
img_shape= [128, 32, 32, 64]
Wx_plus_b = tf.Variable(tf.random_normal(img_shape))
axis = list(range(len(img_shape)-1)) # [0,1,2]
wb_mean, wb_var = tf.nn.moments(Wx_plus_b, axis)

运行结果,因为初始的数据是随机的,所以每次的运行结果并不一致:

*** wb_mean ***
[  1.05310767e-03   1.16801530e-03   4.95071337e-03  -1.50891789e-03-2.95298663e-03  -2.07848335e-03  -3.81800164e-05  -3.11688287e-033.26496479e-03  -2.68524280e-04  -2.08893605e-03  -3.05374013e-031.43721583e-03  -3.61034041e-03  -3.03616724e-03  -1.10225368e-036.14093244e-03  -1.37914100e-03  -1.13333750e-03   3.53972078e-03-1.48577197e-03   1.04353309e-03   3.27868876e-03  -1.40919012e-033.09609319e-03   1.98166977e-04  -5.25404140e-03  -6.03850756e-04-1.04614964e-03   2.90997117e-03   5.78491192e-04  -4.97420435e-043.03052540e-04   2.46527663e-04  -4.70882794e-03   2.79057049e-03-1.98713480e-03   4.13944060e-03  -4.80978837e-04  -3.90357309e-049.11145413e-04  -4.80215019e-03   6.26503082e-04  -2.76877987e-033.79961479e-04   5.36157866e-04  -2.12549698e-03  -5.41620655e-03-1.93006988e-03  -8.54363534e-05   4.97094262e-03  -2.45843385e-034.16610064e-03   2.44746287e-03  -4.15429426e-03  -6.64028199e-032.56747357e-03  -1.63110415e-03  -1.53350492e-03  -7.66420271e-04-1.81624549e-03   2.16634944e-03   1.74984348e-03  -4.17272677e-04]
*** wb_var ***
[ 0.99813616  0.9983741   1.00014114  1.0012747   0.99496585  1.001680021.00439012  0.99607879  1.00104094  0.99969071  1.01024568  0.996149061.00092578  0.99977148  1.00447345  0.99580348  0.99797201  0.991194311.00352168  0.9958936   0.99980813  1.00598109  1.00050855  0.996673170.99352562  1.0036608   0.99794698  0.99324805  0.99862647  0.999300480.99658304  1.00278556  0.99731135  1.00254881  0.99352133  1.003713971.00258803  1.00388253  1.00404358  0.99454063  0.99434716  1.000874521.00818515  1.00019705  0.99542576  1.00410056  0.99707311  1.002154231.00199771  0.99394888  0.9973973   1.00197709  0.99835181  0.999442760.99977624  0.99892712  0.99871159  0.99913275  1.00471914  1.002104520.99568754  0.99547535  0.99983472  1.00523198]**重点内容**

我们已经假设图片的shape[128, 32, 32, 64],它的运算方式如图:

tf.nn.batch_normalization

TensorFlow中的函数

batch_normalization(x,mean,variance,offset,scale,variance_epsilon,name=None
)

其中x为输入的tensor,mean,variance由moments()求出,而offset,scale一般分别初始化为0和1,variance_epsilon一般设为比较小的数字即可**,参考代码如下:**

scale = tf.Variable(tf.ones([64]))
offset = tf.Variable(tf.zeros([64]))
variance_epsilon = 0.001
Wx_plus_b = tf.nn.batch_normalization(Wx_plus_b, wb_mean, wb_var, offset, scale, variance_epsilon)# 根据公式我们也可以自己写一个
Wx_plus_b1 = (Wx_plus_b - wb_mean) / tf.sqrt(wb_var + variance_epsilon)
Wx_plus_b1 = Wx_plus_b1 * scale + offset
# 因为底层运算方式不同,实际上自己写的最后的结果与直接调用tf.nn.batch_normalization获取的结果并不一致

运行结果,因为初始的数据是随机的,所以每次的运行结果并不一致,但是本例子中的计算差异始终存在:

# 这里我们只需比较前两的矩阵即可发现存在的数值差异
[[[[  3.32006335e-01  -1.00865233e+00   4.68401730e-01 ...,-1.31523395e+00  -1.13771069e+00  -2.06656289e+00][  1.92613199e-01  -1.41019285e-01   1.03402412e+00 ...,1.66336447e-01   2.34183773e-01   1.18540943e+00][ -7.14844346e-01  -1.56187916e+00  -8.09686005e-01 ...,-4.23679769e-01  -4.32125211e-01  -3.35091174e-01]..., [[[[  3.31096262e-01  -1.01013660e+00   4.63186830e-01 ...,-1.31972826e+00  -1.13898540e+00  -2.05973744e+00][  1.91642866e-01  -1.42231822e-01   1.02848673e+00 ...,1.64460197e-01   2.32336998e-01   1.18214881e+00][ -7.16206789e-01  -1.56353664e+00  -8.14172268e-01 ...,-4.26598638e-01  -4.33694094e-01  -3.33635926e-01]

完整的代码

# - * - coding: utf - 8 -*-
#
# 作者:田丰(FontTian)
# 创建时间:'2017/8/2'
# 邮箱:fonttian@Gmaill.com
# CSDN:http://blog.csdn.net/fontthroneimport tensorflow as tf
import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 计算Wx_plus_b 的均值与方差,其中axis = [0] 表示想要标准化的维度
img_shape = [128, 32, 32, 64]
Wx_plus_b = tf.Variable(tf.random_normal(img_shape))
axis = list(range(len(img_shape) - 1))
wb_mean, wb_var = tf.nn.moments(Wx_plus_b, axis)scale = tf.Variable(tf.ones([64]))
offset = tf.Variable(tf.zeros([64]))
variance_epsilon = 0.001
Wx_plus_b0 = tf.nn.batch_normalization(Wx_plus_b, wb_mean, wb_var, offset, scale, variance_epsilon)# 根据公式我们也可以自己写一个
Wx_plus_b1 = (Wx_plus_b - wb_mean) / tf.sqrt(wb_var + variance_epsilon)
Wx_plus_b1 = Wx_plus_b1 * scale + offset
# 因为底层运算方式不同,实际上自己写的最后的结果与直接调用tf.nn.batch_normalization获取的结果并不一致with tf.Session() as sess:tf.global_variables_initializer().run()print('*** wb_mean ***')print(sess.run(wb_mean))print('*** wb_var ***')print(sess.run(wb_var))print('*** Wx_plus_b ***')print(sess.run(Wx_plus_b0))print('**** Wx_plus_b1 ****')print(sess.run(Wx_plus_b1))

3.1 Tensorflow: 批标准化(Batch Normalization)相关推荐

  1. 什么是批标准化 (Batch Normalization)

    为什么要数据标准化 (1)具有统一规格的数据, 能让机器学习更容易学习到数据之中的规律. (2)也是优化神经网络的一种方法 什么是批标准化 (Batch Normalization) Batch No ...

  2. Normalization 批标准化(batch normalization)理解

    数学是达成目的的工具, 理解才是达成目的桥梁, 所以这篇文章用浅显易懂的动画阐述了复杂的机器学习概念. 强烈推荐通过动画的形式了解. 所以首先放视频链接: Youtube 或者 优酷. 代码实现请来这 ...

  3. 偏差与方差、L1正则化、L2正则化、dropout正则化、神经网络调优、批标准化Batch Normalization(BN层)、Early Stopping、数据增强

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 3.2 深度学习正则化 3.2.1 偏差与方差 3.2.1.1 ...

  4. 批归一化(Batch Normalization)详解

    批归一化(Batch Normalization)详解 文章目录 批归一化(Batch Normalization)详解 前言 一.数据归一化 二.BN解决的问题:Internal Covariate ...

  5. 批归一化作用_批归一化Batch Normalization的原理及算法

    一.BN提出的背景意义 本文的背景文献是:<Batch Normalization: Accelerating Deep Network Training by Reducing Interna ...

  6. 批规范化 Batch Normalization

    batch normalization 就是对数据做批规范化,使得数据满足均值为0,方差为1的正太分布.其主要作用是缓解DNN训练中的梯度消失/爆炸现象,加快模型的训练速度.BN在2015年提出,论文 ...

  7. 批归一化作用_批归一化(Batch Normalization)

    论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift Inte ...

  8. batch normalization

    20210702 深度学习中的五种归一化(BN.LN.IN.GN和SN)方法简介 https://blog.csdn.net/u013289254/article/details/99690730 h ...

  9. PYTORCH批标准化

    1.标准化 传统机器学习中标准化也叫做归一化. 一般是将数据映射到指定的范围,用于去除不同维度数据的量纲以及量纲单位.数据标准化让机器学习模型看到的不同样本彼此之间更加相似,这有助于模型的学习与对新数 ...

最新文章

  1. 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要求字符串中的中文不能出现乱码
  2. css 命名规范 BEM
  3. (三)PHP网页架站
  4. .net core读取配置文件
  5. 对Coverage进行编辑
  6. 无法运行的愿意_分享减肥食谱一周瘦10斤,你愿意尝试吗?
  7. UITableView 系列三 :分类显示和改变外观 (实例)
  8. 上下双刘海设计感受下!夏普新旗舰亮相:骁龙855加持
  9. Servlet如何上传文件? 戳这里
  10. 资产管理界的风控大师-贝莱德BlackRock集团
  11. 手撕Boost!Boost公式推导及实验验证
  12. android远程协助
  13. 平面方程(Plane Equation)求解方法
  14. DTD语法 (元素、属性、实体声明)
  15. 【甲午大决战】2014年互联网10大战争
  16. 最新版X-Helios、X-Medusa、X-Ladon、X-Argus逆向与风控分析
  17. 红孩儿编辑器的详细设计第二部分
  18. rk3288 android6,RK3288 的 Android 7.1.2 来了!
  19. 优粮生活炒菜机器人_【O2O案例】优粮生活:一个餐饮人该有的产品精神
  20. 自己买监控摄像头容易安装吗

热门文章

  1. vue-router之路由属性配置说明(十)
  2. (1)计算机的组成及其功能
  3. Stack Overflow上最热门问题是什么?
  4. Nginx之windows下搭建
  5. Python中文分词--jieba的基本使用
  6. python flask flash消息闪现
  7. CentOS 7安装Nginx
  8. mac下简单绘图工具
  9. 一个高效的定时任务系统
  10. 从头搭建 IntelliJ IDEA 环境,从放弃到爱不释手!