使用tf.train.ExponentialMovingAverage()来训练模型

时间:2017-12-25 03:49:12

标签: tensorflow

我正在学习TensorFlow并尝试应用基于指数移动平均线的梯度下降(而不是香草梯度下降)。特别是我;我试图使用tf.train.ExponentialMovingAverage,但该文档似乎没有提供如何使用它来构建推动优化的模型的指南。

完整代码位于 - https://github.com/vibhorj/tf/blob/master/so/ema.py ,但这就是我正在做的事情,分类器并没有学习任何东西(在每个时代之后,w& b仍然保持不变......没有学习)

第1步:定义权重&偏置

with tf.variable_scope('scp1', reuse=tf.AUTO_REUSE):
w = tf.get_variable(name='weights', initializer = tf.ones(shape=[2,3],dtype=tf.float32))
b = tf.get_variable(name='bias', initializer = tf.ones(shape=[3],dtype=tf.float32))

第2步:定义错误/丢失/优化程序

X = tf.placeholder(tf.float32, shape=[None,2], name='X')
Y = tf.placeholder(tf.float32, shape=[None,3], name='Y')
Ylogits = tf.matmul(X,w) + b
error = -Y*tf.log(Ylogits)
loss = tf.reduce_mean(error, name = 'loss') 
opt = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss)

STEP3 :创建了ExponentialMovingAverage对象,创建了training_op(我希望)在每个训练步骤后更新移动平均线。

ema = tf.train.ExponentialMovingAverage(decay=0.50,name='EMA')
training_op = ema.apply([w, b])

第4步:最终运行迭代

with tf.Session() as sess:
    sess.run(tf.variables_initializer(tf.global_variables()))
    for epoch in range(10): #increase epocs later
        _ = sess.run([training_op], feed_dict=feed_train)
        print("\n POST:")
        print("    {}:\n {}".format(ema.average_name(w),sess.run(ema.average(w))))
        print("    {}:\n {}".format(ema.average_name(b),sess.run(ema.average(b))))

当我运行它时,权重&每次连续迭代时,偏差都保持不变!

我知道我缺少的东西(更新参数!)但无法识别!该文档也没有多大帮助。非常感谢任何关于我如何进一步行动的指导。

谢谢!

1 个答案:

答案 0 :(得分:0)

缺少的实际上是在训练步骤。 Ema变量正在更新,但不会更改,因为权重没有变化。有两种可能的解决方案。

  1. 将训练步骤明确添加到sess.run

    _ = sess.run([opt, training_op], feed_dict=feed_train)

  2. 添加依赖项-现在tensorflow将知道每次调用ema update时,它需要在计算它之前执行训练步骤。

    ema = tf.train.ExponentialMovingAverage(decay=0.50,name='EMA') with tf.control_dependencies([opt]): training_op = ema.apply([w, b])