前言
本文梳理了TensorFlow的基本概念:數據流圖、Tensor、Operation、Variable、Placeholder、Session、Optimizer、minimize。並對每個概念進行了詳細的講解和擴展。
閱讀本文需要對深度學習有一定了解,並知道tensorflow是做什麼的。
一. 編程範式:數據流圖
聲明式編程和命令式編程:
聲明式編程:做什麼
命令式編程:怎麼做
TensorFlow採用了聲明式編程範式。
聲明式編程的優點:
1.代碼可讀性強:以目標而非過程為導向。2.支持引用透明:函數的調用語句可以由它的返回值取代。3.提供預編譯優化能力:先構建出數據流圖,無依賴邏輯的並行化計算、無效邏輯去除、公共邏輯提取等。
tensorflow數據流圖:
數據流圖定義:用節點和有向邊描述數學運算的有向無環圖。
數據流圖中的節點代表各類操作,包括數學運算、數據填充、結果輸出和變數讀寫等等,每個節點的操作都需要分配到具體的物理設備(cpu、gpu)上執行。有向邊描述了節點間的輸入輸出關係。
1.節點
前向圖中的節點有:
- 數學函數或表達式
- 存儲模型參數的變數(variable)
- 佔位符(placeholder)
後向圖中的節點有:
2.有向邊
多數用來傳輸數據,少數用來控制依賴。
3.執行原理
數據流圖執行順序的實現參考了拓撲排序的設計思想。
當我們使用tensorflow執行指定數據流圖時,其執行過程可分為以下
4個步驟:
- a.以節點名稱作為關鍵字,其所依賴的個數為值,創建一個散列表,將所有節點放入這個散列表。
- b.為此數據流圖創建一個可執行隊列,將三列表中依賴個數為0的節點加入隊列,並在散列表中刪除它們。
- c.一次執行隊列中的每個一節點,執行成功後將此節點輸出項的節點的依賴數減1,更新散列表。
- d.重複b和c,直到執行隊列為空。
二. 數據載體:張量
在tensorflow中,張量(Tensor)是數據流圖上的數據載體,通常是多維數組。還有一種叫SpareseTensor,存放稀疏數據(0的數量遠多於非0元素),旨在減少稀疏數據的內存佔用。
在物理實現時,它含有指向張量數據的內存緩衝區的指針,當它不被任何操作依賴時,會釋放該內存緩衝區。
1.創建
一般tensor都不是直接創建的,而是定義常量和代數計算操作而間接創建的。
import tensorflow as tf
a = tf.constant(1, name="a", dtype=tf.int32)
b = tf.constant(2, name="b", dtype=tf.int32)
c = tf.add(a, b, name="c")
print(a)
print(b)
print(c)
Tensor("a:0", shape=(), dtype=int32)
Tensor("b:0", shape=(), dtype=int32)
Tensor("c:0", shape=(), dtype=int32)
2.求解
如果想要求解某個張量的值,則需要創建會話,然後執行張量的eval方法或會話的run方法。
with tf.Session() as sess:
print(c.eval())
print(sess.run(c))
3
3
3.成員方法
張量公共成員方法: