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><JOB_NAME></code>:是一個由字母和數字構成的字元串,首字母不能是數字;
<code><DEVICE_TYPE></code>:是一個已注冊過的裝置類型(CPU或GPU);
<code><TASK_INDEX></code>:是一個非負整數,代表了名為 <code><JOB_NAME></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等)
後端系統:運作圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iZ5ADZiVzMlVWMwEzY3EWYhFjMlhDZmRWNjlTZxMGN28CXxMzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
會話的作用:
運作圖的結構
配置設定計算資源
掌握資源:會話隻可以運作其對應圖中的資源
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')
模型的加載
人工智能晶片與自動駕駛