Introduction
- 須把tensorflow當作一個全新的語言來看待,而非再是普通的python程序
- 整體就是tensor(張量;數據) + flow
架構
tensorflow框架的設計
- 數據在tensorflow裡可以稱為張量(tensor)
- 上圖一個個的節點為tensorflow中的operation(op)
- 專門進行運算的操作節點
- 所有操作都是一個op
- 上圖就為tensorflow 圖(graph):在tensorflow中代表整個程序的結構或是欲執行的計算任務
- 圖(graph)需要會話(session)才能運作
- Session:用於運算程序定義的graph
計算密集 vs. IO密集
- 相較於python其他框架例如django(web),scrapy(爬蟲),tensorflow屬計算密集型的框架
計算密集型 | IO密集型 |
---|---|
tensorflow | django,scrapy |
cpu計算 | http請求, 磁盤(檔案)操作 |
實現一個加法運算
1 | import tensorflow as tf |
Result
1 | 3.0 |
圖(Graph)
圖在開始撰寫tensorflow程序時預設已經註冊了,
一組表示tf.Operation
計算單位的物件 和 tf.Tensor
表示操作之間流動的數據單元的物件
獲取graph物件
返回的是一個graph物件的地址1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import tensorflow as tf
# 定義圖
a = tf.constant(1.0)
b = tf.constant(2.0)
result = tf.add(a, b)
# 獲取圖物件,預設的這張圖,相當於是給程序分配一段內存
graph = tf.get_default_graph()
print("get_default_graphL:",graph)
with tf.Session() as sess:
print(sess.run(result))
print("a.graph:",a.graph)
print('result.graph:',result.graph)
print('sess.graph:',sess.graph)
result
1 | get_default_graphL: <\tensorflow.python.framework.ops.Graph object at 0x10f20e048> |
- 可以看見所有的operation包括session都在同一個內存地址中
圖的創建
單獨的分配另一塊內存地址存儲另外一個程序的結構
- 使用
tf.Graph()
創建圖 - 圖與圖之間互不干擾
- 使用圖時都是使用上下文環境(
with
)
1 | import tensorflow as tf |
result
1 | g.graph: <\tensorflow.python.framework.ops.Graph object at 0x1069046d8> |
- 可以看到兩張圖為不同的內存地址,彼此互不干擾
Operation(Op)
類型 | 示例 |
---|---|
標量運算 | add, sub, mul, div, exp, log, greater, less, equal |
向量運算 | concat, slice, splot, constant, rank, shape, shuffle |
矩陣運算 | matmul, matrix_inverse, matrix_determinant |
帶狀態的運算 | variable, assign, assign_add |
神經網路組件 | soft_max, sigmoid, ReLU, convolution2D, MaxPooling |
存儲、恢復 | save, restore |
隊列及同步運算 | enqueue, dequeue, mutex_acquire, mutex_release |
控制流 | merge, switch, enter, leave, next_iteration |
- 只要使用tensorflow這個API定義的物件,全部都是op
- op為一個載體
- tensor:指的就是數據,例如
tf.constant(10.0)
- 有些op中加載的不是數據,那它就不是tensor
- tensor:指的就是數據,例如
操作函數 & 操作對象
調用 操作函數 過程中會產生 操作對象
操作函數 | 操作對象 |
---|---|
調用tf.constant(Tensor對象) 函數 |
輸入Tensor對象 -> Const -> 輸出Tensor對象 |
調用tf.add(Tensor對象I, Tensor對象II) 函數 |
輸入2個Tensor對象 -> Add -> 輸出1個Tensor對象 |
- 每一個OP指令(
Const
,Add
)都對應了一個唯一的名稱Const
、Const_1
…- 不同的圖(graph)命名空間是獨立的
- 創建OP時可通過
name
參數重新命名