TensorFlow程式設計模式
AnAn 2018/06/24
本文簡單介紹TensorFlow基本架構,並且提供範例。
Fig. 1 TensorFlow資料流程圖
Fig. 1是TensorFlow官方提供的資料流程圖(Data Flow Graph),即計算圖。由此圖可以理解TensorFlow(張量流轉)的精神:Tensor(張量),是代表了該圖的邊(Edge,Fig. 2的箭頭黑線),而Flow代表了該圖中結點(Node,Fig. 2的色塊)所做的操作。
邊可以分為兩種:data-dependency和control-dependency。data-dependency(通常以黑色實線)表示了兩個節點之間張量的流動,張量通常是我們所要處理的資料;control-dependency(通常以黑色虛線)則用於控制操作的執行。結點又稱為運算元,代表一個操作(Operation,OP),一般用來表示施加的數學運算。
Fig. 2 TensorFlow系統架構圖
Fig. 2 說明TensorFlow的系統架構。由下而上來看,網路層(Networking Layer)是分散式運算時需要用到的。
裝置層(Device Layer)包含TensorFlow分別在CPU、GPU、FPGA等裝置上實現,對上層提供統一的介面,是上層只需要處理運算如convolution的邏輯,而不需要關心硬體上運算的實現過程。
牧民認為這句話可以改成: 裝置層(Device Layer)負責處理CPU、GPU、FPGA的運算。
再往上是資料操作層(Kernel Implementations Layer),包含建置神經網路所需的神經元函式如Activation Function、Convolution Function等。
牧民認為這句話可以改成:資料操作層(Kernel Implementations Layer),包含建置神經網路所需的神經元函式如Activation Function、Convolution Function等。
再往上是圖計算層(Computational Graph Layer)。利用TensorFlow實現機器學習主要即是著手圖的建立、編譯、最佳化和執行。其中又分本機計算圖和分散式運算圖。
牧民認為這句話可以改成:圖計算層(Computational Graph Layer)處理圖的建立、編譯、最佳化和執行。其中又分本機計算圖和分散式運算圖。
再往上是API層和應用層。
牧民認為這句話可以刪去。
建立與執行計算圖(Computational Graph)
TensorFlow程式設計模式的核心是計算圖,可分為2部分:
牧民認為這句話可以改成:計算圖是TensorFlow程式設計模式的核心
建立「計算圖」與執行「計算圖」。
1.建立「計算圖」
我們可以使用TensorFlow提供的模組,建立「計算圖」。TensorFlow提供的模組非常強大,你可以設計張量運算流程,並且建構各種深度學習或機器學習模型。
牧民認為這句話可以改成:TensorFlow的模組可用來建立「計算圖」。建立「計算圖」就是設計張量運算流程,並且建構各種機器學習模型。
2.執行「計算圖」
建立「計算圖」後,我們就可以建立「Session」執行「計算圖」。
在TensorFlow中「Session」(原意是對談),其作用是在用戶端和執行裝置之間建立連結。有了這個連結,就可以將「計算圖」在各種不同裝置中執行,後續任何與裝置間的資料傳遞,都必須透過Session才能進行,執行「計算圖」後會回傳結果。
牧民認為這句話可以改成Session的原意是對談。
在TensorFlow中「Session」的作用是在用戶端和執行裝置之間建立連結。
這個連結可以將「計算圖」在各種不同裝置中執行。任何裝置間的資料傳遞,都必須透過Session才能進行。
執行「計算圖」後會將結果回傳。
import tensorflow as tf
import numpy as np
W=tf.Variable(tf.random_normal([3,2]),name='W')
b = tf.Variable(tf.random_normal([1, 2]),name='b')
X = tf.placeholder("float", [None,3],name='X')
y=tf.nn.sigmoid(tf.matmul(X,W)+b,'y')
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
X_array = np.array([[0.4,0.2 ,0.4],
[0.3,0.4 ,0.5],
[0.3,-0.4,0.5]])
(_b,_W,_X,_y)=sess.run((b,W,X,y),
feed_dict={X:X_array})
為了示範TensorFlow程式設計模式,我們將建立簡單的「計算圖」:只有一個常數與一個變數。建立完成後再執行此「計算圖」,如下:
執行「計算圖」
import tensorflow as ft
ts_c = tf.constant(2,name='ts_c')
ts_x = tf.Variable(ys_c+5,name='ts_x')
執行「計算圖」
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print(‘ts_c=’,sess.run(ts_c))
print(‘ts_x=’,sess.run(ts_x))
Step 1.匯入TensorFlow模組
import tensorflow as tf
Step 2.建立TensorFlow常數
建立TensorFlow常數命令如下
ts_c = tf.constant(2,name='ts_c')
以上程式碼使用tf.constant建立TensorFlow常數,輸入下列參數:
參數 | 說明 |
---|---|
2 | 設定此常數值為2 |
name= ‘ts_c‘ | 設定常數名稱ts_c,此名稱將會顯示在計算圖上 |
Step 3.查看TensorFlow常數
查看TensorFlow常數指令即是直接輸入該數的名稱
ts_c
如上執行結果說明如下:
●tf.Tensor:代表這是TensorFlow張量。
●shape = ():代表這是0維的tensor,也就是數值。
●dtype = int32:代表此張量資料型態是int32。
Step 4.建立TensorFlow變數
建立TensorFlow變數命令如下:
以上程式碼使用tf.Variable建立TensorFlow變數,輸入下列參數:
參數 | 說明 |
---|---|
ts_c+5 | 設定此變數值為常數值ts_c再加5 |
name = ‘ts_x‘ | 設定變數名稱ts_x,此名稱將會顯示在計算圖上 |
Ø查看TensorFlow變數
要查看TensorFlow變數,你只要輸入名稱即可,如下指令。
如上執行結果,你可以看到只顯示這是一個TensorFlow變數。這是因為TensorFlow變數必須要執行「計算圖」之後,才能夠看到結果。
15.2執行「計算圖」
建立「計算圖」後,我們就可以執行「計算圖」。只是執行之前必須先建立「Session」(原意是對談),在TensoeFlow中「Session」代表在用戶端和執行裝置之間建立連結。有了這個連結,就可以將「計算圖」在裝置中執行,後續任何與裝置間的溝通,都必須透過Session,並且取得執行後的結果。
Step 1.建立session
使用tf.Session()建立session物件sess。
Step 2.執行TensorFlow起始化變數
然後,必須使用下列指令,起始化所有TensorFlow global變數。
Step 3.使用sess.run顯示TensorFlow常數
以下程式碼,使用sess.run執行TensorFlow的「計算圖」,並且使用print顯示TensorFlow常數的執行結果。
以上執行結果,你可以看到ts_c是常數顯示為2。
Step 4.使用sess.run顯示TensorFlow變數
相同的方式,我們也可以顯示TensorFlow變數執行結果。
以上執行結果,你可以看到ts_x是變數7,也就是ts_c是2再加5等於7。
Step 5.使用.eval()方法顯示TensorFlow常數
另外一個執行TensorFlow「計算圖」的方法,是使用TensorFlow物件的eval()方法,使用eval方法必須傳入session參數。
Step 6.使用sess.run顯示TensorFlow變數
相同的方式,你也可以使用TensorFlow物件的eval()方法,來顯示TensorFlow變數。
Step 7.關閉TensorFlow session
當我們不需要再使用session時,必須使用sess.close(0關閉session。
Step 8.將以上指令全部一起執行
以下程式碼是將之前步驟介紹的指令,全部一起執行。
Step 9.With語法開啟Session並且自動關閉
之前步驟我們使用tf.Session()建立session,並且使用sess.close()關閉session。這種做法可能有以下問題:
1.可能忘記關閉Session。
2.當程式執行中發生異常,可能導致沒有關閉session。
為了解決此問題,可以使用With語法如下:
With關鍵字後面是:建立的命令tf.Session(),as關鍵字後面是:session的變數sess。
在with區塊中可使用sess變數與裝置溝通,離開with區塊自動關閉session。
15.3TensorFlow placeholder
之前的範例,建立在「計算圖」時,我們會設定ts_c常數值是2,並且設定變數ts_x是ts_c在加5,這都是在建立「計算圖」階段,就已經設定完成。可是如果我們希望能在執行「計算圖」階段才設定數值,就必須使用placeholder。
Step 1.建立「計算圖」
以下建立2個placeholder,分別是width (寬)與(高),然後使用tf.multiply將width與height相乘,相乘後的結果是area (面積)。
執行後建立如下「計算圖」。
Step 2.執行「計算圖」
執行sess.run傳入feed.dict參數{width:6 , height:8}。
以上執行結果,回傳area=48,也就是width是6 , height是8,相乘等於48。
15.4 TensorFlow數值運算方法介紹
上一小節我們使用tf.multiply()方法,進行TensorFlow乘法運算。TensorFlow提供了很多數值運算,您可以參考下列TensorFlow說明文件:
URLhttps://www.tensorflow.org/api_docs/python/math_ops/
以下如果是2個數值運算,就輸入2個參數x , y。如果是單一數值運算,例如:絕對值,只有傳入參數x。name參數是設定此運算名稱。
TensorFlow數值運算 | 說明 |
---|---|
tf.add(x , y , name=None) | 加法 |
tf.subtract(x , y , name=None) | 減法 |
tf.multiply(x , y , name=None) | 乘法 |
tf.divide(x , y , name=None) | 除法 |
tf.mod(x , y , name=None) | 餘數 |
tf.sqrt(x , name=None) | 平方 |
tf.abs(x , name=None) | 絕對值 |
※文件中的數值運算方法很多,以上只列出常用的部分。
您也許會覺得只是簡單的數值相乘,為何需要使用tf.multiply()方法?這是因為TensorFlow特別的程式設計模式,必須以TensorFlow模組,例如:tf.multiply()方法,建立「計算圖」,然後使用sess.run執行「計算圖」,才能得到計算結果。這樣做的目的是為了能夠讓TensorFlow具備跨平台。
15.5 TensorBoard
TensorFlow提供了TensorBoard,可以讓您以視覺化的方式,查看您所建立的「計算圖」,以下程式碼請參考範例程式碼TensorFlow_Board_area.ipynb。
Step 1.建立TensorFlow Variable變數
以下程式碼與之前章節的內容類似。只是建立tf.placeholder與tf.mul時,加入name參考,name參數設定的名稱會顯示Tensorboard graph上。設定名稱可以讓「計算圖」更易讀。
Step 2.建立TensorFlow Variable變數
接下來,下列程式碼將要顯示在TensorBoard的資料,寫入log檔。
以上程式碼說明如下:
●tf.summary.merge_all():將所有要顯示在TensorBoard的資料整合。
●tf.summary.File Writer():將所有要顯示在TensorBoard的資料,寫入log檔。Log檔會儲存在目前程式執行目錄下的log/area子目錄。
Step 3.Window啟動tensorboard
如果您使用windows系統,請依照下列步驟,啟動tensorbosrd。請開啟新的命令提示字元,並且輸入下列命令
Ø先確認log目錄檔案,是否已經產生?
在windows使用dir顯示目錄,以下c:\pythonwork\TensorFlow是程式執行目錄,如果你的執行目錄不同,請修改你的執行目錄。
Dir c:\pythonwork\tensorflow\log\area
Ø啟用TensorFlow的anaconda虛擬環境
Activate tensorflow
Ø啟動TensorBoard
啟動TensorBoard指令如下,須指定log檔目錄,TensorBoard會讀取此目錄,並顯示在TensorBoard上。
Tensorboard --logdir=c:\pythonwork\tensorflow\log\area
執行後畫面如下:
以上URLhttp://192.168.56.1:6006是筆者個人電腦的內部ip,你的ip可能不相同。你也可以用瀏覽器輸入此網址URLhttp://localhost:6006/,因為localhost代表本機,就是您目前使用的電腦。
Step 4.Linux Ubuntu啟動tensorboard
如果您使用Linux Ubuntu系統,請依照下列步驟,啟動tensorboard。
Ø先確認log目錄檔案,是否已經產生?
你可以使用下列指令,查看log目錄,以下~/pywork/TensorFlow是程式執行目錄,如果你的執行目錄不同,請修改為你的執行目錄。
11 ~ /pywork/tensorflow/log/area
執行後畫面如下,你可以看到log檔案:
Ø啟動tensorboard
啟動tensorboard指令如下,須指定log檔目錄,TensorBoard會讀取此目錄,並顯示在TensorBoard上。
Tensorboard–logdir=~/pywork/tensorflow/log/area
執行後畫面如下:
你也可以用瀏覽器輸入此網址URLhttp://localhost:6006/,因為localhost代表本機,就是您目前使用的電腦。
Step 5.在TensorBoard查看計算圖
啟動TensorBoard之後,請開啟瀏覽器,並輸入下列網址:URLhttp://localhost:6006/。輸入網址後,就會出現TensorBoard畫面,請在選單點選GRAPHS,點選後就可以看到「計算圖」。
15.6建立1維與2維張量
之前的章節,我們介紹0維的張量也就是純量(數值),接下來我們將介紹如何使用TensorFlow建立:1維的張量維向量,2維以上的張量為矩陣。
Step 1.建立1維的張量(向量)
建立1維的張量(tensor),你只需要使用tf.Variable()傳入list即可。
以上執行結果,是1維張量,共有3個數值。
Step 2.查看1維的tensor shape
你可以使用shape查看資料的形狀,因為1違張量共有3個數值,所以顯示(3,)。
Step 3.建立2維的tensor
建立2維的tensor,也是使用tf.Variable()傳入2維的list即可,所以我們傳入list的前後有2個中括號[[0.4,0.2,0.4]],代表這是2維的list。
以上執行結果,是2違張量,只有1筆資料,每一筆有3個數值。
Step 4.查看2維的tensor shape
查看shape結果是(1,3),說明如下:
Step 5.建立二維的張量
接下來,我們一樣建立二維的tensor張量,共有3筆資料,每一筆資料有2個數值。
Step 6.查看2維的tensor shape
查看shape結果是(3,2),說明如下:
15.7矩陣基本運算
接下來,我們將介紹矩陣基本運算:乘法與加法
Step 1.矩陣乘法
TensorFlow提供tf.matmul()方法,可以進行矩陣乘法。當你進行矩陣乘法時,2個矩陣必須維度相同。如下範例:
●建立「計算圖」:先建立TensorFlow變數X與W都是2維張量(矩陣),然後使用tf.matmul進行矩陣的相乘。
●執行「計算圖」:使用sess.run(XW)執行計算圖,並且print顯示結果。
矩陣的運算的公式XW=X * W計算方式如下:
你也許會覺得奇怪,為何程式執行結果是[[-1.29999995 0.40000001]],這是因為矩陣算是浮點運算,所以是近似值,與真實的計算結果會有誤差。
Step 2.矩陣加法
TensorFlow提供也可以進行矩陣加法,方法很簡單,只需要使用加號即可。
矩陣的運算的公式Sum = XW + b計算方式如下:
以上與運算結果是[[-1.19999993 0.60000002]],因為是浮點運算,所以是近似值。
Step 3.矩陣乘法與加法
之前步驟分別介紹矩陣乘法與加法,接下來將乘法與加法一起運用。
矩陣的運算的公式XWB=X*W+b計算方式如下:
以上與運算結果[[-1.19999993 0.60000002]],因為是浮點運算,所以是近似值。
15.8結論
本章介紹Tensorflow的程式設計模式,並且介紹如何使用TensorFlow基本的張量運算,有了這些基礎知識,下一章我們將介紹以TensorFlow張量(矩陣)運算,來模擬類神經網路運作。
Reference
[0] TensorFlow提早進入人工智慧的未來世界, 李嘉璇, 佳魁數位出版 ,2017
[1] TensorFlow+Keras深度學習人工智慧實務應用, 林大貴, 博碩出版, 2017