TensorFlow北大公开课学习笔记-4.3滑动平均

注:本系列文章主要是复现北京大学TensorFlow笔记中的代码,方便以后使用,并没有详细讲解流程,因为我并不是专门做教程的。何况北大的教程讲的已经很好了,有需要了解详细过程的可以去看北大的教程哈。

√滑动平均: 记录了一段时间内模型中所有参数 w 和 b 各自的平均值。利用滑动平均值可以增强模型的泛化能力。
√滑动平均值(影子) 计算公式:
影子 = 衰减率 * 影子 +(1 - 衰减率) * 参数
这里写图片描述
√用 Tesnsorflow 函数表示为:

√ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)```

其中, MOVING_AVERAGE_DECAY 表示滑动平均衰减率,一般会赋接近 1 的值, global_step 表示当前训练了多少轮。

√ema_op = ema.apply(tf.trainable_variables())

其中, ema.apply()函数实现对括号内参数求滑动平均, tf.trainable_variables()函数实现把所有待训练参数汇总为列表。

with tf.control_dependencies([train_step, ema_op]):
          train_op = tf.no_op(name='train')

其中,该函数实现将滑动平均和训练过程同步运行。查看模型中参数的平均值,可以用 ema.average()函数。
例如:
在神经网络模型中,将 MOVING_AVERAGE_DECAY 设置为 0.99,参数 w1 设置为 0, w1 的滑动平均值设置为 0。
①开始时,轮数 global_step 设置为 0, 参数 w1 更新为 1,则 w1 的滑动平均值为:

w1 滑动平均值=min(0.99,1/10)*0+(1min(0.99,1/10)*1 = 0.9

③ 当轮数 global_step 设置为 100 时,参数 w1 更新为 10, 以下代码 global_step 保持为 100,每
次执行滑动平均操作影子值更新, 则滑动平均值变为:

w1 滑动平均值=min(0.99,101/110)*0.9+(1min(0.99,101/110)*10 = 0.826+0.818=1.644

③再次运行,参数 w1 更新为 1.644,则滑动平均值变为:

w1 滑动平均值=min(0.99,101/110)*1.644+(1min(0.99,101/110)*10 = 2.328

④再次运行,参数 w1 更新为 2.328,则滑动平均值:

w1 滑动平均值=2.956

代码如下:
这里写图片描述
这里写图片描述
这里写图片描述
运行程序,结果如下:
这里写图片描述
从运行结果可知,最初参数 w1 和滑动平均值都是 0;参数 w1 设定为 1 后,滑动平均值变为 0.9;
当迭代轮数更新为 100 轮时,参数 w1 更新为 10 后,滑动平均值变为 1.644。随后每执行一次,参数
w1 的滑动平均值都向参数 w1 靠近。 可见,滑动平均追随参数的变化而变化

猜你喜欢

转载自blog.csdn.net/sxlsxl119/article/details/81737214