首先,死者张量TensorFlow的控制流结构的实现细节:tf.cond()
和tf.while_loop()
。这些构造使TensorFlow能够确定是否基于数据相关值执行子图。
让我们考虑更简单的tf.cond(pred, true_fn, false_fn)
的情况。 pred
的值确定是否将执行true_fn
或false_fn
中的操作。在当前的实施中,pred
馈送到Switch
op,其在一个输入上发送常规张量并在另一个输入上发送死张量。如果pred
为真,则将死张量沿output_false
发送(反之亦然)。tf.cond()
实施已设置,以便true_fn
中的操作依赖于output_true
,而false_fn
中的操作取决于output_false
。
当张量收到死张量作为其输入之一时,它不执行;相反,它会在其所有输出中发送一个死张量。这种死张量传播确保只有适当分支中的操作才会执行。
tf.cond()
如何阻止死张量一直传播到输出?第二个特殊操作,称为Merge
op以不同的方式处理死输入。 A Merge
op具有两个或更多个输入,并且它期望得到除输入的一个之外的所有的死输入;然后它将未死输入转发给它的输出。 tf.cond()
使用Merge
运算符合并来自true_fn
和false_fn
的结果,因此所采用分支的结果作为整体tf.cond()
子图的输出返回。
感谢您的回复。然而,我并没有完全理解你的答案。 我可以问一件事吗? 据我所知,在tf.cond()中,Switch op和Merge op用于根据pred应用适当的结果。 但是我不确定死张量传播。如果Merge op不存在,那么已经收到死张量的张量作为输入,张量将发送到所有输出的死张量,对吗?在这一点上,为什么他们发送死张量输出?有没有什么办法可以消除死张量? – jwl1993
我意识到一些问题,我问。我认为消除是不可能的,因为我们不知道下一次迭代会改变什么状态,所以我们不能手动管理死张量。当死张量输出有另一个过程时,发送过程也是必要的。我在正确的轨道上吗? – jwl1993
对,'合并'操作是唯一可以“移除”死张量的支持机制。当有多个进程时,可以使用标准的'Send'和'Recv'操作程序在它们之间发送死张量。 – mrry