Tensorflow-获取变量的最后/当前值,而不计算图形

Tensorflow-获取变量的最后/当前值,而不计算图形,tensorflow,Tensorflow,我有一个变量,在培训期间偶尔会手动更新。为了进行调试,我想查询这个变量的值而不更新它,即只获取它的当前值。然而,当我调用session.runmy_var时,我得到一个例外,我没有提供图形所需的输入,这意味着Tensorflow试图重新计算变量,而不是简单地返回其值 有没有办法解决这个问题并直接查询变量的当前值?在TensorFlow中使用变量有时会令人困惑。当您执行my_var=tf.Variable时。。。或者my_var=tf.get_variable…,my_var是一个可以在会话期间保

我有一个变量,在培训期间偶尔会手动更新。为了进行调试,我想查询这个变量的值而不更新它,即只获取它的当前值。然而,当我调用session.runmy_var时,我得到一个例外,我没有提供图形所需的输入,这意味着Tensorflow试图重新计算变量,而不是简单地返回其值


有没有办法解决这个问题并直接查询变量的当前值?

在TensorFlow中使用变量有时会令人困惑。当您执行my_var=tf.Variable时。。。或者my_var=tf.get_variable…,my_var是一个可以在会话期间保存值的对象。众所周知,变量在会话中使用之前必须进行初始化,并且可以在对的调用中更改其值,并将其保存以供下次调用

如果执行my_var/=2或my_var=my_var/2,那么my_var将不再是一个变量,而只是一个张量,它是使用变量的值计算的。重要的是,这不会改变最初创建的变量的值,因此在一个会话中多次运行它将始终产生相同的结果。在图中,这是一个以变量和2作为输入的divide节点。要更改该值,可以执行my_var=tf.assignmy_var/2。这还将生成divide节点,但也会生成另一个assign节点,该节点更改变量的存储值,并将my_var设置为新分配的值。最后一点很重要,因为如果我们只是在之后继续使用原始变量对象,一般来说,我们无法判断是使用原始值还是更新值。看看这个例子:

导入tensorflow作为tf 使用tf.Graph.as_默认值,tf.Session作为sess: my_var=tf.Variable0 my_var_2=2*my_var my_var_upd=tf.assignmy_var,my_var+1 init=tf.global\u variables\u初始值设定项 sess.runinit 对于范围10中的i: printses.runmy\u var\u 2,my\u var\u upd 它在一次运行中为我提供了以下输出:

(0, 1)
(2, 2)
(4, 3)
(8, 4)
(8, 5)
(10, 6)
(12, 7)
(14, 8)
(16, 9)
(18, 10)
您可能期望my_var_2是my_var的原始值乘以2,但在一种情况下,它是更新后的my_var_upd乘以2。这是因为TensorFlow执行相互不依赖的节点(如my_var_2和my_var_upd)的顺序是不确定的,即使my_var_2是在赋值操作之前定义的。解决此问题的一种方法是使用显式声明在执行以下操作之前需要执行的操作:

... 使用tf.control_依赖项[my_var_2]: 将仅在执行my_var_2之后发生 my_var_upd=tf.assignmy_var,my_var+1 ...
我们需要查看代码,但很可能有类似my_var=tf.assign的东西。。。在某个时刻。您需要使用原始变量对象调用session.run,然后如果您想更新它,您可以执行例如my_var_updated=tf.assign…谢谢。my_var/=2和my_var=tf.assignmy_var/2之间有什么区别?我现在使用的是formerRight,实际上它们是完全不同的东西。my_var/=2与my_var=my_var/2相同,这意味着my_var的值除以2`duh。my_var=tf.assignmy_var/2意味着取my_var的值,除以2,然后将my_var设置为该值,以便下次调用session.run时它具有该值,最后将my_var设置为更新后的变量值,用于同一调用session.run中的其他操作。所以如果我的变量是10,运行前几次总是会给你5,而第二次会给你5,2.5,1.25,等等,因此,编写my_var/=2实际上会为该操作分配一个图形节点,而不会更改分配给my_var的实际值。my_var=tf.assignmy_var/2会为该操作创建一个节点,并将结果的值分配给my_var。正确吗?是的,这完全正确。