上一篇我介绍了如何使用Tensorflow的重载操作。这一篇我会说一说Tensorflow中执行顺序和控制依赖关系的理解。
Tensorflow不会立即运行已定义的操作,而是会在图形中创建相应的节点,并使用Session.run()方法对其进行计算。这使的Tensorflow在运行时可以进行优化,确定以最佳的执行顺序并尽可能修剪未使用的节点。如下例子,这里我们创建3个张量,两个常量张量和另一个存储加法结果的张量。在这里我们是不能覆盖张量的值,如果要修改张量值,我们必须创建一个新的张量然后再赋值给它。运行结果是3。
注意:如果图中只有tf.Tensors,我们是不需要担心依赖关系的,但是我们有可能会用到tf.Variables,tf.Variables会让依赖关系变得更加复杂。所以我们尽量使用张量,只有张量不能工作时才让Variables来做。
与张量不同,变量是可更新的。如何我们使用变量来做上面同样的事情。
运行结果也是3。tf.assign返回值是一个表示分配值的张量。
到目前为止,一切看起来都很好,但我们看一个稍微复杂一些的例子。
张量c在这里会出现不确定性值,这个值可能是3或7,取决于相加操作和赋值操作哪个先执行。
在代码中定义的操作顺序与Tensorflow运行是无关的。唯一需要关注的是控制依赖关系。张量的控制依赖性很简单,每次在一个操作中使用张量时,该操作都会定义该张量的隐式依赖关系。当处理变量时,需要使用tf.control_dependencies()按如下方式显式定义依赖关系。
张量c在这里只有一个结果3,上述代码控制依赖关系是赋值操作依赖于加操作的,即先执行加操作再执行赋值操作的。