网站建设尺寸大小,烟台展厅设计公司,平面广告设计素材库,山东潍坊新闻1 滑动平均概述 滑动平均#xff08;也称为 影子值 #xff09;#xff1a;记录了每一个参数一段时间内过往值的平均#xff0c;增加了模型的泛化性。 滑动平均通常针对所有参数进行优化#xff1a;W 和 b#xff0c; 简单地理解#xff0c;滑动平均像是给参数加了一个影…1 滑动平均概述 滑动平均也称为 影子值 记录了每一个参数一段时间内过往值的平均增加了模型的泛化性。 滑动平均通常针对所有参数进行优化W 和 b 简单地理解滑动平均像是给参数加了一个影子参数变化影子缓慢追随。 滑动平均的表示公式为 影子 衰减率 * 影子 ( 1 - 衰减率 ) * 参数 或 滑动平均值 衰减率 * 滑动平均值 ( 1 - 衰减率 * 参数 备注 影子初值 参数初值 衰减率 min{ MOVING_AVERAGE_DECAY, (1轮数) / (10 轮数 ) } 示例 MOVING_AVERAGE_DECAY 为 0.99, 参数 w1 为 0轮数 global_step 为 0w1的滑动平均值为 0 。 参数w1更新为 1 时则 w1的滑动平均值 min( 0.99, 1/10 ) * 0 ( 1 - min( 0.99, 1/10 ) * 1 0.9 假设轮数 global_step 为 100 时参数 w1 更新为 10 时则 w1滑动平均值 min(0.99, 101/110) * 0.9 ( 1 - min( 0.99, 101/110) * 10 1.644 再次运行 w1滑动平均值 min(0.99, 101/110) * 1.644 ( 1 - min( 0.99, 101/110) * 10 2.328 再次运行 w1滑动平均值 2.956 2 滑动平均在Tensorflow中的表示方式 第一步 实例化滑动平均类ema ema tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY(滑动平均衰减率),global_step(轮数计数器表示当前轮数)
) 备注 MOVING_AVERAGE_DECAY 滑动平均衰减率是超参数一般设定的值比较大 global_step - 轮数计数器表示当前轮数这个参数与其他计数器公用。 第二步 求算滑动平均节点ema_op ema_op ema.apply([]) ema.apply([ ]) 函数表示对 [ ] 中的所有数值求滑动平均。 示例 ema_op ema.apply(tf.trainable_variables()) 每当运行此代码时会对所以待优化参数进行求滑动平均运算。 第三步 具体实现方式 在工程应用中我们通常会将计算滑动平均 ema_op 和训练过程 train_step 绑定在一起运行使其合成一个训练节点实现的代码如下 with tf.control_dependencies([ train_step, ema_op ]):train_op tf.no_op(name train) 另外 查看某参数的滑动平均值 函数ema.average(参数名) --- 返回 ’ 参数名 ’ 的滑动平均值 3 示例代码 # 待优化参数w1不断更新w1参数求w1的滑动平均(影子)import tensorflow as tf# 1. 定义变量及滑动平均类# 定义一个32位浮点变量并赋初值为0.0
w1 tf.Variable(0, dtypetf.float32)# 轮数计数器表示NN的迭代轮数赋初始值为0同时不可被优化不参数训练
global_step tf.Variable(0, trainableFalse)# 设定衰减率为0.99
MOVING_AVERAGE_DECAY 0.99# 实例化滑动平均类
ema tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)# ema.apply()函数中的参数为待优化更新列表
# 每运行sess.run(ema_op)时会对函数中的参数求算滑动平均值
# tf.trainable_variables()函数会自动将所有待训练的参数汇总为待列表
# 因该段代码中仅有w1一个参数ema_op ema.apply([w1])与下段代码等价
ema_op ema.apply(tf.trainable_variables())# 2. 查看不同迭代中变量取值的变化。
with tf.Session() as sess:# 初始化init_op tf.global_variables_initializer()sess.run(init_op)# 用ema.average(w1)获取w1滑动平均值 要运行多个节点作为列表中的元素列出写在sess.run中# 打印出当前参数w1和w1滑动平均值print(current global_step:, sess.run(global_step))print(current w1, sess.run([w1, ema.average(w1)]))# 参数w1的值赋为1sess.run(tf.assign(w1, 1))sess.run(ema_op)print(current global_step:, sess.run(global_step))print(current w1, sess.run([w1, ema.average(w1)]))# 更新global_step和w1的值,模拟出轮数为100时参数w1变为10, 以下代码global_step保持为100每次执行滑动平均操作影子值会更新 sess.run(tf.assign(global_step, 100))sess.run(tf.assign(w1, 10))sess.run(ema_op)print(current global_step:, sess.run(global_step))print(current w1:, sess.run([w1, ema.average(w1)]))# 每次sess.run会更新一次w1的滑动平均值sess.run(ema_op)print(current global_step:, sess.run(global_step))print(current w1:, sess.run([w1, ema.average(w1)]))sess.run(ema_op)print(current global_step:, sess.run(global_step))print(current w1:, sess.run([w1, ema.average(w1)]))sess.run(ema_op)print(current global_step: , sess.run(global_step))print(current w1:, sess.run([w1, ema.average(w1)]))sess.run(ema_op)print(current global_step: , sess.run(global_step))print(current w1:, sess.run([w1, ema.average(w1)])) 运行 current global_step: 0
current w1 [0.0, 0.0]
current global_step: 0
current w1 [1.0, 0.9]
current global_step: 100
current w1: [10.0, 1.6445453]
current global_step: 100
current w1: [10.0, 2.3281732]
current global_step: 100
current w1: [10.0, 2.955868]
current global_step: 100
current w1: [10.0, 3.532206]
current global_step: 100
current w1: [10.0, 4.061389] w1 的滑动平均值都向参数 w1 靠近。可见滑动平均追随参数的变化而变化。转载于:https://www.cnblogs.com/gengyi/p/9901502.html