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

results matching ""

    No results matching ""