深度学习(八) Batch Normalization

tensorflow中具有一个这样的方法,可以让我们归一化数据
# value表示输入的value,mean表示value的均值,variance表示方差,这两个参数用来计算value的normalization,eps:分母附加值,防止除以方差时出现除0操作,默认为1e-5
# beta,gamma会在训练时进行学习
tf.nn.batch_normalization(value, mean, variance, beta, gamma, 1e-5)
我们在训练的时候,方差和均值,需要记录一个影子变量,这个影子变量用来当输入测试集的时候,只有单一的数据,没有均值和方差(在训练的时候,是一个batch的输入,具有均值和方差),利用影子变量来记算均值和方差。影子变量可以参考这篇博客。
具体代码数据归一层的代码如下:
"""
参考 https://www.cnblogs.com/cloud-ken/p/7521609.html
加入这个衰减率的原因是为了预测下一次的方差和均值,因为当输入测试集的时候,我们要给他均值和方差,只有一个数据,没有均值和方差,在输入训练集的时候是一个batch的输入,具有均值和方差
所以使用影子变量来记录均值和方差,
所以这里分训练和不训练,为了让归一化更好,与其说是让归一化更好,实际上时,为了让输入的数据的均值和方差,更加趋向我们的测试数据分布,使其测试率更加准确。
shadow_variable = decay * shadow_variable + (1 - decay) * updated_model_variable
"""
# 数据归一化 为了提高学习率,使得数据的均值为0,方差为1,最后加入beta和gamma来还原数据分布
def batch_norm(value, is_train=True, name='batch_norm',
epsilon=1e-5, momentum=0.9):
with tf.variable_scope(name): # tf.train.ExponentialMovingAverage用于更新参数,参数越大,模型越稳定
ema = tf.train.ExponentialMovingAverage(decay=momentum) # value.get_shape().as_list()[-1] 获取value最后一维的大小
shape = value.get_shape().as_list()[-1]
#print(value,shape) # 这里加入beta和gamma的意思就是让经过归一化的数据趋近于输入时候的分布,公式中的那两个参数,这两个参数为利用梯度下降进行学习
beta = bias('beta', [shape], bias_start=0.0)
gamma = bias('gamma', [shape], bias_start=1.0) if is_train:
# 求均值和方差
batch_mean, batch_variance = tf.nn.moments(value, [0, 1, 2], name='moments')
# 定义影子变量的名字,方便以后进行调用
moving_mean = bias('moving_mean', [shape], 0.0, False)
moving_variance = bias('moving_variance', [shape], 1.0, False) # 进行衰减,不使用原来的变量,衰减均值和方差
with tf.variable_scope(tf.get_variable_scope(), reuse=False):
# 进行计算影子变量
ema_apply_op = ema.apply([batch_mean, batch_variance]) # ema.average获取影子变量(也叫滑动平均值),把移动的平均分配给moving_mean bias值,相当于平均移动多少 assign为重新赋值的操作
assign_mean = moving_mean.assign(ema.average(batch_mean))
assign_variance = moving_variance.assign(ema.average(batch_variance)) """
tf.control_dependencies指定某些操作执行的依赖关系,control_dependencies(control_input)返回一个控制依赖的上下文管理器,
使用with关键字可以让在这个上下文环境中的操作都在ema_apply_op执行,control_input必须是一个list,使用[]是将ema_apply_op
转换为一个list
"""
# 这里也可以不在计算影子变量后执行
with tf.control_dependencies([ema_apply_op]):
# 这里加tf.identity的作用的是加入一个op,如果不加一个op的话,这里这个控制依赖就无法执行,因为tf.control_dependencies定义的是op的执行顺序
mean, variance = tf.identity(batch_mean), tf.identity(batch_variance) """
这里为什么要在这后面执行,因为这里要记录影子变量,为什么能记录,因为在一个variable_scope下面,到时候调用这个variable_scope的名字,可以直接调用这个变量
然后才返回数据归一化后的结果
"""
with tf.control_dependencies([assign_mean, assign_variance]):
# value表示输入的value,mean表示value的均值,variance表示方差,这两个参数用来计算value的normalization,eps:分母附加值,防止除以方差时出现除0操作,默认为1e-5
# beta,gamma会在训练时进行学习
return tf.nn.batch_normalization(value, mean, variance, beta, gamma, 1e-5) else:
mean = bias('moving_mean', [shape], 0.0, False)
variance = bias('moving_variance', [shape], 1.0, False) return tf.nn.batch_normalization(
value, mean, variance, beta, gamma, epsilon)
深度学习(八) Batch Normalization的更多相关文章
- 深度学习中 Batch Normalization
深度学习中 Batch Normalization为什么效果好?(知乎) https://www.zhihu.com/question/38102762
- 深度学习之Batch Normalization
在机器学习领域中,有一个重要的假设:独立同分布假设,也就是假设训练数据和测试数据是满足相同分布的,否则在训练集上学习到的模型在测试集上的表现会比较差.而在深层神经网络的训练中,当中间神经层的前一层参数 ...
- 深度学习中 Batch Normalization为什么效果好
看mnist数据集上其他人的CNN模型时了解到了Batch Normalization 这种操作.效果还不错,至少对于训练速度提升了很多. batch normalization的做法是把数据转换为0 ...
- 深度学习中batch normalization
目录 1 Batch Normalization笔记 1.1 引包 1.2 构建模型: 1.3 构建训练函数 1.4 结论 Batch Normalization笔记 我们将会用MNIST数 ...
- zz详解深度学习中的Normalization,BN/LN/WN
详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ...
- 深度学习中的Normalization模型
Batch Normalization(简称 BN)自从提出之后,因为效果特别好,很快被作为深度学习的标准工具应用在了各种场合.BN 大法虽然好,但是也存在一些局限和问题,诸如当 BatchSize ...
- [优化]深度学习中的 Normalization 模型
来源:https://www.chainnews.com/articles/504060702149.htm 机器之心专栏 作者:张俊林 Batch Normalization (简称 BN)自从提出 ...
- 深度学习之Batch归一化
前言 以下内容是个人学习之后的感悟,转载请注明出处~ Batch归一化 在神经网络中,我们常常会遇到梯度消失的情况,比如下图中的sigmod激活函数,当离零点很远时,梯度基本为0 ...
- 关于深度学习之中Batch Size的一点理解(待更新)
batch 概念:训练时候一批一批的进行正向推导和反向传播.一批计算一次loss mini batch:不去计算这个batch下所有的iter,仅计算一部分iter的loss平均值代替所有的. 以下来 ...
- 算法工程师<深度学习基础>
<深度学习基础> 卷积神经网络,循环神经网络,LSTM与GRU,梯度消失与梯度爆炸,激活函数,防止过拟合的方法,dropout,batch normalization,各类经典的网络结构, ...
随机推荐
- Oracle EBS不能正常启动的解决方案 > Jinitiator 乱码
问题1:使用IE浏览器(IE6 IE7 IE8)可以登录EBS,但在打开EBS的WIN Form界面里,IE自动关闭或报错,或是卡住不动 原因1: oracle EBS自带安装的JInitiator ...
- 在github创建用户
在Github注册账户 第一个是创建用户名,第二个是填写邮箱,第三个是设置密码 进入给github会让你选择账户类型 第二步完成后会让你完成邮箱的验证 验证完邮箱以后此时就验证成功了点击绿色的 let ...
- 搬家至独立博客 https://www.imzjy.com/blog/
欢迎访问 https://www.imzjy.com/blog/
- Centos7下修复 视频播放器(先 安装VLC视频播放器)
用最新的CentOS7发现没有视频播放器,于是在http://pkgs.org/上查找,发现了nux dextop仓库上有, 于是到他的官网上http://li.nux.ro/repos.html查了 ...
- WindowsPhone模拟简易Toast弹出框
Coding4Fun这个开源控件中有ToastPrompt这个弹出框组件,但是由于Coding4Fun太庞大,如果只用到ToastPrompt这个控件的话,整个引用不太值当的.于是自己写了一个差不多的 ...
- 如何给LOJ补全special judge
首先你要会写一个叫$data.yml$的东西, 这里面记录了这道题的$subtask$计分策略 也告诉了评测姬这道题是提交答案还是$spj$还是交互题 那么,$YAML$语言是啥啊? 别问我,我也不会 ...
- [文文殿下]基本的DP技巧
. 二进制状态压缩动态规划 对于某些情况,如果题目中所给的限制数目比较小,我们可以尝试状态压缩动态规划.例如,题目中给出数据范围\(n<=20\),这个一般情况下是一个状压DP的提示. 状态压缩 ...
- BZOJ2961: 共点圆(CDQ分治+凸包)
题面 传送门 题解 这题解法真是多啊--据说可以圆反演转化为动态插入半平面并判断给定点是否在半平面交中,或者化一下改成给定点判断是否所有点都在某一个半平面内-- 鉴于圆反演我也不会,这里讲一下直接推的 ...
- x == (x = y) 不等于 (x = y) == x ?
简评:不瞒你说,我现在数数都是从 0 开始数的,整数是 1024. 有这么一个 Java 程序: class Quirky { public static void main(String[] arg ...
- GitHub创建项目,保存代码。
平时学习会写一些代码,虽然只是零零散散的功能,但是基本都是在一个项目下操作,偶尔会忘记代码编辑顺序.国庆这几天在家,想把GitHub用起来,实现自己代码的可追溯,可查询.学习本篇博客,你需要一点的Gi ...