###關於 TensorFlow
TensorFlow 是一個采用數據流圖(data flow graphs),用於數值計算的開源軟件庫。
節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯系的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平台上展開計算,例如台式計算機中的一個或多個CPU(或GPU),服務器,移動設備等等。
TensorFlow 最初由Google大腦小組(隸屬於Google機器智能研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網絡方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。
###核心概念:數據流圖
數據流圖用“結點”(nodes)和“線”(edges)的有向圖來描述數學計算。
“節點” 一般用來表示施加的數學操作,但也可以表示數據輸入(feed in)的起點/輸出(push out)的終點,或者是讀取/寫入持久變量(persistent variable)的終點。
“線”表示“節點”之間的輸入/輸出關系。這些數據“線”可以輸運“size可動態調整”的多維數據數組,即“張量”(tensor)。
張量從圖中流過的直觀圖像是這個工具取名為“Tensorflow”的原因。一旦輸入端的所有張量准備好,節點將被分配到各種計算設備完成異步並行地執行運算。
更詳細的介紹可以查看tensorflow中文社區:http://www.tensorfly.cn/
TensorFlow主要是由計算圖、張量以及模型會話三個部分組成。
###計算圖
在編寫程序時,我們都是一步一步計算的,每計算完一步就可以得到一個執行結果。
在TensorFlow中,首先需要構建一個計算圖,然后按照計算圖啟動一個會話,在會話中完成變量賦值,計算,得到最終結果等操作。
因此,可以說TensorFlow是一個按照計算圖設計的邏輯進行計算的編程系統。
TensorFlow的計算圖可以分為兩個部分:
- 構造部分,包含計算流圖;
- 執行部分,通過session執行圖中的計算。
構造部分又分為兩部分:
- 創建源節點;
- 源節點輸出傳遞給其他節點做運算。
TensorFlow默認圖:TensorFlow python庫中有一個默認圖(default graph)。節點構造器(op構造器)可以增加節點。
####張量
在TensorFlow中,張量是對運算結果的引用,運算結果多以數組的形式存儲,與numpy中數組不同的是張量還包含三個重要屬性名字、維度、類型。
張量的名字,是張量的唯一標識符,通過名字可以發現張量是如何計算出來的。比如“add:0”代表的是計算節點"add"的第一個輸出結果。維度和類型與數組類似。
####模型會話
用來執行構造好的計算圖,同時會話擁有和管理程序運行時的所有資源。
當計算完成之后,需要通過關閉會話來幫助系統回收資源。
在TensorFlow中使用會話有兩種方式。第一種需要明確調用會話生成函數和關閉會話函數
import tensorflow as tf
# 創建session
session = tf.Session()
#獲取運算結果
session.run()
#關閉會話,釋放資源
session.close()
第二種可以使用with的方式
with tf.Session() as session:
session.run()
兩種方式不同的是,第二種限制了session的作用域,即session這個參數只適用於with語句下面,同時語句結束后自動釋放資源,
而第一種方式session則作用於整個程序文件,需要用close來釋放資源。
###tensorflow分布式原理
tensorflow的實現分為了單機實現和分布式實現。
單機的模式下,計算圖會按照程序間的依賴關系順序執行。
在分布式實現中,需要實現的是對client,master,worker process,device管理。
-
client也就是客戶端,他通過session的接口與master和worker相連。
-
master則負責管理所有woker的計算圖執行。
-
worker由一個或多個計算設備device組成,如cpu,gpu等。
具體過程如下圖:
在分布式實現中,tensorflow有一套專門的節點分配策略。
策略是基於代價模型,代價模型會估算每個節點的輸入,輸出的tensor大小以及所需的計算時間,然后分配每個節點的計算設備。
###擴展功能
在tensorflow中比較重要的拓展功能有,自動求導,子圖執行,計算圖控制流以及隊列/容器
求導是機器學習中計算損失函數常用的運算,TensorFlow原生支持自動求導運算,它是通過計算圖中的拓展節點實現。
子圖執行是通過控制張量的流向實現。
計算圖控制流:是指控制計算圖的節點極其運行的設備管理,它提供了快速執行計算和滿足設備施加的各種約束。比如限制內存總量為了執行它的圖子集而在設備上所需的節點。
隊列是一個有用的功能,它們允許圖的不同部分異步執行,對數據進行入隊和出隊操作。
容器是用來存放變量,默認的容器是持久的,直到進程終止才會清空,同時容器中的變量也可以共享給其他計算圖使用。
詳細的細節可查看TensorFlow的介紹pdf
https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45166.pdf