我正在学习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))))
当我运行它时,权重&每次连续迭代时,偏差都保持不变!
我知道我缺少的东西(更新参数!)但无法识别!该文档也没有多大帮助。非常感谢任何关于我如何进一步行动的指导。
谢谢!
答案 0 :(得分:0)
缺少的实际上是在训练步骤。 Ema变量正在更新,但不会更改,因为权重没有变化。有两种可能的解决方案。
将训练步骤明确添加到sess.run
:
_ = sess.run([opt, training_op], feed_dict=feed_train)
添加依赖项-现在tensorflow将知道每次调用ema update时,它需要在计算它之前执行训练步骤。
ema = tf.train.ExponentialMovingAverage(decay=0.50,name='EMA')
with tf.control_dependencies([opt]):
training_op = ema.apply([w, b])