1. 程式人生 > >【Tensorflow】Tensorflow基礎知識

【Tensorflow】Tensorflow基礎知識

Tensorflow簡介

\quad\quad 在我們使用以統計方法為核心的機器學習方法的時候,重要的是做特徵工程,然後調一些引數,根據一些領域的經驗來不斷提取特徵,特徵的好壞往往決定模型的好壞。

\quad\quad 而深度學習不需要我們過多的提取特徵,在神經網路的每一層,計算機都可以自動學習特徵,為了實現深度學習中應用神經網路,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

系統架構

在這裡插入圖片描述

\quad\quad 如圖所示,自底向上分為裝置層和網路層、資料操作層、圖計算層、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.]

程式設計模型

\quad\quad Tensorflow是用資料流圖做計算的,因此我們先建立一個數據流圖,分析資料流圖中的各個要素。

在這裡插入圖片描述

圖中包含:輸入(input)、塑形(reshape)、ReLu層(ReLu Layer)、Logit層(Logit Layer)、Softmax、交叉熵(cross entropy)、梯度(gradient)、SGD訓練(SGD Trainer)等部分,是一個簡單的迴歸模型

  • 計算過程:

首先從輸入開始,經過塑形後,一層一層進行前向傳播運算。
ReLu層(隱藏層)裡面有兩個引數,即 W h 1 W_{h_1} b h 1 b_{h1} ,在輸出前使用ReLu啟用函式做非線性處理;
然後進入Logit層(輸出層),學習兩個引數 W s m W_{sm} b s m b_{sm} ,用Softmax來計算輸出結果中的各個類別的概率分佈,用交叉熵來度量兩個概率分佈之間的相似性
然後開始計算梯度,這裡需要更新引數 W h 1 W_{h_1} b h 1 b_{h1} W s m W_{sm} b s m b_{sm} ,以及交叉熵後的結果
隨後進入SGD訓練,也就是反向傳播的過程,從上往下計算每一層的引數,依次進行更新

Tensorflow的資料流圖由節點組成的有向無環圖,Tensor(張量)代表了資料流圖中的邊,Flow(流動)代表了資料流圖中節點所要做的操作。


  • Tensorflow的邊有兩個連線關係:資料依賴和控制依賴;

資料依賴用實線邊表示,即張量,在機器學習演算法中,張量在資料流圖中從前向後流動一遍完成一次前向傳播,而殘差從後向前流動一遍完成一次反向傳播;
\quad
控制依賴用虛線邊表示,可以用於控制操作的執行,這類邊上沒有資料流過,但是源節點必須在目的節點開始執行前完成執行。

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