在tf.Operation
中,control_inputs
和inputs
之间的区别是什么? tf.Operation
分别描述了它们,但在正常的事件过程中,我希望“每个数据输入都已准备好”,这正是当前操作能够运行的条件。我错过了什么?
答案 0 :(得分:1)
在张量流中,可以通过tf.control_dependencies
函数添加额外的依赖关系,除了普通的依赖关系(对应于输入)之外,张量流也遵循这些依赖关系。这正是tf.Operation.control_inputs
所持有的。
以下是一个例子:
a = tf.Variable(name='a', initial_value=1.0, trainable=False)
b = tf.Variable(name='b', initial_value=0.0, trainable=False)
c = tf.add(a, b, name='sum')
op = tf.get_default_graph().get_operation_by_name('sum')
print(list(op.inputs)) # [<tf.Tensor 'a/read:0' shape=() dtype=float32>, <tf.Tensor 'b/read:0' shape=() dtype=float32>]
print(op.control_inputs) # []
这是标准情况,毫不奇怪c
只有2个普通输入而没有control_inputs
。评估后,c
值将为1.0
。
但是如果添加一个额外的依赖项,它将改变图形和计算的方式:
a = tf.Variable(name='a', initial_value=1.0, trainable=False)
b = tf.Variable(name='b', initial_value=0.0, trainable=False)
dependent_op = tf.assign(b, a * 3, name='dependent_op')
with tf.control_dependencies([dependent_op]):
c = tf.add(a, b, name='sum')
op = tf.get_default_graph().get_operation_by_name('sum')
print(list(op.inputs)) # [<tf.Tensor 'a/read:0' shape=() dtype=float32>, <tf.Tensor 'b/read:0' shape=() dtype=float32>]
print(op.control_inputs) # [<tf.Operation 'dependent_op' type=Assign>]
请注意,inputs
列表未发生变化,但control_inputs
现在包含dependent_op
。 Tensorflow保证在dependent_op
之前评估sum
,因此,c
将获得值 4.0
。如果您定义c
而没有tf.control_dependencies
阻止,c
将被评估为 1.0
,因为dependent_op
,即使它位于图表,不会被执行。