【ATU Book-i.MX8系列 - TFLite】Tensorflow 2. x 運算概念

一.   概述

上篇文章,說明如何搭建 Tensorflow 2.x 環境,主要使用版本為 2.1.0。相信各位也大致上了解 TF 1.x 與 2.x 的差異,接下來就來帶領讀者認識 Tensorflow 2.x 的主要運作模式,何謂 動態圖(Eager) 與基本運算的概念,以及 2.x 版本所衍伸的重大改變 ! ! 事不宜遲,動手一起體驗吧!!  如下圖所示,為系列博文之示意架構圖。此架構圖隸屬於 i.MX8M Plus 的方案博文中,並屬於 eIQ 機器學習開發環境 內的 推理引擎層(Inference Engines Layer) 的子系列 !! 目前章節介紹 “Tensorflow 2. x 運算概念”!! 若欲架設 1.x 的版本,請參照該系列其他的運算概念章節。

若新讀者欲理解人工智慧、機器學習以及深度學習的差異,可點選查閱下方博文
大大通精彩博文   探討機器學習與深度學習之差異

TFlite 系列博文 - 文章架構示意圖 (1)

TFlite 系列博文 - 文章架構示意圖 (2)

 

二.  Tensorflow 2.x 運算概念

使用搭建環境 : Python 3.6 + Windows 10 + Tensorflow 2.1.0

(1) 動態圖(Eager)

TensorFlow 2.x 設計核心屬於「動態圖」的模式,推翻了原有靜態圖設計,讓執行圖的概念更融合於 Python 代碼中。具有高相容性與直覺性的介面能夠緊密的與 Python 變數作結合,且可使用 debugger 通用函式庫以達到更輕鬆簡單的除錯方式。下列就直接以代碼與圖片進行演示,可先從三大區塊 (載入 Tensorflow 資料庫、定義常數、執行靜態圖) 看起。

 動態圖代碼演示 : 

#---------------------------------------------------------------------------------------------------------------
# (1) 載入 Tensorflow 資料庫
#---------------------------------------------------------------------------------------------------------------
import TensorFlow as tf

#---------------------------------------------------------------------------------------------------------------
# (2) 定義常數
#---------------------------------------------------------------------------------------------------------------
#常數
a = [[1.]]
b = [[2.]]
c = [[3.]]
d = [[4.]]

#---------------------------------------------------------------------------------------------------------------
# (3) 執行運算(與Pvthon 相似)
#---------------------------------------------------------------------------------------------------------------
#運算式
add_1 = tf.add(a,b)
add_2 = tf.add(c,d)
mul_1 = tf.multiply(b,c)
output = tf.add(add_1,mul_1)
print("a + b = {}".format(add_1))
print("c + d = {}".format(add_2))
print("b * c = {}".format(mul_1))
print("a + b + (b*c) = {}".format(output))

 

觀察上述所介紹的代碼,已經沒有定義與執行設計圖的分段, 與 Python 概念相同屬於直譯式。然而動態圖之代碼部分亦可以視為圖形化的方式呈現,如下圖所示,故稱此部分為 (Graph) 的概念。

 

TensorFlow Graph 示意圖

 執行結果

順帶一提,上述方式皆為 TensorFlow 2.x 的動態圖概念,與靜態圖的設計最大的差異就是執行則立刻運算,能夠使除錯更加直觀!! 達到即時執行並輕易地實踐監控每個 Tensor 的數值的優勢 !! 後續將會討論有關 TensorFlow Graph 的衍伸探討 !!

 

 

(2) 基本運算

撰寫 TensorFlow 的代碼時,必須注意的是常數與變數的宣告方式是不同的。而是利用所謂的 張量(Tensor) 的概念,這是一種有維度的數組之統稱,比如說二維的矩陣就是屬於一種張量。而下列將介紹 TensorFlow 宣告常數與變數的方法 : 

常數宣告 :

$ a = tf.constant( data , name ) 


變數宣告(直接填入數值) :

$ a = tf.Variable( data , name )


變數宣告
(間接填入數值, 先宣告一塊記憶體空間) : 此方式為 TF 1.x 概念  而 2.x 版本移至 tf.compat.v1 底下

$ a = tf.placeholder(dtype, shape=None, name=None)

 

 變數宣告範例 :

 

#---------------------------------------------------------------------------------------------------------------
# 演示如何設置 變數 作 TensorFlow 運算
#---------------------------------------------------------------------------------------------------------------
import TensorFlow as tf

#---------------------------------------------------------------------------------------------------------------
# 範例 (直接填入數值進行運算)
#---------------------------------------------------------------------------------------------------------------
Vc = tf.constant(1,name='Vc') #宣告常數
Vx = tf.Variable(Vc+5,name='Vx') #宣告變數
print("Vc = ",format(Vc))
print("Vx = ",format(Vx))

 
 執行結果 : 

與 Tensorflow 1.x 不同,直接運算即可看到 Vx 結果為 6 !! 不必構思靜態圖的概念讓撰寫更加靈活 !!

 

 

(3)  衍伸理念

另一種衍伸需求稱作 AutoGraph。 直觀一點解釋,就是將 動態圖(Eager) 靜態圖(Graph) 之中所衍伸的產物,隨著靜態圖的驅動引擎 session 被取代,取而代之的就是新函式 tf.function !!

tf.function 就是在動態圖的計算概念下,自動建好原有的 Graph 的設計 !! 藉此提升運算速度的提升,可說是保留原生靜態度的速度與動態度的即時運算特性的一種衍伸集成方式!! 讓 Tensorflow 2.x 帶來更方便且強大的力量 !! 如同下列代碼, tf.function 設計像是在原先 TF 2.x 代碼上裝飾,讓系統知道該啟動 AutoGraph 的效果。

 Auto Graph 範例

#---------------------------------------------------------------------------------------------------------------
# 演示有用啟用 AutoGraph 的運算時間差異
#---------------------------------------------------------------------------------------------------------------
import timeit

#卷積運算(一般)
conv_layer = tf.keras.layers.Conv2D(100, 3)

#卷積運算(AutoGraph)
@tf.function
def conv_fn(image):
return conv_layer(image)

#運算
image = tf.zeros([1, 200, 200, 100])
conv_layer(image);
conv_fn(image)
print("Eager conv:", timeit.timeit(lambda: conv_layer(image), number=10))
print("Function conv:", timeit.timeit(lambda: conv_fn(image), number=10))

 

 執行結果 :  

如上述所述, 動態圖直接運行 10次約處理 0.387 s ,而以 AutoGraph 則處理 0.348 s ,達到加快速度目的,保留原本靜態圖的速度優勢!!

 

除上述的延伸理念,還有另一種相似 PyTorch 的機制,即 tf.GradientTape。 此設計是用來記錄與監控正向運算的過程,紀錄至官方所設計的資料結構 tap 物件上。當呼叫自身的 gradient 即可進行反向運算,對於神經網路架構可說是相當便利的設計 !!

 GradientTape 範例

#---------------------------------------------------------------------------------------------------------------
# 演示如何啟用 GradientTape
#---------------------------------------------------------------------------------------------------------------
import tensorflow as tf
w = tf.Variable([[1.0]])
with tf.GradientTape() as tape: #啟用 GradientTape
loss = w * w
grad = tape.gradient(loss, w) #記錄變量
print(grad)

 

 執行結果 : 

如上述所述,利用 GradientTape 來計算梯度,亦可使用這種方式記錄變量輕鬆地計算更高階的導數,若要多次計算需開啟 persistent=True !! 靈活應用即可計算出所有訓練的變量梯度 !!同時,這也就是取代原本靜態圖有的前向與反向圖的新機制!!

 


三.  結語

上述介紹一系列關於 Tensorflow 2.x 的運算概念,最主要就是從原本的靜態圖更換為動態圖的概念,更加直觀靈活。且為了保持速度衍伸出 AutoGraph 設計,與方便觀察訓練中的梯度變量的 GradientTape,這幾點讓 Tensorflow 2.x 更加強大!! 讓使用者重新回歸 Tensorflow 的王者架構裡面!! 後續文章將帶領讀者建立第一支 Tensorflow 2.x 神經網路 – 手寫識別,敬請期待!!

 

四.  參考文件

[1] ITREAD    - 從0.1到2.0一文看盡TensorFlow奮鬥史
[2] 軟體之心  - 包裝再升級?Tensorflow 2.0的重大改變
[3] WiKi        -  Keras開源神經網路庫
[4] 科技報橘 -  手機上的輕量版 AI 運算,TensorFlow Lite 問世!
[5] Anaconda - 官方網站
[6] Tensorflow - 官方網站
[7] CSDN – 梯度求解利器
[8] 軟體之心 - 包裝再升級?Tensorflow 2.0的重大改變
[9] iT1邦幫忙 - Tensorflow 的 Eager Mode

如有任何相關 Tensorflow Lite 技術問題,歡迎至博文底下留言提問 !!
接下來還會分享更多 Tensorflow Lite 的技術文章 !!敬請期待 【ATU Book-i.MX8 系列 - TFLite
 !!

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論