【问题标题】:How to propagate gradient into a variable after assign operation?分配操作后如何将梯度传播到变量中?
【发布时间】:2016-10-22 16:24:00
【问题描述】:

长话短说。下一段代码描述了期望的行为,即优化器修改了变量值

  x = tf.Variable(5.0)
  # x = x.assign(tf.constant(5.0))
  opt = tf.train.MomentumOptimizer(learning_rate=0.0001, momentum=0.9)
  train_op = opt.minimize(x)
  with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    sess.run(train_op)
    print(x.eval())            # => 4.9999 - Desired result

虽然在旅途中将值分配给变量被认为是不值得梯度的操作:

  x = tf.Variable(5.0)
  x_ = x.assign(tf.constant(5.0))
  opt = tf.train.MomentumOptimizer(learning_rate=0.0001, momentum=0.9)        
  train_op = opt.minimize(x_)
  with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    sess.run(train_op)        # => ERROR: No gradients provided for any variable
    print(x.eval())

有没有办法将变量设置为某个值,但由于火车运行而通过梯度修改其值?

编辑:代码修复

【问题讨论】:

  • 你应该最小化x,而不是x_x_ 是一个赋值操作,可以在单独的sess.run 调用中调用以修改值
  • @YaroslavBulatov 的目标是最小化 x_ ,它不仅代表分配,而且代表整个模型。说x_ = large_network(x.assign(const)),我的目标是优化loss(x_),但在x中捕捉渐变
  • 如果您想在x 中保存渐变,您可以执行tf.assign(x, gradient) 之类的操作。如果要将x设置为某个值,然后将其最小化,可以运行tf.assign(x, somevalue),然后运行tf.assign_add(x, gradient)

标签: tensorflow backpropagation


【解决方案1】:

这个是肮脏的黑客:

  x = tf.Variable(99.0)
  const = tf.constant(5.0)
  x_ = x + tf.stop_gradient(-x) + const # ARGHH
  opt = tf.train.MomentumOptimizer(learning_rate=0.0001, momentum=0.9)
  train = opt.minimize(x_)

  with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    print(x_.eval())
    x_original = x.eval()
    sess.run(train)
    print(x.eval() - x_original + const.eval())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 2021-05-08
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多