对tensorflow 的BatchNormalization的坑的理解与测试

TensorFlow开发者认证考试实战指南:工程规范与沙箱避坑 TensorFlow开发者认证并非理论知识测验,而是面向工业级AI工程实践的能力验证。它聚焦于tf.data流水线构建、Keras模型结构规范、GPU沙箱环境适配等核心工程能力,强调在受限资源(如8GB显存)、封闭环境和严格版本约束(TF 2.7.x)下实现可复现、可部署、抗干扰的端到端解决方案。考试本质是检验开发者对TensorFlow最佳实践的肌肉记忆——从数据加载顺序、BatchNormalization位置,到GlobalAveragePooling2D强制使用,每一处都映射真实生产场景的技术决策逻 阅读详情

tensorflow 的 BatchNormalization的常见的坑

1. 在训练时设置批标准化的参数 training = True, 执行测试时设置  training = False

2. 在训练时,要用 tf.control_dependencies 添加对批标准化的“update_ops”的依赖控制,先执行批标准化的“update_ops”,然后后再进行当前次的迭代训练。

         注:1)批标准化的“update_ops”主要是指两个滑动平均操作,一个用于计算均值,一个用于计算方差。

                2) tensorflow中有多个实现批标准化的函数,有的会自动把“update_ops”放入tf.GraphKeys.UPDATE_OPS 这个collection中,有的则不会,比如tf.keras.layers.BatchNormalization, 此时需要手动把“update_ops”放入tf.GraphKeys.UPDATE_OPS中。

                3)如果在训练时没有添加 tf.control_dependencies:如果不在使用时添加tf.control_dependencies函数,即在训练时(training=True)每批次时只会计算当批次的mean和var,并传递给tf.nn.batch_normalization进行归一化,由于mean_update和variance_update在计算图中并不在上述操作的依赖路径上,因为并不会主动完成,也就是说,在训练时mean_update和variance_update并不会被使用到,其值一直是初始值。因此在测试阶段(training=False)使用这两个作为mean和variance并进行归一化操作,这样就会出现错误。而如果使用tf.control_dependencies函数,会在训练阶段每次训练操作执行前被动地去执行mean_update和variance_update,因此moving_mean和moving_variance会被不断更新,在测试时使用该参数也就不会出现错误。

3. 批标准化层会带来4个新的变量,但是这四个变量不是trainable的,而且这四个变量在测试阶段要会用到,因此,在保存模型时要设置 saver = tf.train.Saver(var_list=tf.global_variables()), 即保存所有全局变量,而不是仅仅保存可训练的变量。

4. BN层模型pb转化为tflite时, 我暂时没遇到,具体可参考:BN层模型pb转化为tflite时

5. 训练时不要设置batchsize=1,当batch_size = 1时,batch_norm实际上是instance_norm.由于训练时的batch_size太小,导致滑动平均值不稳定,因为使用滑动平均值去测试效果不好.

6. 批标准化的位置放在激活函数之前


1. tf.control_dependencies

该函数的作用是:在执行其辖区的命令之前,先确保辖区命令依赖的节点被率先执行。辖区命令依赖的节点被作为参数放在tf.control_dependencies的参数位置。请看下面一个例子。

import tensorflow as tf

a = tf.Variable(1)
b = tf.Variable(2)
update_op = tf.assign(a, 10) # 赋值操作,改变变量 a_1 的数值

# 添加依赖控制 # 该命令的参数是被依赖的计算节点,只有当被依赖的节点被执行后才能执行该命令辖区内的操作,
with tf.control_dependencies([update_op]): # 添加了对 update_op 的依赖,执行辖区命令时,要先执行 update_op 节点
# with tf.control_dependencies([]):        # 未添加对 update_op 的依赖,执行辖区命令时,不会调用执行 update_op 节点
	c = tf.add(a, b)


with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())
	
	a,b,c= sess.run([a,b,c])
	
	print("a={}  b={}  c={}".format(a,b,c))
	
"""
实验结果:
1)当添加了对 update_op 的依赖时(执行 with tf.control_dependencies([update_op]) ),输出结果为:
a=10  b=2  c=12

2)当未添加对 update_op 的依赖时(执行 with tf.control_dependencies([]):),输出结果为:
a=1  b=2  c=3

结果分析:
虽然在图的搭建过程中定义了 update_op = tf.assign(a, 10) 节点,但是tensorflow的图的运行并不是按命令行的顺序执行的。
如果c = tf.add(a, b) 操作没有对节点 update_op 添加依赖,那么在执行 c = tf.add(a, b)时,update_op 不会被主动调用。

tf.control_dependencies 就是解决了这个问题。

"""

2. tf.GraphKeys.UPDATE_OPS 

tf.GraphKeys.UPDATE_OPS 是一个tensorflow的计算图中内置的一个集合,该集合会保存一些需要在训练操作之前完成的操作,一般配合tf.control_dependencies函数使用。

比如,在批标准化中,存在两个变量:mean和variance,这两个值是随着迭代的进行不断更新的,因此在执行每次迭代之前,需要先计算mean和variance。通过下面一个例子介绍tf.layers.batch_normalization产生的mean和variance。

import tensorflow as tf

input = tf.ones([1, 2, 2, 3])
output = tf.layers.batch_normalization(input, training=True)
#output = tf.layers.batch_normalization(input, training=False)

# 打印batch_normalization中的两个操作
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
print(update_ops)

# with tf.control_dependencies(update_ops):
# 	train_op = optimizer.minimize(loss)

# with tf.Session() as sess:
# 	sess.run(tf.global_variables_initializer())
# 	saver = tf.train.Saver()
# 	saver.save(sess, "batch_norm_layer/Model")


"""
打印:
[<tf.Operation 'batch_normalization/AssignMovingAvg' type=AssignSub>, <tf.Operation 'batch_normalization/AssignMovingAvg_1' type=AssignSub>]
这两个变量即均值和方差。

当tf.layers.batch_normalization的参数training=False时,打印内容为:[]
因为此时不需要对均值和方差进行更新。

"""

3. tensorflow 的批标准化

tensorflow可以通过多种途径进行批标准化,有多个候选函数:

  • tf.nn.batch_normalization  
  • tf.layers.batch_normalization(input,training=True) 
  • tf.layers.BatchNormalization()(input,training=True) 
  • tf.contrib.layers.batch_norm(input, is_training=True)
  • tf.keras.layers.BatchNormalization()(input, training=True)

在第二节的例子中,我们使用了 tf.layers.batch_normalization, 该函数可以自动创建 update_ops(即均值和方差变量)并加入tf.GraphKeys.UPDATE_OPS中,在训练时,我们直接添加对 update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) 的依赖即可,但是是不是其他的批标准化函数也有这种自动操作呢?很遗憾,答案是否定的,tf.keras.layers.BatchNormalization 就没有。实验如下:

import tensorflow as tf

input = tf.ones([1, 2, 2, 3])
# 主要改变了批标准化函数
output = tf.keras.layers.BatchNormalization()(input, training=True)

# 打印batch_normalization中的两个操作
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
print(update_ops)

# with tf.control_dependencies(update_ops):
# 	train_op = optimizer.minimize(loss)

# with tf.Session() as sess:
# 	sess.run(tf.global_variables_initializer())
# 	saver = tf.train.Saver()
# 	saver.save(sess, "batch_norm_layer/Model")

"""
打印: 
[]
"""

 可见,tf.keras.layers.BatchNormalization并没有把均值与方差的计算节点放入tf.GraphKeys.UPDATE_OPS中,因此,此时即使在训练时添加了对 tf.GraphKeys.UPDATE_OPS 的依赖,也并没有执行批标准化中均值与方差的更新。

下面将每个批标准化函数是否会把 更新变量 均值和方差放入tf.GraphKeys.UPDATE_OPS中进行统计:

  • tf.nn.batch_normalization  : 低阶API,不建议使用
  • tf.layers.batch_normalization(input,training=True) :会自动将 update_ops 添加到 tf.GraphKeys.UPDATE_OPS 中
  • tf.layers.BatchNormalization()(input,training=True) :会自动将 update_ops 添加到 tf.GraphKeys.UPDATE_OPS 中
  • tf.contrib.layers.batch_norm(input, is_training=True):会自动将 update_ops 添加到 tf.GraphKeys.UPDATE_OPS 中
  • tf.keras.layers.BatchNormalization()(input, training=True):不会自动将 update_ops 添加到 tf.GraphKeys.UPDATE_OPS 中

当以上函数的 training 参数被设置为False时,以上函数均不会将 update_ops 添加到 tf.GraphKeys.UPDATE_OPS 中。

 

4. 检测批标准化函数是否将更新变量添加到了tf.GraphKeys.UPDATE_OPS 中

鉴于第三节中不同批标准化函数的不通特性,在利用批标准化训练时,最好检测一下批标准化的更新变量有没有被添加到tf.GraphKeys.UPDATE_OPS 中。事实上,与上一节的代码一样,只需要在图上增加以下两行命令即可:

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
print(update_ops)

"""
如果打印了以下内容,就说明批标准化的更新变量被添加到 tf.GraphKeys.UPDATE_OPS中了
[<tf.Operation 'batch_normalization/AssignMovingAvg' type=AssignSub>, <tf.Operation 'batch_normalization/AssignMovingAvg_1' type=AssignSub>]

否则,如果打印了
[]
则说明,批标准化的更新变量没有被添加到 tf.GraphKeys.UPDATE_OPS中
"""

5. 如何将 tf.keras.layers.BatchNormalization 的更新变量添加到tf.GraphKeys.UPDATE_OPS 中

如上所述,无论tf.keras.layers.BatchNormalization的参数 training = True 还是 training = False,  该函数都不会把”更新变量“添加到tf.GraphKeys.UPDATE_OPS 中,这会对批标准化的功效产生影响。

在应用tf.keras.layers.BatchNormalization进行批标准化时,我们可以通过以下两种方式把批标准化中的”更新变量“添加到tf.GraphKeys.UPDATE_OPS中。

方式1:定义每一层tf.keras.layers.BatchNormalization时,把函数的定义与应用分开,用函数的 .updates 功能提取当前批标准化层的”更新变量“,具体示例如下:

import tensorflow as tf

input = tf.ones([1, 2, 2, 3])

# step1: 把批标准化函数的定义与使用分开
bn_op = tf.keras.layers.BatchNormalization()
output = bn_op(input,training=True)

# step2: 用批标准化函数自带的.updates提取函数中定义的”update_ops“
bn_update_ops = bn_op.updates

# step3: 把当前层的”update_ops添加到tf.GraphKeys.UPDATE_OPS中“
tf.add_to_collection(tf.GraphKeys.UPDATE_OPS,bn_update_ops)

# step4: 提取整个网络的所有 update_ops
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
print(update_ops)

很明显,该方式在每一次使用批标准化函数时都要提取一次”update_ops“,很繁琐。有没有简单一点的方法?当然有,那就是方法2.

方式2:定义完整个网络结构后,或者定义完神经网络的整个图结构以后,用以下命令检索图中所有的”update_ops“,示例如下:

import tensorflow as tf

# step1: 定义整个神经网络的图解钩
input = tf.ones([1, 2, 2, 3])
output = tf.nn.relu(tf.keras.layers.BatchNormalization()(input,training=True))

# step2: 获取整个图的所有节点
ops = tf.get_default_graph().get_operations()

# step3: 从所有节点中筛选与批标准化有关的“update_ops”,
# 注1:AssignMovingAvg 的语义是滑动平均赋值,因为 批标准化中的均值与方差的计算方式都是 滑动平均赋值,所以在节点的命名中会包含这个说明。
#    x.type=="AssignSubVariableOp" 表示该节点的类型是“AssignSubVariableOp”--次变量赋值操作,
#                                  我的理解是,批标准化中的均值与方差不是真正的变量,算是“次变量”
#                                  所以 均值与方差的赋值节点属性是次变量赋值操作
# 注2:这里的筛选条件筛选的只是与批标准化相关的“update_ops”
bn_update_ops = [x for x in ops if ("AssignMovingAvg" in x.name and x.type=="AssignSubVariableOp")]
tf.add_to_collection(tf.GraphKeys.UPDATE_OPS,bn_update_ops)

# step4: 因为神经图网络中可能还存在其他的“update_ops”,因此再次从tf.GraphKeys.UPDATE_OPS中提取“update_ops”
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
print(update_ops)

"""
update_ops的格式是:
[[<tf.Operation 'batch_normalization/AssignMovingAvg/AssignSubVariableOp' type=AssignSubVariableOp>, <tf.Operation 'batch_normalization/AssignMovingAvg_1/AssignSubVariableOp' type=AssignSubVariableOp>]]
"""

6. 查看批标准化带来了哪几个变量

import tensorflow as tf

# step1: 定义整个神经网络的图解钩
input = tf.ones([1, 2, 2, 3])
output = tf.nn.relu(tf.keras.layers.BatchNormalization()(input,training=True))

# step2: 获取所有计算节点
ops = tf.get_default_graph().get_operations()

# step3: 筛选批标准化的计算节点“均值更新”节点与“方差更新”节点
bn_update_ops = [x for x in ops if ("AssignMovingAvg" in x.name and x.type=="AssignSubVariableOp")]
tf.add_to_collection(tf.GraphKeys.UPDATE_OPS,bn_update_ops)

# step4: 获取所有的“更新节点”并打印
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
print("update_ops:",update_ops)

# 打印所有变量
var_list = tf.global_variables()
for v in var_list:
	print("var:",v)

with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())
	saver = tf.train.Saver(var_list=tf.global_variables())
	saver.save(sess, "batch_norm_layer/Model")

"""
打印:
update_ops: [[<tf.Operation 'batch_normalization/AssignMovingAvg/AssignSubVariableOp' type=AssignSubVariableOp>, <tf.Operation 'batch_normalization/AssignMovingAvg_1/AssignSubVariableOp' type=AssignSubVariableOp>]]
var: <tf.Variable 'batch_normalization/gamma:0' shape=(3,) dtype=float32>
var: <tf.Variable 'batch_normalization/beta:0' shape=(3,) dtype=float32>
var: <tf.Variable 'batch_normalization/moving_mean:0' shape=(3,) dtype=float32>
var: <tf.Variable 'batch_normalization/moving_variance:0' shape=(3,) dtype=float32>

分析:
可见,每个批标准化操作带来:
   (1)两个滑动平均计算节点,
   (2)4个变量:gamma,beta,moving_mean,moving_variance.这4个变量是不可训练的,
               因此在保存模型的时候,var_list要设置为tf.global_variables()
               因为这些变量在推断时还需要用。
"""

7. 训练时没有使用依赖控制tf.control_dependencies会怎样?

如以上分析,批标准化中的更新节点并不会主动被调用,如果没有添加依赖控制,或在以来控制中没有添加批标准化的更新节点的话,会导致每个批标准化层的均值与方差永远保持不变,即保持初始化状态。

 

参考:

tensorflow中的batch_norm以及tf.control_dependencies和tf.GraphKeys.UPDATE_OPS的探究

TensorFlow 中 Batch Normalization API 的一些坑

正确使用Tensorflow Batch_normalization

TensorFlow中batch norm原理,使用事项与踩坑

基于OpenCV+TensorFlow+CNN的人脸识别系统实战指南 人脸识别是计算机视觉领域的重要应用,其核心在于将人脸图像转换为可度量的特征向量。通过卷积神经网络(CNN)提取人脸深层特征,结合度量学习使同类特征靠近、异类远离,从而实现精准的身份匹配。OpenCV提供高效的图像采集与预处理能力,TensorFlow则承担模型训练与推理任务,两者配合可构建完整的识别链路。人脸识别技术广泛应用于安防门禁、智能打卡、边缘设备验证等场景,实际落地中需关注数据增强、人脸对齐、阈值调优等工程细节。本文基于OpenCV+TensorFlow+CNN组合,详细拆解从数据采集、模型训练到实 阅读详情

相关推荐

TensorFlow端到端CTC OCR实战:从CAPTCHA破解理解序列建模本质

OCR(光学字符识别)是计算机视觉中连接图像与文本的关键技术,其核心挑战在于如何将无结构的像素序列映射为有语义的字符序列。传统两阶段方法(检测+识别)在字符粘连、形变、无边界等非标准场景下失效,而端到端序列建模通过CTC(Connectionist Temporal Classification)损失函数,直接学习图像特征到可变长文本的概率对齐关系。CTC不依赖预设字典或固定位置框,天然支持长度可变、上下文耦合、容错输出,在CAPTCHA这类强干扰、低信噪比任务中展现出鲁棒建模能力。本文以TensorFlo

图灵教育官方博客 509

关于tf.GraphKeys.UPDATA_OPS

1、tf.control_dependencies 首先我们先介绍tf.control_dependencies,该函数保证其辖域中的操作必须要在该函数所传递的参数中的操作完成后再进行。请看下面一个例子。 import tensorflow as tf a_1 = tf.Variable(1) b_1 = tf.Variable(2) update_op = tf.assign(a_1, 10...

dong-技术驱动人生 7600

给新考上北大软件与微电子学院的同学——利用北大资源

利用北大资源 首先,恭喜大家考入北京大学!希望软院成为各位人生旅途中快乐的一站! 说明:限于本人搜集能力有限,本文只列出本人常利用的资源(上课老师会告知的资源也不在此列),本文所述的资源只是北大可利用资源的一个子集。 一、 图书馆资源:北京大学图书馆的资源数量,我就不多废话了,这里主要说一样怎样利用这些资源。 a) 传统资源分布及查找:这种资源主要包括纸质书箱、杂志、光盘等内...

Felomeng的技术博客 1万+

【转】tensorflow中的batch_norm以及tf.control_dependencies和tf.GraphKeys.UPDATE_OPS的探究

笔者近来在tensorflow中使用batch_norm时,由于事先不熟悉其内部的原理,因此将其错误使用,从而出现了结果与预想不一致的结果。事后对其进行了一定的调查与研究,在此进行一些总结。 一、错误使用及结果 笔者最先使用时只是了解到了在tensorflow中tf.layers.batch_normalization这个函数,就在函数中直接将其使用,该函数中有一个参数为training,在训练阶段赋值True,在测试阶段赋值False。但是在训练完成后,出现了奇怪的现象时,在training赋值为T.

monk1992的博客 709

从TI官方手册里挖细节:TPS5430负压电路那个不起眼却救命的Cd电容

本文深入解析TPS5430负压电路中关键Cd电容的作用与设计要点,揭示其在DC-DC电源设计中的重要性。通过对比TI手册和实战案例,详细阐述Cd电容在高频电流回路、能量缓冲和噪声抑制中的核心功能,并提供选型与布局指南,帮助工程师避免芯片烧毁风险,提升电路稳定性。

weixin_27102543的博客 357

微信小程序中蓝牙打印机中文编码处理:使用iconv-lite库

本文介绍了微信小程序集成蓝牙打印机时中文乱码问题的解决方案。由于打印机通常仅支持GBK/GB2312编码,而小程序使用UTF-8,导致中文显示异常。通过引入轻量级iconv-lite库进行编码转换,可高效解决该问题。文章详细说明了从库安装、编码转换到蓝牙发送的实现步骤,并提供了完整代码示例。关键注意事项包括编码验证、分段发送和兼容性测试。该方法经实际验证,能有效保障中文打印的准确性,适用于零售、物流等场景。

canglingyue的专栏 1309

深度学习优化策略---炼丹trick之tensorflow中的三种batch_norm以及为什么需要tf.control_dependencies和tf.GraphKeys.UPDATE_OPS

tensorflow中的batch_norm以及tf.control_dependencies和tf.GraphKeys.UPDATE_OPS的探究 tf.control_dependencies 首先我们先介绍tf.control_dependencies,该函数保证其辖域中的操作必须要在该函数所传递的参数中的操作完成后再进行。请看下面一个例子。 import tensorf...

xys430381_1的专栏 941

零基础教程:用Python给试卷照片自动切题(有道OCR+PIL完整流程)

本文为零基础用户提供了一套完整的Python自动化切题方案。通过调用有道OCR API识别试卷照片中的题目坐标,并利用PIL库进行精准裁剪,将杂乱的试卷图片自动分割为独立的题目图像。教程详细涵盖了环境搭建、图像预处理、API调用、坐标解析与批量处理全流程,帮助教育工作者和技术爱好者高效处理大量试卷,实现工作流程自动化。

grpc6streamer的博客 1173

tensorflow中的batch_norm以及tf.control_dependencies和tf.GraphKeys.UPDATE_OPS的探究

笔者近来在tensorflow中使用batch_norm时,由于事先不熟悉其内部的原理,因此将其错误使用,从而出现了结果与预想不一致的结果。事后对其进行了一定的调查与研究,在此进行一些总结。 一、错误使用及结果 笔者最先使用时只是了解到了在tensorflow中tf.layers.batch_normalization这个函数,就在函数中直接将其使用,该函数中有一个参数为training,在训练阶...

huitailangyz的博客 2万+

34、实数域上高效负循环卷积算法解析

本文介绍了一种高效的实数域负循环卷积算法,通过引入离散傅里叶负循环变换(DFNT)避免传统方法的冗余,显著提升计算效率。文章详细分析了算法原理、误差传播机制,并推导出误差与方差界,提出无误差和基于3σ规则的参数设置方案。结合Cooley-Tukey与Gentleman-Sande FFT路径优化,实验验证了算法在不同精度和多项式长度下的性能优势与结果正确性,为密码学与信号处理等领域提供了高精度、高性能的卷积计算解决方案。

salt的博客 114

【华为OD机试真题】45、 分糖果 | 机试真题+思路参考+代码解析(C++、Java、Py、JS)

### 🎃题目描述 >小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。 >  当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。 >  小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 1290

浅层cnn网络炼丹--tensorflow

1.在用batch normal时发现模型一直不收敛。 解决方法: 在计算loss前加入update_ops。 update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops): training_operation = optimizer.minimiz...

qq_34570910的博客 868

中国农业银行——轻量式云原生应用平台(轻云平台)

2021年10月,中国人民银行等联合发布了《关于规范金融业开源技术应用与发展的意见》(银办发〔2021〕146 号),规范金融机构合理应用开源技术,提高应用水平和自主可控能力,促进开源技术健康可持续发展。前期,为助力成员单位做好开源技术应用与发展工作,北京金融科技产业联盟开源专委会组织了金融业开源技术应用、创新等方面的案例征集,现对部分优秀案例进行宣传,发挥先进典型示范引领作用。申报单位:中国农业银行股份有限公司技术领域:云原生、无服务器架构(Serverless)、DevOps。

银行信息系统应用架构详解 2391

Tensorflow中BatchNormalization用法详解

目录 概要: 为什么引入BN 为什么如果gamma和beta默认1和0,最终输出等于原样不变? 关于为什么直接用mean和var做normalize就解决分布问题,还要经过scale和shift进行转换的问题 关于这个BN如何被训练到 根据说明文档可知,无论用哪种实现,training阶段的选择都要有: 重中之重:无论接口白盒黑盒,BN操作需要使用依赖关系来完成滑动平均的更新 BN...

huqinwei的专栏 5900

CMake入门教程【基础篇】CMake+Visual Studio2022构建C++项目

CMake+Visual Studio2022搭建C++环境

小鱼酱的博客 4971

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Batch Normalization原理理解与Tensorflow实现

一、原始神经网络层和Internal Covariate Shift问题 在原始DNN中,隐藏层(HiddenLayer)将输入x通过系数矩阵W相乘得到线性组合z=Wx,再通过激活函数a=f(z),得到隐藏层的输出a(X可以为输入层输入或者上一个隐藏层的输出),具体结构如下: 图中为一个批次(batch)的样本在隐藏层的传播过程。由于批次的不断传入和训练,DNN内部参数在不断改变,导致每一次隐藏...

u011517132的博客 1881

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TensorFlow中batch norm原理,使用事项与踩坑

一、机器学习领域有个重要假设:独立同分布independent and identically distributed (i.i.d.) 在概率统计理论中,指随机过程中,任何时刻的取值都为随机变量,如果这些随机变量服从同一分布,并且互相独立,那么这些随机变量是独立同分布。如果随机变量X1和X2独立,是指X1的取值不影响X2的取值,X2的取值也不影响X1的取值且随机变量X1和X2服从同一分布,这意...

7433

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

TensorFlow

TensorFlow 是一个,专门为机器学习任务而设计,让开发者能够轻松地构建从简单线性回归到复杂神经网络的各种模型。TensorFlow 是由 Google 开发的开源机器学习框架,用于构建和训练各种机器学习和深度学习模型。和,表示数据以张量的形式在计算图中流动。核心概念。

qq_32381773的博客 194

Batch Normalization || 3. 在tensorflow 中bn的坑 —— Is_training、momentum的设置

1 问题概述 在神经网络中使用 Batch Normalization,已经是一个基本必用的正则手段。   现象: 当训练好神经网络,信心满满的进行预测,却发现结果一塌糊涂。   分析: 训练和测试时,bn中的均值和方差的计算方法。要明确:训练时使用batch内数据的mean和var。测试时会使用更新后的滑动均值和滑动方差)   问题: 那么可能出现bug的点就显而易见了: 训练时,bn 的 momentum、Is_training 参数设置的是否合理 训练时,moving_mean 和 moving_.

magic_ll的博客 3661

深度学习之tensorflow:软硬件安装,环境配置,测试

tensorflow配置环境(windows+anaconda) 0tensorflow简介 工欲善其事必先利其器,在用tensorflow前,首先得了解一下tensorflow。这样在使用的时候才能避免很多问题。更多问题请查看tensorflow中文官网。 tensorflow中文官网 0.0:什么是tensorflow TensorFlow 是一个免费、开源、流行的 机器学习 和 深度学习框架。 由谷歌大脑 (Google Brain) 团队开发, 于 2015 年 11 月 9 日发布。用于使用数据流

rs_gis的博客 2955

TensorFlow2 CNN实战避坑指南:从数据加载到模型部署

卷积神经网络(CNN)是深度学习中处理图像数据的基础架构,其核心在于局部感受野、参数共享与层次化特征提取。在TensorFlow2框架下,CNN的有效实现不仅依赖理论理解,更取决于对张量维度契约、数据流完整性及训练-部署闭环的工程把控。本文围绕真实项目高频痛点——如输入形状不匹配、梯度异常、SavedModel导出失败等,系统解析tf.data.Dataset构建、tf.image预处理、Functional API建模、tf.GradientTape训练及TFLite转换等关键技术环节。特别强调Tenso

weixin_30606461的博客 443

TensorFlow生态全景解构:四层架构与工程避坑指南

TensorFlow并非单一深度学习框架,而是一个分层明确、边界清晰的工业级AI系统。其核心由底层C++计算引擎、中层Python API抽象、上层生产部署管线及硬件适配层构成,各层承担不可替代的技术职责。理解tf.data的数据流水线机制、tf.keras的图编译原理(@tf.function)、TFLite的图重写与量化流程,是保障训练效率与部署稳定的关键。技术价值体现在跨平台一致性、生产环境可运维性及硬件协同优化能力,广泛应用于医疗影像、边缘智能、云端推理等场景。本文基于真实项目故障数据与源码级分析,

weixin_30736301的博客 363

Tensorflow BatchNormalization详解:2_使用tf.layers高级函数来构建神经网络

Batch Normalization: 使用tf.layers高级函数来构建神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearningai课程 课程笔记 Udacity课程 # Batch Normalization – Solutions # Batch Normalization 解决方案 """ 批量标...

泛用演化计算、通用人工智能优化模型 3530

基于TensorFlow的深度学习模型优化技巧与实战解析

在构建基于TensorFlow的深度学习模型时,合理的架构设计是决定模型性能上限的基石。一个优秀的架构不仅能够高效地拟合训练数据,更重要的是具备良好的泛化能力和可扩展性。首先,模型深度与宽度的平衡至关重要。TensorFlow的Keras API提供了Sequential和Functional两种主要模型构建方式,对于复杂的多输入/多输出或存在残差连接的网络,Functional API提供了更大的灵活性。模型训练是深度学习项目中的核心环节,优化策略的选择直接关系到模型收敛的速度和最终的性能。

qq_33836401的博客 855

Tensorflow slim库使用小记

slim库是tensorflow中的一个高层封装,它将原来很多tf中复杂的函数进一步封装,省去了很多重复的参数,以及平时不会考虑到的参数。可以理解为tensorflow的升级版。 import tensorflow as tf import tensorflow.contrib.slim as slim 常用函数 slim.conv2d slim.conv2d是基于tf.conv2d的进...

qq_41295976的博客 161
上一篇: 对 BatchNormalization 中 Internal Convariate Shift 的理解
下一篇: 批标准化 tf.keras.layers.BatchNormalization 参数解析与应用分析
wzg2016
博客等级 码龄10年 539粉丝 493原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值