2016-02-18 35 views
3

優化器通常運行相同的計算圖表,直到收斂爲止。 tensorflow是否在開始時設置圖形並在每一步中重新使用它?如果在培訓期間更改批量,該怎麼辦?如果我像改變損失函數那樣對圖形進行一些負面改變會怎樣?如果我對圖表做了一些重大更改會怎麼樣?張量流預先生成所有可能的圖嗎?當圖形變化時,tensorflow是否知道如何優化整個計算?在什麼階段建立了張量流圖?

回答

4

TensorFlow只顯示一個對用戶可見的圖形,即用戶指定的圖形。用戶可以使用Session.run()或在某張張上調用Tensor.eval()來運行圖形。一個Session.run()調用可以指定一些張量被饋送和其他被提取。根據需要提取的內容,TensorFlow運行時可以在內部構建並優化各種數據結構,包括用戶可見圖的修剪版本。但是,這個內部圖對於用戶來說是不可見的。不,TensorFlow不會「預先生成」所有可能的圖形。是的,TensorFlow確實對計算圖進行了廣泛的優化。最後,改變饋送張量的批量大小並不會改變圖的結構。

+0

@mrry謝謝。如果Session.run()在不同的張量/操作符上被調用兩次,我仍然不太瞭解會發生什麼情況,這可能需要不同的計算圖。 (在典型的優化問題中,會反覆調用Session.run()來執行相同的操作,但操作原則上可能會更改。) – user3320467

+0

我添加了一個解答您的後續問題的答案。讓我知道,如果它弄清楚了事情! – mrry

+0

@mrry明白了。現在清除。非常感謝! – user3320467

6

keveman says,從客戶的角度來看,有一個單一的TensorFlow圖。在運行系統中,可以有多個子圖,其中只包含計算值t1t2等所需的節點,這些節點在調用sess.run([t1, t2, ...])時可以獲取。

如果你打電話sess.run([t1, t2])將消減整體圖(sess.graph)降至來計算這些值所需的子:即產生t1t2及其所有祖先的操作。如果您隨後調用sess.run([t3, t4]),則運行時會將圖形剪除到計算t3t4所需的子圖。每當您傳遞一個新的值組合時,TensorFlow將計算一個新的修剪圖並緩存它,這就是爲什麼第一個sess.run()可能比後面的要慢一些。

如果修剪後的圖形重疊,TensorFlow將重新使用共享操作的「內核」。這是相關的,因爲某些操作(例如tf.Variabletf.FIFOQueue)是有狀態,並且它們的內容可以在兩個剪枝圖中使用。例如,您可以使用一個子圖初始化變量(例如sess.run(tf.initialize_all_variables())),使用另一個子圖(例如sess.run(train_op))對它們進行訓練,然後使用第三個評估您的模型(例如sess.run(loss, feed_dict={x: ...}))。它還允許您用一個子圖將元素排入隊列,並使其與另一個子隊列出隊,這是input pipelines的基礎。

+0

重要的是要注意修剪不包括修剪'tf.cond'節點的不活動分支。 「fn1」和「fn2」的輸入仍保留在圖中並進行計算。只有'fn1'和'fn2'函數中定義的節點纔有條件地計算。 –

相關問題