如何使tensorflow赋值成为计算图的一部分而不显式运行其输出?
我试图在tensorflow中创建一个自定义梯度,以实现本文()中建议的对数的指数平滑(无偏)梯度。我需要做的是对一个新变量进行折痕处理,该变量存储一个指数平滑的值,该值将在自定义梯度函数中更新和使用。此外,我需要一个标志,它告诉我何时进行第一次梯度计算,以便我可以将指数平滑值初始化为适当的(依赖于数据的)值。此外,自定义渐变函数的输出必须是渐变,因此从自定义渐变内部访问tf.assign的输出将是一件痛苦的事情。最后,我不想创建第二个“手动”初始化指数平滑的操作,方法是在我的训练循环中单独运行它。无论如何,这太复杂了,所以我有一个抽象但简单的问题,下面概述,解决方案将解决我的问题: 我需要能够做的是以第二个变量为条件的方式更新一个变量,而且我需要更新第二个变量,而不通过函数提供显式输出。下面是演示我的问题的示例代码:如何使tensorflow赋值成为计算图的一部分而不显式运行其输出?,tensorflow,Tensorflow,我试图在tensorflow中创建一个自定义梯度,以实现本文()中建议的对数的指数平滑(无偏)梯度。我需要做的是对一个新变量进行折痕处理,该变量存储一个指数平滑的值,该值将在自定义梯度函数中更新和使用。此外,我需要一个标志,它告诉我何时进行第一次梯度计算,以便我可以将指数平滑值初始化为适当的(依赖于数据的)值。此外,自定义渐变函数的输出必须是渐变,因此从自定义渐变内部访问tf.assign的输出将是一件痛苦的事情。最后,我不想创建第二个“手动”初始化指数平滑的操作,方法是在我的训练循环中单独运行
import tensorflow as tf
a = tf.get_variable(name = "test",initializer=True)
b = tf.get_variable(name = "testval",initializer = 10.)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
def make_function(inp):
with tf.variable_scope("",reuse = True):
a = tf.get_variable(name = "test",dtype = tf.bool)
b = tf.get_variable(name = "testval")
iftrue = lambda: [tf.assign(b,inp),tf.assign(a,False)]
iffalse = lambda: [tf.assign(b,(b + inp)/2),tf.assign(a,False)]
acond,bcond = tf.cond(a,iftrue,iffalse)
return acond
I = tf.placeholder(tf.float32)
tcond = make_function(I)
print("{}\tThe initial values of a and b".format(sess.run([a,b])))
print("{}\t\tRun, tcond1. output is the updated value of b.".format(sess.run(tcond,{I:1})))
print("{}\tNow we see that b has been updated, but a has not.".format(sess.run([a,b])))
print("{}\t\tSo now the value is 2 instead of 1.5 like it should be.".format(sess.run(tcond,{I:2})))
输出为:
[True, 10.0] The initial values of a and b
1.0 Run, tcond1. output is the updated value of b.
[True, 1.0] Now we see that b has been updated, but a has not.
2.0 So now the value is 2 instead of 1.5 like it should be.
现在,我知道我需要一行,比如sess.run(acond)
,其中acond
是make_函数
中条件的输出,但是我不能返回它,因为我的函数只需要返回b
(而不是a
)的值,我不想在第一次训练迭代中需要记住运行一个额外的op,但不想在其他迭代中运行
那么,有没有一种方法可以将赋值op
acond
添加到计算图中,而无需显式返回并使用它运行sess.run
?将此操作添加到自定义集合中,然后在最终op(例如训练op
)和acond
之间创建依赖关系
方法内部:
tf.add_to_collection("to_run", acond)
在最终op的定义中:
to_run = tf.get_collection("to_run")
with tf.control_dependencies(to_run):
final_op = <something>
to_run=tf.get_集合(“to_run”)
使用tf.control_依赖项(to_run):
最终结果=
当您运行final_op
时,您确信您的acond
已经执行