【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次,发文人进小黑屋喔~

评论