本主題內容:體驗Tensorflow的兩種執(zhí)行方式:
- Tensorflow的Eager(立即)運行方式
- Tensorflow的Graphs(圖)運行方式
- Tensorflow提供兩種數(shù)據(jù)處理方式
-
Eager
TensorFlow 的Eager執(zhí)行是傳統(tǒng)的編程方式抓督,直接對實際的數(shù)據(jù)立即執(zhí)行運算匪傍,操作會返回具體的值; -
Graphs
TensorFlow 的Graphs執(zhí)行是類似泛型模板編程方式疗涉,先對數(shù)據(jù)與計算過程進行模板描述裸诽,然后對具體的數(shù)據(jù)進行實例化執(zhí)行验烧,并獲取結果的方式怜跑。
Graphs的核心是構建圖,圖的主要元素是節(jié)點锥腻,Graphs中關鍵節(jié)點有兩個:數(shù)據(jù)節(jié)點,運算節(jié)點母谎。數(shù)據(jù)輸入瘦黑、處理、輸出構成節(jié)點這幾件的運算與數(shù)據(jù)流流[1]奇唤,借用官方的一張示意圖可以說明計算節(jié)點幸斥、數(shù)據(jù)節(jié)點與圖:圖表示的數(shù)據(jù)處理流
-
Eager
-
Tensorflow引入了一些符號來表示圖,截圖說明如下:
圖的表述符號(有箭頭的表示核心節(jié)點與節(jié)點關系) -
準備
- 安裝Tensorflow
pip install tensorflow -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
這是使用的是速度比較快的鏡像站點咬扇,可以使用默認的官方站點甲葬。
- 在python程序中import模塊
import tensorflow as tf
- 例子的計算任務描述
計算兩個隨機矩陣的內積()。
- 例子的計算任務描述
一懈贺、體驗Eager執(zhí)行方式
1经窖、啟動Eager執(zhí)行模式
- 啟動eager執(zhí)行環(huán)境,并檢測是否是eager執(zhí)行環(huán)境梭灿,如果不是eager執(zhí)行環(huán)境画侣,則終止程序退出。
import sys import numpy as np import tensorflow as tf #1.開啟eager執(zhí)行方式 tf.enable_eager_execution() #2.判定當前是否是eager執(zhí)行方式 if tf.executing_eagerly(): print("Eager執(zhí)行方式") else: print("Graphs執(zhí)行方式") sys.exit(-1)
2堡妒、Eager執(zhí)行代碼
- 在計算中使用了兩個numpy數(shù)組(矩陣)配乱,運算調用的是tensorflow的內積計算函數(shù)matmul。
#實現(xiàn)eager執(zhí)行方式 m1=np.random.uniform(0,1,(4,3)) m2=np.random.uniform(0,1,(3,2)) r=tf.matmul(m1,m2) print(r)
- 程序輸出如下:
Eager執(zhí)行模式下的輸出結果
- 如果把eager模式代碼注釋掉,則運行結果如下:
Grahps執(zhí)行方式下的輸出結果
??在Graphs執(zhí)行方式下搬泥,該怎樣才能得到結果桑寨?下面使用來說明。
二忿檩、體驗Graphs執(zhí)行方式
- Graphs執(zhí)行模式是別人設計好的西疤,使用的時候需要按照設計來使用,用好Graphs就多看官方文檔休溶。
- 使用Graphs執(zhí)行方式最大的好處代赁,只要描述清楚數(shù)據(jù)與運算流程,細節(jié)都由API來執(zhí)行(比如在Graphs模式下兽掰,感知器的訓練中的激活函數(shù)與損失誤差函數(shù)的導數(shù)都會交給API自動完成)芭碍。Eager傳統(tǒng)模式,則需要關注所有細節(jié)(在Eager模式下孽尽,感知器的訓練中窖壕,激活函數(shù)與誤差損失函數(shù)都需要程序員處理)。
1.Graphs執(zhí)行方式的模式
-
Graphs編程模式分成兩步:
- (1)描述數(shù)據(jù)杉女、運算以及運算流程瞻讽。
- (2)構建運行會話環(huán)境,執(zhí)行運算熏挎。
2.Graphs代碼實現(xiàn)
-
描述數(shù)據(jù)速勇,運算與運算流程
這里沒有復雜的運算流程(通過函數(shù)的輸入,輸出形成數(shù)據(jù)與運算流程)坎拐,可能不足以提現(xiàn)Graphs執(zhí)行方式的強大烦磁。#1.描述圖:數(shù)據(jù)節(jié)點,運行節(jié)點 #數(shù)據(jù)節(jié)點 m1=np.random.uniform(0,1,(4,3)) #數(shù)據(jù)節(jié)點 m2=np.random.uniform(0,1,(3,2)) #運算節(jié)點(r也算數(shù)據(jù)節(jié)點哼勇,通過matmul建立與m1都伪、m2的數(shù)據(jù)與運算流 ) r=tf.matmul(m1,m2)
-
構建會話環(huán)境,執(zhí)行運算
#2.構建會話執(zhí)行環(huán)境积担,并執(zhí)行圖陨晶。 #構建會話對象 session=tf.Session() #使用會話初始化變量環(huán)境 init_op= tf.global_variables_initializer() #構建一個初始化器 session.run(init_op) #執(zhí)行初始化器,并完成全局變量初始化 #執(zhí)行運算 re=session.run(r) #返回結果 print(re)
-
完整代碼
#coding=utf-8 import numpy as np import tensorflow as tf #1.描述圖:數(shù)據(jù)節(jié)點帝璧,運行節(jié)點 #數(shù)據(jù)節(jié)點 m1=np.random.uniform(0,1,(4,3)) #數(shù)據(jù)節(jié)點 m2=np.random.uniform(0,1,(3,2)) #運算節(jié)點(r也算數(shù)據(jù)節(jié)點先誉,通過matmul建立與m1、m2的數(shù)據(jù)與運算流 ) r=tf.matmul(m1,m2) #2.構建會話執(zhí)行環(huán)境聋溜,并執(zhí)行圖谆膳。 #構建會話對象 session=tf.Session() #使用會話初始化變量環(huán)境 init_op= tf.global_variables_initializer() #構建一個初始化器 session.run(init_op) #執(zhí)行初始化器,并完成全局變量初始化 #執(zhí)行運算 re=session.run(r) #返回結果 print(re)
-
執(zhí)行結果
Graphs執(zhí)行方式下執(zhí)行結果
【資源】
相關代碼:
- t01_eager.py(體驗eager執(zhí)行方式)
- t01_graphs.py(體驗graphs執(zhí)行方式)
下載:【 代碼(github) 】
-
[數(shù)據(jù)流]:是一種用于并行計算的常用編程模型撮躁。在數(shù)據(jù)流圖中漱病,節(jié)點表示計算單元(橢圓表示)與計算使用或產生的數(shù)據(jù)(矩形表示)买雾。 ?