tf操作control_inputs vs输入

时间:2017-11-14 10:57:45

标签: python tensorflow

tf.Operation中,control_inputsinputs之间的区别是什么? tf.Operation分别描述了它们,但在正常的事件过程中,我希望“每个数据输入都已准备好”,这正是当前操作能够运行的条件。我错过了什么?

1 个答案:

答案 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,即使它位于图表,不会被执行。