1. 程式人生 > >TensorFlow實戰--閱讀筆記part1

TensorFlow實戰--閱讀筆記part1

運算 是你 cnblogs 自動 關於 9.png 識別 會計 兩種

這本書適合看過官方文檔或其他基礎教程的人,講的多是些具體網絡的實現

一、tensorflow基礎

技術分享

技術分享

tensorflow的操作流程

1. 自定義節點,自定義有向圖,一般是把整個流程圖都定義完整

技術分享技術分享

每個需要看輸出結果的節點都必須有顯式地進行定義,形式如 node=...... 比如2,3,4,5,6行等

對於不需要進行輸出的節點可以不進行顯示定義,比如Add

2. 通過Session的run方法進行執行計算圖

每次run都是指定一個節點計算,比如說: tf.Session.run(ReLU)

我們要計算ReLU的話,同時它依賴的一些節點都會按順序進行計算,比如說Add,MatMul,

同時我們看到還需要有輸入x, 那麽我們需要把x作為參數輸入到run函數:

tf.Session.run(ReLU,feed_dict={x:input})

其中x是定義的placeholder節點,作為外部輸入的節點類型都為tf.placeholder

input是實際的數據(矩陣或者列表)

W,b是定義的變量節點 tf.Variable, 註意V是大寫

3. 總結

  • 如果創建圖之後發現圖不夠完整還需要添加邊或者節點,可以通過Session的Extend方法添加新的節點或者邊
  • Session的run方法執行計算圖時,用戶需要給出需要計算的結點,也就是你所想要看到的結果,同時還要提供輸入數據,Tensorflow就會自動尋找所有需要計算的節點並按依賴順序執行它們。通常來說,都是創建一次計算圖,然後反復地執行整個計算圖或是其中的一部分子圖
  • 計算圖會被執行多次,但是數據(tensor)不會被持續保留,只是在計算圖中過一遍,也就是為什麽取名叫tensorflow了,數據流過無痕
  • 比如說你計算ReLU節點的時候會計算Matmul結點,但是數據不會保留,則是只會輸入ReLU結果,所以當你還要看Matmul結果時,你需要重新計算Matmul節點
  • 上面所說的是計算的中間結果不會保存,但是Variable作為一種特殊的運算操作,它可以將一些需要保留的tensor存儲在內存或顯存中,比如神經網絡模型中的系數。每一次執行計算圖後,Variable中的數據tensor會被保存,同時在計算過程中這些tensor也可以被更新,比如神經網絡的每一次mini-batch訓練時,神經網絡的系數將會被更新並保存

Tensorflow的實現原理(設備管理)

client客戶端, 通過Session的接口與master及多個worker相連。其中每一個worker與多個硬件設備相連(CPU/GPU),並負責管理這些硬件

master則負責指導所有worker按流程執行計算圖

Tensorflow有單機模式和分布式模式兩種實現:

  • 單機模式:client,master,worker全部在一臺機器上的同一個進程中
  • 分布式模式:允許client,master,worker在不同機器的不同進程中,同時由集群調度系統統一管理各項任務

      技術分享

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

單機模式:/job:localhost/device:cpu:0
分布式模式:/job:worker/task:17/device:gpu:3

在只有一個硬件設備的情況下,計算圖會按依賴關系被順序執行。當一個節點的所有上遊依賴都被執行完時(依賴數為0),這個節點就會被加入ready queue以等待執行。同時,它下遊所有節點的依賴數減1,實際上這就是標準的計算拓撲序的方式。當有多個設備時,情況就比較復雜了,難點有二:

  1. 每一個節點該讓什麽硬件設備執行: tensorflow設計了一套為節點分配設備的策略,有相應的代價模型,會選擇一個綜合實踐最短的設備作為節點的運算設備。以後還會改進
  2. 如何管理節點間的數據通信:把數據通信的問題轉變為發送節點和接收節點的實現問題,用戶不需要為不同的硬件環境實現通信方法

    技術分享

Tensorflow分布式執行時的通信和單機設備間的通信很像,只不過是對發送節點和接收節點的實現不同:比如從單機的CPU到GPU的通信,變為不同機器之間使用TCP或者RDMA傳輸數據。

Tensorflow擴展功能

tensorflow自動求導

如下圖,當tensorflow計算一個tensor C關於tensor I的梯度時,會先尋找從I到C的正向路徑,然後從C回溯到I,對這條回溯路徑上的每一個節點增加一個對應求解梯度的節點,並根據鏈式法則計算總的梯度,這就是反向傳播算法。這些新增的節點會計算梯度函數比如[db,dW,dx] = tf.gradients(C,[b,W,x])

      技術分享

問題:當計算反向傳播時,可能需要用到前面圖開頭的一些tensor,然而這些中間結果tensorflow不會保存,保存tensor會占用太多內存或顯存,所以一般不進行保存而選擇重新計算,tensorflow仍在持續改進這些問題

二、Tensorflow和其他深度學習框架的對比

tensorflow優點

設計神經網絡結構的代碼的簡潔度

分布式深度學習算法的執行效率

部署的便利性

技術分享

技術分享

技術分享

Caffe

caffe優點:

  • 容易上手,網絡結構都是以配置文件形式定義,不需要用代碼設計網絡
  • 訓練速度快,能夠訓練state-of-the-art 的模型和大規模的數據
  • 組件模塊化,可以方便地拓展到新的模型和學習任務上
  • 擁有大量的訓練好的經典模型,收藏在 Model Zoo

caffe缺點:

  • 實現新layer時,需要將正向和反向兩種計算過程的函數都實現,這部分計算需要用戶自己寫C++或CUDA(當需要運行在GPU上)代碼,對普通用戶來說非常難上手
  • Caffe最初設計時的目標只針對圖像,沒有考慮文本語音等時間序列數據,所以caffe對CNN支持非常好, 但是對RNN支持不充分
  • caffe的配置文件不能用編程的方式調整超參,不方便進行交叉驗證,超參數的Grid Search等

Theano

theano優點:

  • 集成Numpy,可以直接使用Numpy的ndarray,API接口學習成本低
  • 計算穩定性好,比如可以精準地計算輸出值很小的函數(像log(1+x))
  • 動態地生成C或者CUDA代碼,用以編譯成高效的機器代碼
  • theano自動求導
  • theano派生出了大量基於它的深度學習庫,比如Keras,Lasagne
  • Keras比較適合在探索階段快速地嘗試各種網絡結構,組件都是可插拔的模塊,只需要將一個個組件(比如卷積層、激活函數等)連接起來,但是設計新模塊或者新的Layer就不太方便
  • 學術界喜愛的Lasagne,對神經網絡內的每一層的定義都非常嚴謹

theano缺點:

  • 更多作為一個研究工具而不是產品
  • 沒有底層C++接口,所以模型部署非常不方便,依賴於各種python庫,不支持各種移動設備,所以幾乎沒有在工業生產環境的應用
  • Theano在調試時輸出的錯誤信息非常難看懂,debug很痛苦

Torch

用lua語言編程

MXNet

  • 各個框架中率先支持多GPU和分布式的
  • MXNet的核心是一個動態的依賴調度器,支持自動將計算任務並行化到多個GPU或分布式集群
  • 支持非常多的語言封裝

CNTK

  • 在語音識別領域中使用廣泛
  • 支持自動求解梯度

TensorFlow實戰--閱讀筆記part1