Tensorflow 初級教程(一)


初步介紹

Google 於2011年推出人工深度學習系統——DistBelief。通過DistBelief,Google能夠掃描數據中心數以千計的核心,並建立更大的神經網絡。Google 的這個系統將Google 應用中的語音識別率提高了25%,以及在Google Photos中建立了圖片搜索,並驅動了Google的圖片字幕匹配實驗。但它很難被設置,沒有開源。

2015年11月,第二代分布式機器學習系統Tensorflow在github上開源!

2016年4月,發布了分布式版本!

2017年1月,發布了1.0預覽版。API接口趨於穩定。同年3月發布了可用於工業級場景的1.0正式版!

Tensorflow優點:

1.既是一個實行機器學習算法的接口,同時也是執行機器學習算法的框架

2.Tensorflow 前端支持python,C++,GO,java等多種開發語言

3.Tensorflow 后端使用C++,CUDA等寫成

4.Tensorflow可以在眾多異構系統平台上移植:Android,iphone,TV,普通的CPU服務器以及大規模GPU集群等

5.Tensorflow 除了可以執行深度學習算法,還可以用來實現很多其他算法:線性回歸,隨機森林,支持向量機

6.Tensorflow可以建立大規模深度學習模型的應用場景:語音識別,自然語言處理,機器視覺,機器人控制,信息抽取,醫葯研發等等。

Tensorflow 基礎架構

image

前端負責構造計算圖,后端負責執行計算圖。就像是前端是建築專業,后端是土木專業。

image

Tensorflow 核心概念

1.計算圖

2.操作

3.變量

4會話

一、計算圖

計算圖又被稱為有向圖,數據流圖。數據流圖用結點(nodes)和線(edges)的有向圖來描述數學計算,結點一般用來表示施加的數學操作,但也可以表示數據輸入的起點或者輸出終點,線表示結點之間輸入/輸出的關系,這些數據“線”可以運輸size可動態調整的多維數據數組,即張量(tensor)。

(注:有一類特殊邊中沒有數據流動,這種邊被稱為依賴控制,作用是控制結點的執行順序,它可以讓起始節點執行完畢再去執行目標節點,用戶可以使用這樣的邊進行靈活控制,比如限制內存使用的最高峰值)

例:

image

 

二、操作

一個運算操作代表了一種類型的抽象運算,比如矩陣乘法或向量加法

一個運算操作可以有自己的屬性,但是所有屬性都必須被預先設置,或者能夠在創建計算圖時根據上下文推斷出來

通過設置運算操作的屬性可以用來支持不同的tensor元素類型,比如讓向量加法支持浮點數或者整數

運算核(kernel)是一個運算操作在某個具體的硬件(cpu或gpu)的實現

在Tensorflow中可以通過注冊機制加入新的運算操作或者為已有的運算操作添加新的計算核

image

三、變量

當訓練模型時,用變量來存儲和更新參數。變量包含張量(tensor)存放在內存的緩存區。建模時,他們需要明確的初始化,模型訓練后他們必須要被存儲到磁盤。這些變量的值可在之后模型訓練和分析時被加載。

創建:當創建一個變量時,你將一個張量作為初始值傳入構造函數variable()。Tensorflow提供了一系列操作符來初始化張量,初始值是常量或者隨機值

image

注意,所有這些操作符都是需要你指定張量的shape。那個形狀自動成為變量的shape。變量的shape通常是固定的,但Tensorflow提供了高級的機制來重新調整其行列數。

調用tf.Variable()添加一些操作(Op,operation)到graph:

1.一個variable 操作存放變量的值

2.一個初始化op將變量設置為初始值。這事實上是一個tf.assign操作

3.初始值的操作,例如示例中對biases變量的zeros操作也被加入了graph

tf.Variable的返回值是Python的tf.Variable類的一個實例

 

 

變量的初始化

一次性全部初始化

變量的初始化必須在模型的其他操作運行之前先明確地完成。最簡單的方法是添加一個給所有變量初始化的操作,並在使用模型之前首先運行那個操作。

image

使用tf.initialize_all_variables()台南佳一個操作對變量做初始化。記得在完全構建好模型並加載之后再運行那個操作。

自定義初始化

tf.initialize_all_variables()函數便捷地添加一個op來初始化模型地所有變量。你也可以給它出入一組變量進行初始化。

 

由另一個變量初始化

你有時候會需要用另一個變量地初始化值給當前變量初始化。由於tf.initialize_all_variables()是並行地初始化所有變量,所以再有這種需求地情況下需要小心。

用其他變量地值初始化一個新的變量時,使用其他變量的initialized_value()屬性。你可以直接把已初始化的值作為新變量的初始值,或者把它當作tensor計算得到一個值賦予新變量

image

四、會話

完成全部的構建准備、生成全部所需的操作之后,我們就可以建立一個tf.Session,用於運行圖標

sess=tf.Session()

另外,也可以利用with代碼生成Session,限制作用域:

with tf.Session() as sess:

Session函數沒有傳入參數,表明該代碼將會依附於(如果還沒有創建會話,則會創建新的會話)默認的本地會話。

生成會話之后,所有tf.Variable實例都會立即通過調用各自初始化操作中的sess.run()函數進行初始化

 

 

Tensorflow 實現原理

image

TensorFlow有一個重要組件client,也就是客戶端,它通過Session的接口與master以及多個worker相連接。每一個worker可以與多個硬件設備連接,比如cpu和GPU,並負責管理這些硬件。Master則負責指導所有的worker按照流程執行計算圖。

Tensorflow有單機模式和分布式模式。單機模式下,client,master,worker全部在同一台計算機上的同一個進程中。分布式模式允許client,master,worker在不同機器的不同進程中,同時由集群調度系統統一管理各項任務

image

 

TensorFlow中每一個worker可以管理多個設備,每一個設備的name包含硬件類別、編號、任務號(單機版本沒有)。

TensorFlow為CPU和GPU提供管理設備的對象接口,每一個對象負責分配、釋放設備內存,以及執行節點的運算核。TensorFlow中的Tensor是多維數組,數據類型支持8位至64位的int,以及IEEE標准的float.double.complex.string。

 

在只有一個硬件設備的情況下,計算圖會按照依賴關系被順序執行。當一個節點的所有上游依賴全部執行完畢(依賴數==0),這個節點就會被加入就緒隊列(ready queen)以等待執行。同時這個節點的下游節點的依賴數自動減1。

 

當多個設備的時候,情況就變得復雜了。主要有兩大難點:

(1)每一個節點該讓什么設備執行?

TensorFlow設計了一套為節點分配設備的策略。這個策略首先需要計算一個代價模型。代價模型首先估算每一個節點的輸入,輸出Tensor的大小,以及所需要的計算時間。代價模型一部分由人工經驗指定的啟發式規則得到,另一部分則是對一小部分數據進行實際運算測量得到。

接下來,分配策略會模擬執行整個計算圖,從起點開始,按照拓撲序執行。並在執行一個節點時,會把每一個能執行這個節點的設備都測試一遍,測試內容包括計算時間的估算以及數據傳遞所需要的通信時間。最后選擇一個綜合時間最短的設備計算相應的節點。這是一個簡單的貪婪策略。

除了運算時間,內存的最高使用峰值也會被考慮進來。

Tensor flow的節點分配策略仍在不斷優化改進。未來,可能會用一個強化學習的神經網絡來輔助節點分配。同時,用戶可以自定義某些分配限制條件。
(2)如何管理節點間的數據通信?

當給節點分配設備的方案被確定,整個計算圖就會被划分為許多子圖了,使用同一個設備並且相鄰的節點會被划分到同一個子圖。然后計算圖中從x到y的邊,會被取代為一個發送端的發送節點(send node),一個接收端的接受節點(receive node),以及從發送節點到接受節點的邊。

把數據通信的問題轉換為發送節點和接受節點的實現問題,用戶不需要為不同的硬件環境實現通信方法。

兩個子圖之間可能會有多個接受節點,如果這些接受節點接受的都是同一個tensor,那么所有這些接受節點會被自動合並為一個,避免了數據的反復傳遞和設備內存占用。

image

發送節點和接受節點的設計簡化了底層的通信模式,用戶無需設計節點之間的通信流程,可以讓同一套代碼自動擴展到不同的硬件環境並處理復雜的通信流程。

image

從單機單設備的版本改造為單機多設備的版本也比較容易。下面的代碼只添加了一行,就實現了從一塊GPU到多塊GPU訓練的改造

image


參考文獻:

http://www.studyai.com/article/a187469c758d4a2884c0fa733fdfe899


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM