这段代码工作正常:
import tensorflow as tf
x = tf.Variable(initial_value=0)
with tf.Session() as session:
print session.run(x.assign(1))
但是此代码失败:
import tensorflow as tf
x = tf.Variable(initial_value=0)
supervisor = tf.train.Supervisor(logdir="/tmp")
with tf.Session() as session:
print session.run(x.assign(1))
唯一的区别是tf.train.Supervisor
的实例化。请注意,我们甚至不使用主管来创建托管会话。
错误是:
python tf_supervisor_freeze.py
Traceback (most recent call last):
File "tf_supervisor_freeze.py", line 6, in <module>
print session.run(x.assign(1))
File "<virtual_env_path>/lib/python2.7/site-packages/tensorflow/python/ops/variables.py", line 522, in assign
return state_ops.assign(self._variable, value, use_locking=use_locking)
File "<virtual_env_path>/lib/python2.7/site-packages/tensorflow/python/ops/gen_state_ops.py", line 47, in assign
use_locking=use_locking, name=name)
File "<virtual_env_path>/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 491, in apply_op
preferred_dtype=default_dtype)
File "<virtual_env_path>/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 702, in internal_convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
File "<virtual_env_path>/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 110, in _constant_tensor_conversion_function
return constant(v, dtype=dtype, name=name)
File "<virtual_env_path>/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 103, in constant
attrs={"value": tensor_value, "dtype": dtype_value}, name=name).outputs[0]
File "<virtual_env_path>/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2286, in create_op
self._check_not_finalized()
File "<virtual_env_path>/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2009, in _check_not_finalized
raise RuntimeError("Graph is finalized and cannot be modified.")
RuntimeError: Graph is finalized and cannot be modified.
Process finished with exit code 1
如果使用 tf.train.Supervisor(logdir="/tmp", summary_op=None, saver=None)
禁用某些主管的服务,则仍然存在错误。
这个问题是由Github上的其他人提出的,但没有提供答案;请求是在StackOverflow上提出这个问题。唯一相关的StackOverflow问题似乎没有解决这个特定情况。
正如错误所说,当图形最终确定时,您无法修改图形。
RuntimeError("图形已完成,无法修改。
当执行此代码时 tf.train.Supervisor()
,图形将被定稿。你可以在 1.0 版本的 tensorflow 中使用路径/tensorflow/python/training/supervisor.py 检查它的代码。
你会发现这个:
# The graph is not allowed to change anymore.
graph.finalize()
因此,您无法在Supervisor()
后修改图形。
我无法解释原因,但我已经找到了解决方法。这有效:
import tensorflow as tf
x = tf.Variable(initial_value=0)
a = x.assign(1)
supervisor = tf.train.Supervisor(logdir="/tmp")
with tf.Session() as session:
print session.run(a)
所做的只是将分配操作的创建移动到创建主管之前(即 a = x.assign(1)
(。看起来主管确实冻结了图形,以防止在主管创建后创建或更准确地使用新操作。
赋值操作是图形中的新操作。如果该操作是在 Graph 完成之前定义的(即使稍后执行(,则没问题。
执行操作会有效地为变量赋值。这可以在图形完成后安全地完成,因为它不会更改图形。
底线是:- 在图完成之前声明操作- 运行它们之后。