Python AdamOptimizer不依赖于tf.control\u
不知何故,Python AdamOptimizer不依赖于tf.control\u,python,tensorflow,Python,Tensorflow,不知何故,AdamOptimizer无视tf.control\u依赖关系 这是一个测试。我要求TensorFlow执行以下操作: 计算损失 计算损失 跑亚当的一步 我使用“确保”TF在运行步骤2之后运行步骤3 如果TensorFlow按正确的顺序执行这3个步骤,则步骤1和步骤2的结果应相同 但事实并非如此。怎么了 测试: 将numpy导入为np 导入tensorflow作为tf x=tf.get_变量('x',初始值设定项=np.array([1],dtype=np.float64)) 损耗=
AdamOptimizer
无视tf.control\u依赖关系
这是一个测试。我要求TensorFlow执行以下操作:
测试:
将numpy导入为np
导入tensorflow作为tf
x=tf.get_变量('x',初始值设定项=np.array([1],dtype=np.float64))
损耗=x*x
optim=tf.列车AdamOptimizer(1)
##控制依赖项##
使用tf.control_依赖项([loss]):
列车运行=优化最小化(损失)
##跑##
init_op=tf.global_variables_initializer()
使用tf.Session()作为sess:
sess.run(初始化操作)
对于范围(1000)内的i:
a=sess.run([损失])
b=安全运行([损失,列车运行])[0]
印刷品(a、b)
断言np.allclose(a,b)
结果:
[array([1.])] [2.50003137e-14]
AssertionError
[array([1.])] [1.]
[array([2.50003137e-14])] [2.50003137e-14]
[array([0.4489748])] [0.4489748]
...
[array([1.151504e-47])] [1.151504e-47]
[array([4.90468459e-46])] [4.90468459e-46]
第1步和第2步的结果不一样。听起来好像您希望
sess。运行([loss,adam_op])
运行loss
,然后运行adam_op
。唉,sess.run不是这样工作的。举一个简单的例子——它打印1.01.0
,表示set\ux
op在get\ux
之前运行
import tensorflow as tf
var_x = tf.get_variable("x", shape=[], initializer=tf.zeros_initializer())
get_x = var_x.read_value()
set_x = var_x.assign(1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
a, b = sess.run([get_x, set_x])
print(a, b)
根据
tf.identity(loss)
执行步骤3将神奇地解决问题
发生了什么事
魔法修复:
将numpy导入为np
导入tensorflow作为tf
x=tf.get_变量('x',初始值设定项=np.array([1],dtype=np.float64))
损耗=x*x
optim=tf.列车AdamOptimizer(1)
##控制依赖项##
loss2=tf.identity(loss)#我认为tf.control\u依赖关系将确保tensorflow在adam之前丢失。您的示例没有使用tf.control\u依赖项
。doc:它在Adam之前确实会运行loss--即使您根本没有使用控件依赖项,它也会运行loss。但是,损失取决于Adam更新的变量,因此之后必须再次计算。