2017-10-11 135 views
0

我正在學習tensorflow過程,但是有很多難以理解的過程。Tensorflow,節點已經死了

  1. 我不完全理解的術語之一是關於節點。在源代碼(C++核心)中,有許多不同類型的節點。不過,我對死亡節點感到好奇。它會和常量節點不同。我想知道死亡節點存在的原因,換句話說,死亡節點的作用。

  2. 什麼是實時數據vs死亡數據?這就像沒有使用過的數據和已經使用過的數據? ......我想我對這個詞還沒有完全理解。它可以在功能ActivateNodes()(executor.cc)

顯示在我認爲這些問題可以是研究tensorflow如此基本,但是我想確切地知道。

感謝

回答

0

首先,死者張量TensorFlow的控制流結構的實現細節:tf.cond()tf.while_loop()。這些構造使TensorFlow能夠確定是否基於數據相關值執行子圖。

讓我們考慮更簡單的tf.cond(pred, true_fn, false_fn)的情況。 pred的值確定是否將執行true_fnfalse_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_fnfalse_fn的結果,因此所採用分支的結果作爲整體tf.cond()子圖的輸出返回。

+0

感謝您的回覆。然而,我並沒有完全理解你的答案。 我可以問一件事嗎? 據我所知,在tf.cond()中,Switch op和Merge op用於根據pred應用適當的結果。 但是我不確定死張量傳播。如果Merge op不存在,那麼已經收到死張量的張量作爲輸入,張量將發送到所有輸出的死張量,對嗎?在這一點上,爲什麼他們發送死張量輸出?有沒有什麼辦法可以消除死張量? – jwl1993

+0

我意識到一些問題,我問。我認爲消除是不可能的,因爲我們不知道下一次迭代會改變什麼狀態,所以我們不能手動管理死張量。當死張量輸出有另一個過程時,發送過程也是必要的。我在正確的軌道上嗎? – jwl1993

+0

對,'合併'操作是唯一可以「移除」死張量的支持機制。當有多個進程時,可以使用標準的'Send'和'Recv'操作程序在它們之間發送死張量。 – mrry