天天看點

TensorFlow算子融合

TensorFlow算子融合

TensorFlow的特點:

真正的可移植性

引入各種計算裝置的支援,包括CPU,GPU,以及能夠很好的運作在各種系統的移動端

多語言支援

支援C++,python,R語言等

高度的靈活性和效率

邊學習邊體驗

支援

由谷歌提供支援,谷歌希望其可以成為機器學習研究和開發人員通用的語言。

使用 TensorFlow, 你必須明白 TensorFlow:

圖:TensorFlow 是一個程式設計系統(一個程式設計語言),使用圖 (graph) 來表示一個計算任務或者計算單元.

計算任務:實作一個加法器,那任意值的加法運算就是一個計算任務

會話Session:圖必須要在會話中進行執行

tensor(張量:數組,階:次元):就是numpy中的nd.array(數組),隻不過從新起了一個名字而已!是以tensor一種資料類型。每個 Tensor 是一個類型化的數組. 或者是op的傳回值,就是TensorFlow中的資料。tensor也可以被稱為張量,那麼張量的階就是數組的次元。

節點op(operation):圖表示TensorFlow的計算任務,而一個計算任務的具體實作操作就是op。一個op需要使用0個或者多個Tensor來執行計算且會産生0個會多個Tensor,簡單點來說TensorFlow的API定義的函數都是op。

綜述:

圖描述了tensorflow計算的過程。為了進行計算, 圖必須在會話裡被啟動.會話将圖的op分發到諸如 CPU 或 GPU 之類的裝置上, 圖同時提供執行op的方法. 這些方法執行後, 将産生的 tensor 傳回。

tensorflow算子與圖

TensorFlow 是用資料流圖(data flow graph)做計算的,由節點(node)和邊(edge)元件的有向無環圖(directed acycline graph,DAG)。

節點表示計算單元,而邊表示被計算單元消費或生産的資料。在 tf.Graph 的上下文中,每個 API 的調用定義了 tf.Operation(節點),每個節點可以有零個或多個輸入和輸出的 tf.Tensor(邊)。

比如,定義 Python 變量 x:

with g.as_default():

    x = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)

    print('name is', x.name)

    print(x)

輸出:

這裡 x 定義了一個名叫 Const 的新節點(tf.Operation)加入到從上下文內建下類的預設 tf.Graph 中。該節點傳回一個名稱為 Const:0 的 tf.Tensor(邊)。

由于 tf.Graph 中每個節點都是唯一的,如果依據在圖中存在一個名稱為 Const 的節點(這是所有 tf 常量的預設名稱),TensorFlow 将在名稱上添加字尾 _1、_2 等使其名稱唯一。當然,也可以自定義名稱。

Const:0 Const_1:0 SG:0

輸出的 tf.Tensor 和其相關的 tf.Operation 名稱相同,但是加上了 :ID 形式的字尾。這個 ID 是一個遞增的整數,表示該運算産生了多少個輸出。但是可以存在有多個輸出的運算,這種情況下,:0,:1 等字尾,加到由該運算産生的 tf.Tensor 名字後。

也可以通過調用 tf.name_scope 函數定義的一個上下文,為該上下文中所有的運算添加命名範圍字首。這個字首是用 / 分割的一個名稱清單:

輸出

也可以這樣:

<code>tf.device</code> 建立一個和裝置相符的上下文管理器。這個函數允許使用者,請求将一個上下文建立的所有運算,放置在相同的裝置上。由 <code>tf.device</code> 指定的裝置不僅僅是實體裝置。可以是遠端伺服器、遠端裝置、遠端工作者即不同種類的實體裝置(GPU、CPU、TPU)。需要遵照一個裝置的指定規範,才能正确地告知架構來使用所需裝置。一個裝置指定規範有如下形式:

<code>&lt;JOB_NAME&gt;</code>:是一個由字母和數字構成的字元串,首字母不能是數字;

<code>&lt;DEVICE_TYPE&gt;</code>:是一個已注冊過的裝置類型(CPU或GPU);

<code>&lt;TASK_INDEX&gt;</code>:是一個非負整數,代表了名為 <code>&lt;JOB_NAME&gt;</code> 的工作中的任務編号;

TensorFlow 的邊有兩種連接配接關系:資料依賴與控制依賴。實線邊表示資料依賴,代表資料,即張量。虛線邊表示控制依賴(control dependency),可以用于控制操作的運作,用來確定 happens-before 關系,這類邊上沒有資料流過,但源節點必須在目的節點開始前完成執行。

graph 中的節點又稱為算子,代表一個操作(<code>tf.Operation</code>),一般用來表示施加的數學運算,資料輸入的起點及輸出的終點,或者是讀取/寫入持久變量(persistent variable)的終點。

Tensorflow算子融合示例

實作一個加法運算

add(a,b)

tf.get_default_graph()

op,session,tensor的graph屬性

tf.Graph():新圖對應的操作必須作用在上下文中!

上下文寫法:with g.as_default()

會話就是運作圖的一個資源類,運作的是預設的圖,當然也可以單獨運作指定的圖

會話的資源包含如下資源,會話結束後需要關閉對應的資源,是以需要在上下文資料總管中使用會話

tf.Variable

tf.QueueBase

tf.ReaderBase

TensorFlow可以分為前端系統和後端系統

前端系統:定義圖的結構(定義張量tensor,定義op等)

後端系統:運作圖

 

TensorFlow算子融合

     

會話的作用:

運作圖的結構

配置設定計算資源

掌握資源:會話隻可以運作其對應圖中的資源

Session(graph=g)指定圖

session隻可以運作op或者tensor,不可以運作其他類型的資料,但是如果一個tensor或者op使用某一個運算符和其他類型資料相加,則傳回的為op或者tensor類型

s.run(fetches, feed_dict=None,graph)

fetches: 就是運作的op和tensor,例如run(sum)也可以run([a,b,sum])

feed_dict: 程式在執行的時候,不确定輸入資料是什麼,提前使用placeholder占個位

給session提供實時運作的資料

自動生成張量:

tf.zeros(shape=(3,2))

tf.ones()

tf.random_normal(shape,mean,stddev)

mean:平均值

方差

改變類型:

tf.cast(x,dtype)

概念:變量也是一種op,是一種特殊的張量,能夠進行持久化存儲(普通張量不行),變量的值為張量。

API:tf.Variable(initial_value,name,trainable,)

initial_value變量接收的值(張量)

在手寫線性回歸時講解

必須進行變量的顯示的初始化,傳回一個初始化變量的op:

init_op = tf.global_variables_initializer()

線性回歸原理回顧

找尋目标值和特征值之間存在的關系,求出w和b即可。

y = (x1w1 + x2w2...+xn*wn)+b

損失函數(均方誤差):表示真實值和預測值之間的誤差

使用梯度下降将損失函數的誤內插補點最小即可

準備最簡單的特征值和目标值

y = 0.8*x+1.5,然後我們需要讓手寫的線性回歸求出w(0.8)和b(1.5)

建立模型

随機初始化一個w和b

因為模型一開始也不知道w和b應該是什麼,隻能随機初始化一個,然後随着梯度下降逐漸疊代更新w和b

然後求出預測值:y_pred = wx+b

求出損失函數(誤差)的結果

均方誤差:y是真實值y'是預測值

((y1-y1')^2+(y2-y2')^2+...+(yn-yn')^2)/n

使用梯度下降降低損失(梯度下降不需要手動實作,TensorFlow中有對應的API,隻需要指定學習率即可)

TensorFlow運算的API

矩陣運算:tf.matmul(a,b)

平方:tf.square(x)

均值:tf.reduce_mean()

梯度下降API

類:tf.train.GradientDescentOptimizer(learning_rate)

learning_rate: 需要手動指定學習率

線性回歸是一個疊代算法,在每次梯度下降的過程中,y=wx+b中的w和b是在不停的變化的逐漸在優化這兩個值。是以,w和b是需要不斷變化的在梯度下降的過程中!

結論:

在TensorFlow中随機初始化的w和b,隻可以用變量定義,不可以用張量,因為,變量可以自身變化,而張量不行!

或者說模型的參數隻可以用變量定義不可以用張量定義!!!

tf.Variable(initial_value=None,trainable=True)

trainable=True表示在訓練的過程中,變量的值可以跟随訓練而實時變化!!!

實作流程

代碼報錯(NotFindError),問題在于模型加載的路徑,或者在代碼頭部加上tf.reset_default_graph()

儲存的其實就是w和b

定義saver的op

saver = tf.train.Saver()

在會話中運作儲存函數:

saver.save(session,'path')

path:表示儲存模型的路徑,攜帶模型的名稱(任意名稱)

在會話運作時加載模型:

if os.path.exists('./xxx/checkpoint'):

saver.restore(session,'path')

模型的加載

人工智能晶片與自動駕駛