首先,死者張量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