【Tensorflow】Tensorflow基礎知識
Tensorflow簡介
在我們使用以統計方法為核心的機器學習方法的時候,重要的是做特徵工程,然後調一些引數,根據一些領域的經驗來不斷提取特徵,特徵的好壞往往決定模型的好壞。
而深度學習不需要我們過多的提取特徵,在神經網路的每一層,計算機都可以自動學習特徵,為了實現深度學習中應用神經網路,Tensorflow這樣的深度學習開源工具就應運而生。我們可以使用它來搭建自己的神經網路。
Tensorflow的優點:
- 支援異構裝置分散式計算(使用CPU、GPU等核心進行有效地協同合作,提高效能,降低功耗)
- Tensorflow支援卷積神經網路(CNN)、迴圈神經網路(RNN)、長短型記憶網路(LSTM),這些都是目前在計算機視覺、語音識別、自然語言處理方面最流行的神經網路模型
- Tensor庫是對CPU/GPU透明的,並且實現了很多操作(如切片、陣列或矩陣操作等)
- 有一個完全獨立的程式碼庫,用指令碼語言(最理想的是python)來操作Tensors,並且實現所有深度學習的內容,包括前向傳播、反向傳播、圖形計算等
- 可以輕鬆地共享預訓練模型
- 沒有編譯過程
- 六大特性:高度的靈活性、真正的可移植性、將科研和產品結合在一起、自動求微分、多語言支援、最優化效能
Tensorflow的安裝
- Windows10下:
- 安裝python(這裡預設安裝好了)
- CPU版本的安裝:cmd 輸入 pip install tensorflow
- pip install tensorflow==1.9.0也可指定版本
- GPU版本的安裝:
注意:自己的機器需要支援安裝GPU版本,需要有NVIDIA的顯示卡,可百度查詢。
需要下載安裝兩個驅動:CUDA和CuDNN(需要注意這兩個驅動的版本對應)
我這裡安裝了GPU1.9.0版本、CUDA 9.0,是在anaconda環境中的:
- 測試下:
import tensorflow as tf
# 建立圖
a = tf.constant(10)
b = tf.constant(15)
# 建立會話
sess = tf.Session()
# 執行會話
print(sess.run(a + b)) # 輸出25
系統架構
如圖所示,自底向上分為裝置層和網路層、資料操作層、圖計算層、API層、應用層,其中裝置層和網路層、資料操作層、圖計算層是Tensorflow的核心層。
- 網路通訊層和裝置管理層
網路通訊層包括gRPC和遠端直接資料存取RDMA,這都是分散式計算時要用的
裝置管理層包括CPU、GPU和FRGA等,也就是對上層提供一個統一的介面,使上層只需處理卷積等邏輯,而不需要關心在硬體上的卷積的實現過程。
- 資料操作層
主要包括卷積函式和啟用函式
- 圖計算層
這是我們需要了解的核心,包含本地計算圖和分散式計算圖
圖的建立、編譯、優化和執行
- API層和應用層
常用API的Python實現以及一些其他語言的實現
呼叫API層對深度學習各種模型的實現
設計理念
-
將圖的定義和圖的執行完全分開;
-
Tensorflow中涉及的運算都要放在圖中,而圖的執行只發生在會話中。
開啟會話後,就可以直接用資料去填充節點,進行運算。關閉會話後,就不能進行計算了
因此會話提供了操作執行和Tensor求值的環境
import tensorflow as tf
# 建立圖
a = tf.constant([1.0, 2.0])
b = tf.constant([3.0, 4.0])
c = a * b
print(c)
輸出為:Tensor("mul:0", shape=(2,), dtype=float32)
可以看出,輸出中並沒有結果
# 建立會話
sess = tf.Session()
# 計算
print(sess.run(c)) # 進行矩陣乘法
# 關閉會話
sess.close()
輸出為:[3. 8.]
程式設計模型
Tensorflow是用資料流圖做計算的,因此我們先建立一個數據流圖,分析資料流圖中的各個要素。
圖中包含:輸入(input)、塑形(reshape)、ReLu層(ReLu Layer)、Logit層(Logit Layer)、Softmax、交叉熵(cross entropy)、梯度(gradient)、SGD訓練(SGD Trainer)等部分,是一個簡單的迴歸模型
- 計算過程:
首先從輸入開始,經過塑形後,一層一層進行前向傳播運算。
ReLu層(隱藏層)裡面有兩個引數,即 和 ,在輸出前使用ReLu啟用函式做非線性處理;
然後進入Logit層(輸出層),學習兩個引數 和 ,用Softmax來計算輸出結果中的各個類別的概率分佈,用交叉熵來度量兩個概率分佈之間的相似性
然後開始計算梯度,這裡需要更新引數 , , 和 ,以及交叉熵後的結果
隨後進入SGD訓練,也就是反向傳播的過程,從上往下計算每一層的引數,依次進行更新
Tensorflow的資料流圖由節點和邊組成的有向無環圖,Tensor(張量)代表了資料流圖中的邊,Flow(流動)代表了資料流圖中節點所要做的操作。
- 邊
Tensorflow的邊有兩個連線關係:資料依賴和控制依賴;
資料依賴用實線邊表示,即張量,在機器學習演算法中,張量在資料流圖中從前向後流動一遍完成一次前向傳播,而殘差從後向前流動一遍完成一次反向傳播;
控制依賴用虛線邊表示,可以用於控制操作的執行,這類邊上沒有資料流過,但是源節點必須在目的節點開始執行前完成執行。
Tensorflow支援的張量:
資料型別 | Python型別 | 描述 |
---|---|---|
DT_FLOAT | tf.float32 | 32位浮點型 |
DT_DOUBLE | tf.float64 | 64位浮點型 |
DT_INT64 | tf.int64 | 64位有符號整型 |
DT_INT32 | tf.int32 | 32位有符號整型 |
DT_INT16 | tf.int16 | 16位有符號整型 |
DT_INT8 | tf.int8 | 8位有符號整型 |
DT_UNIT8 | tf.unit8 | 8位無符號整型 |
DT_STRING | tf.string | 可變長度的位元組陣列,每一個張量元素是一個位元組陣列 |
DT_BOOL | tf.bool | 布林型 |
DT_COMPLEX64 | tf.complex64 | 由兩個32位浮點陣列成的複數:實部和虛部 |
DT_QINT32 | tf.qint32 | 用於量化操作的32 位有符號整型 |
DT_QINT8 | tf.qint8 | 用於量化操作的8 位有符號整型 |
DT_QUINT8 | tf.quint8 | 用於量化操作的8 位無符號整型 |
- 節點
圖中的節點代表一個操作(operation,OP),一般用來表示施加的數學運算,也可以表示資料輸入(feed in)的起點以及輸出(push out)的終點,或者是讀取/寫入持久變數(persistent variable)的終點。
Tensorflow支援的操作:
類別 | 示例 |
---|---|
數學運算操作 | Add、Subtract、Multiply、Div、Exp、Log、Greater、Less、Equal … |
陣列運算操作 | Concat、Slice、Split、Constant、Rank、Shape、Shuffle … |
矩陣運算操作 | MatMul、MatrixInverse、MatrixDeterminant … |
有狀態的操作 | Variable、Assign、AssignAdd … |
神經網路構建操作 | SoftMax、Sigmoid、ReLU、Convolution2D、MaxPool … |
檢查點操作 | Save、Restore |
佇列和同步操作 | Enqueue、Dequeue、MutexAcquire、MutexRelease … |
控制張量流動的操作 | Merge、Switch、Enter、Leave、NextIteration |