Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使tensorflow赋值成为计算图的一部分而不显式运行其输出?_Tensorflow - Fatal编程技术网

如何使tensorflow赋值成为计算图的一部分而不显式运行其输出?

如何使tensorflow赋值成为计算图的一部分而不显式运行其输出?,tensorflow,Tensorflow,我试图在tensorflow中创建一个自定义梯度,以实现本文()中建议的对数的指数平滑(无偏)梯度。我需要做的是对一个新变量进行折痕处理,该变量存储一个指数平滑的值,该值将在自定义梯度函数中更新和使用。此外,我需要一个标志,它告诉我何时进行第一次梯度计算,以便我可以将指数平滑值初始化为适当的(依赖于数据的)值。此外,自定义渐变函数的输出必须是渐变,因此从自定义渐变内部访问tf.assign的输出将是一件痛苦的事情。最后,我不想创建第二个“手动”初始化指数平滑的操作,方法是在我的训练循环中单独运行

我试图在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
已经执行