- Python 深度學習
- 呂云翔 劉卓然 關捷雄等編著
- 2058字
- 2021-04-14 11:54:17
2.2 TensorFlow
2.2.1 TensorFlow簡介
TensorFlow是一個采用數據流圖(Data Flow Graphs)用于數值計算的開源軟件庫。節點(Nodes)在圖中表示數學操作,圖中的線(Edges)表示在節點間相互聯系的多維數據數組,即張量(Tensor)。它靈活的架構使用戶可以在多種平臺上展開計算,如臺式計算機中的一個或多個CPU(或GPU)、服務器、移動設備等。TensorFlow最初由Google大腦小組(隸屬于Google機器智能研究機構)的研究員和工程師們開發出來,用于機器學習和深度神經網絡方面的研究,但這個系統的通用性使其也可廣泛用于其他計算領域。
2.2.2 數據流圖
如圖2.4所示,數據流圖用“結點”(Nodes)和“線”(Edges)的有向圖來描述數學計算。“節點”一般用來表示施加的數學操作,但也可以表示數據輸入(Feed In)的起點/輸出(Push Out)的終點,或者是讀取/寫入持久變量(Persistent Variable)的終點。“線”表示“節點”之間的輸入/輸出關系。這些數據“線”可以輸運“size可動態調整”的多維數據數組,即“張量”。張量從圖中流過的直觀圖像是這個工具取名為“TensorFlow”的原因。一旦輸入端的所有張量準備完成,節點將被分配到各種計算設備完成異步并行地執行運算。

圖2.4 數據流圖
2.2.3 TensorFlow的特點
TensorFlow不是一個嚴格的“神經網絡”庫。只要用戶可以將計算表示為一個數據流圖就可以使用TensorFlow。用戶負責構建圖,描寫驅動計算的內部循環,TensorFlow提供有用的工具來幫助用戶組裝“子圖”,當然用戶也可以在TensorFlow基礎上寫自己的“上層庫”。定義新復合操作與寫一個Python函數一樣容易。TensorFlow的可擴展性相當強,如果用戶找不到想要的底層數據操作,也可以自己寫一些C++代碼來豐富底層的操作。
TensorFlow可在CPU和GPU上運行,如在臺式機、服務器、手機移動設備等。TensorFlow支持將訓練模型自動在多個CPU上規模化運算,以及將模型遷移到移動端后臺。
基于梯度的機器學習算法會受益于TensorFlow自動求微分的能力。作為TensorFlow用戶,只需要定義預測模型的結構,將這個結構和目標函數(Objective Function)結合在一起,并添加數據,TensorFlow將自動為用戶計算相關的微分導數。計算某個變量相對于其他變量的導數僅僅是通過擴展圖來完成的,所以用戶能一直清楚看到究竟在發生什么。
TensorFlow還有一個合理的C++使用界面,也有一個易用的Python使用界面來構建和執行graphs。用戶可以直接寫Python/C++程序,也可以用交互式的Ipython界面來用TensorFlow嘗試些想法,它可以幫用戶將筆記、代碼、可視化等有條理地進行歸置。
2.2.4 TensorFlow的計算形式
TensorFlow中的Flow代表流,是其完成運算的基本方式。流是指一個計算圖或簡單的一個圖,圖不能形成環路,圖中的每個節點代表一個操作,如加法、減法等。每個操作都會形成新的張量。
如圖2.5所示一個簡單的計算圖,所對應的表達式為:e=(a+b)×(b+1),計算圖具有屬性:葉子頂點或起始頂點始終是張量。意即,操作永遠不會發生在圖的開頭,由此可以推斷,圖中的每個操作都應該接受一個張量并產生一個新的張量。同樣,張量不能作為非葉子節點出現,這意味著它們應始終作為輸入提供給操作/節點。計算圖總是以層次順序表達復雜的操作,通過將a+b表示為c,將b+1表示為d,可以分層次組織上述表達式。因此,可以將e寫為e=(c)×(d),這里c=a+b且d=b+1,以反序遍歷圖形而形成子表達式,這些子表達式組合形成最終表達式。當正向遍歷時,遇到的頂點總是成為下一個頂點的依賴關系,如沒有a和b就無法獲得c,同樣,如果不解決c和d則無法獲得e。同級節點的操作彼此獨立,這是計算圖的重要屬性之一。當按照圖中所示的方式構造圖時,很自然的是,在同一級中的節點,如c和d,彼此獨立,這意味著沒有必要在計算d之前計算c。因此它們可以并行執行。

圖2.5 計算圖
計算圖的并行屬性是最重要的屬性之一,它清楚地表明:同級的節點是獨立的,這意味著在c被計算之前不需空閑,可以在計算c的同時并行計算d。TensorFlow充分利用了這個屬性。
TensorFlow允許用戶使用并行計算設備更快地執行操作。計算的節點或操作自動調度進行并行計算。這一切都發生在內部,例如在圖2.5中,可以在CPU上調度操作c,在GPU上調度操作d。圖2.6展示了兩種分布式執行的過程。

圖2.6 TensorFlow并行
圖2.6中,第一種是單個系統分布式執行,其中單個TensorFlow會話(將在稍后解釋)創建單個worker,并且該worker負責在各設備上調度任務。在第二種系統下,有多個worker,它們可以在同一臺機器上或不同的機器上,每個worker都在自己的上下文中運行。圖2.6中,worker進程1運行在獨立的機器上,并調度所有可用設備進行計算。
計算子圖是主圖的一部分,其本身就是計算圖。如在圖2.5中可以獲得許多子圖,其中之一如圖2.7所示。

圖2.7 計算子圖
圖2.7是主圖的一部分,從屬性2可以看出子圖總是表示一個子表達式,因為c是e的子表達式。子圖也滿足最后一個屬性。同一級別的子圖也相互獨立,可以并行執行。因此可以在一臺設備上調度整個子圖。
如圖2.8所示解釋了子圖的并行執行。這里有2個矩陣乘法運算,因為它們都處于同一級別,彼此獨立,這符合最后一個屬性。由于獨立性的緣故,節點安排在不同的設備gpu_0和gpu_1上。

圖2.8 子圖調度
TensorFlow將其所有操作分配到由worker管理的不同設備上。更常見的是,worker之間交換張量形式的數據,如在e=(c)*(d)的圖表中,一旦計算出c,就需要將其進一步傳遞給e,因此Tensor在節點間前向流動,如圖2.9所示。

圖2.9 worker間信息傳遞
通過以上介紹,希望讀者可以對TensorFlow的一些基本特點和運轉方式有大致了解。