神经网络的滑动平均模型
2018-01-13 14:15
579 查看
若采用随机梯度下降算法训练神经网络,为了控制网络更新速度,常采用滑动平均模型进行优化,使得网络在测试数据集中表现更好。
TensorFlow提供了tf.train.ExponentialMovingAverage来实现滑动平均模型,输入参数有衰减率(decay),用于控制网络的更新速度。ExponentialMovingAverage对滑动平均的变量会生成一个影子变量,这个影子变量的初始值就是相应变量的初始值,在每次运行变量更新时,会使用影子变量迭代生成新的滑动变量:
shadow_variable = decay*shadow_variable+(1-decay)*variable
其中,shadow_variable为影子变量,variable为初始输入值,decay为衰减率,所以可以看出,decay决定了网络更新的速度,decay越大网络越趋于稳定。在实际应用中,decay一般会被设置成非常接近1的数,例如0.999或者0.9999。但是为了网络在前期训练的更快,ExponentialMovingAverage还提供了num_updates参数来动态设置decay的大小,有num_updates的衰减率公式为:
min{decay, (1+num_updates)/(10+num_updates)}。设置ExponentialMovingAverage的代码为:
TensorFlow提供了tf.train.ExponentialMovingAverage来实现滑动平均模型,输入参数有衰减率(decay),用于控制网络的更新速度。ExponentialMovingAverage对滑动平均的变量会生成一个影子变量,这个影子变量的初始值就是相应变量的初始值,在每次运行变量更新时,会使用影子变量迭代生成新的滑动变量:
shadow_variable = decay*shadow_variable+(1-decay)*variable
其中,shadow_variable为影子变量,variable为初始输入值,decay为衰减率,所以可以看出,decay决定了网络更新的速度,decay越大网络越趋于稳定。在实际应用中,decay一般会被设置成非常接近1的数,例如0.999或者0.9999。但是为了网络在前期训练的更快,ExponentialMovingAverage还提供了num_updates参数来动态设置decay的大小,有num_updates的衰减率公式为:
min{decay, (1+num_updates)/(10+num_updates)}。设置ExponentialMovingAverage的代码为:
import tensorflow as tf v1 = tf.Variable(0, dtype=tf.float32) #step变量模拟神经网络中迭代的轮数,可以用于动态控制衰减率 step = tf.Variable(0, trainable=False) #定义一个滑动平均的类ema,初始化时给定衰减率(0.99)和控制衰减率的变量step ema = tf.train.ExponentialMovingAverage(0.99, step) #定义一个更新变量滑动平均的操作。需要给定一个列表[v1],每次执行这个操作时,这个列表中的变量都会被更新 maintain_average_op = ema.apply([v1]) with tf.Session() as sess: #初始化所有变量 init_op = tf.global_variables_initializer() sess.run(init_op) #通过ema.average(v1)获取滑动平均之后变量的取值,在初始化之后变量v1的值和v1的滑动平均都是0 print(sess.run([v1, ema.average(v1)])) #更新变量v1的值到5 sess.run(tf.assign(v1, 5)) #更新v1的滑动平均值,衰减率为min{0.99, (1+step)/(10+step)=0.1}=0.1 #所以v1的滑动平均会被更新为0.1*0+0.9*5=4.5 sess.run(maintain_average_op) print(sess.run([v1, ema.average(v1)])) #输出[5.0,4.5] #更新step为10000,step越大衰减率越大 sess.run(tf.assign(step, 10000)) sess.run(tf.assign(v1, 10)) #v1=10 #更新v1的滑动平均值,衰减率为min{0.99, 0.999}=0.99, v1为4.555 sess.run(maintain_average_op) print(sess.run([v1, ema.average(v1)])) #再次更新滑动平均值 sess.run(maintain_average_op) print(sess.run([v1, ema.average(v1)])) >>[0.0, 0.0] [5.0, 4.5] [10.0, 4.5549998] [10.0, 4.6094499]
相关文章推荐
- 金融风控-->客户流失预警模型-->神经网络建模
- 【懒懒的Tensorflow学习笔记三之搭建简单的神经网络模型】
- 基于keras 的神经网络股价预测模型
- sql server搭建神经网络模型
- 机器学习笔记六 - 朴素贝叶斯的多项式事件模型、神经网络、支持向量机的函数间隔与几何间隔
- 利用TensorFlow训练简单的二分类神经网络模型的方法
- Python实现感知器模型、两层神经网络
- 转发保留不错一篇 数学模型神经网络在程序化交易模型构建中的运用探讨
- 基于感知器模型的线性神经网络
- 神经网络机器翻译模型介绍
- 百度无人驾驶apollo项目使用的神经网络模型分析
- tensorflow 核心流程剖析 4-- 使用profiler检测神经网络模型的运行性能
- CS231n 卷积神经网络与计算机视觉 7 神经网络训练技巧汇总 梯度检验 参数更新 超参数优化 模型融合 等
- TensorFlow下构建高性能神经网络模型的最佳实践
- 一文看懂25个神经网络模型
- 机器学习之神经网络模型-上(Neural Networks: Representation)
- Deep Forest,非神经网络的深度模型(周志华)
- 人工神经网络模型、人类的大脑和人类社会本身相似性 (一家之言,仅供一笑)。
- 人工神经网络模型与分类
- 神经网络与机器学习导言——神经元的统计模型和被看作有向图的神经网络