TensorFlow的個人理解

本篇文章只是基於自己對TensorFlow使用過程中的個人理解,以及一些基本注意事項。

TensorFlow™ 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟件庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯繫的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU),服務器,移動設備等等。TensorFlow 最初由Google大腦小組(隸屬於Google機器智能研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網絡方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。

這是 TensorFlow 中文社區,這其特徵提到:線是 tensor 類型,是一種多維數組,需要注意的是
- tensor 類型是不可迭代的
- tensor 類型和 list 類型可以相互轉換,且 list 類型在圖中不影響梯度傳遞
- 在計算圖中,不可使用非數學計算符號,比如用 if 做一個數據過濾 這一條需要解釋一下,如果你做一個條件過濾,相當於做一個截斷,梯度無法傳遞給 if 條件之前的變量,之前的變量都會被當成常量。比如你用 TensorFlow 寫一個 GAN (對抗式生成網絡),需要做一個變量選取,如果在生成模型的輸出做一個條件選取,那麼生成模型的全部變量將無法被梯度下降優化器做優化。
- 關於 tf.variable_scope 的理解 網上說了很多原因爲什麼需要這樣做的原因,我決定直接從結果上來說,或者說 TensorFlow 的規定來說(個人愚見)。以 LSTM 爲例(LSTM是RNN的一個變種),在一個 variable_scope 中只允許有一個 LSTM 實例。如果你使用了 LSTMCell 這種類,你很可能直接將其封裝在一個函數裏,然後建立圖表的時候調用一次,這時候其實你是失去了對那個 LSTMCell 實例的控制(就是你想再用一次這個實例其實是沒辦法做到的),但是TensorFlow會給你記着它裏面的所有變量,所以 TensorFlow 只允許有一個 LSTMCell 實例,如果你需要用兩個 LSTMCell 實例,那麼再開一個 variable_scope 就可以了。同時 variable_scope 可以傳給梯度下降優化器,可以選擇一些變量進行優化,其他的變量當成常量。
- TensorFlow一般情況下是先構建計算圖,對於數據使用 placeholder 進行佔位,之後用feed_dict進行填充,其實也可以直接將數據當成常量投餵給計算圖,不過需要解決迭代問題。參見第一條。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章