Hike News
Hike News

深度學習-tensorflow基礎-圖(graph)、operation與tensor

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
2
3
4
5
6
7
8
9
10
11
import tensorflow as tf

# 定義圖(graph)
a = tf.constant(1.0)
b = tf.constant(2.0)

result = tf.add(a, b)

# 於會話(session)中執行
with tf.Session() as sess:
print(sess.run(result))

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
16
import 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
2
3
4
5
get_default_graphL: <\tensorflow.python.framework.ops.Graph object at 0x10f20e048>
3.0
a.graph: <\tensorflow.python.framework.ops.Graph object at 0x10f20e048>
result.graph: <\tensorflow.python.framework.ops.Graph object at 0x10f20e048>
sess.graph: <\tensorflow.python.framework.ops.Graph object at 0x10f20e048>
  • 可以看見所有的operation包括session都在同一個內存地址中

圖的創建

單獨的分配另一塊內存地址存儲另外一個程序的結構

  • 使用tf.Graph()創建圖
  • 圖與圖之間互不干擾
  • 使用圖時都是使用上下文環境(with)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import tensorflow as tf

g = tf.Graph()
print(g)
# 上下文環境使用with
with g.as_default(): #as_default:作為預設圖使用
c = tf.constant(10.0)
print(c.graph)

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
2
3
4
5
6
7
g.graph: <\tensorflow.python.framework.ops.Graph object at 0x1069046d8>
c.graph in g_graph <\tensorflow.python.framework.ops.Graph object at 0x1069046d8>
get_default_graphL: <\tensorflow.python.framework.ops.Graph object at 0x10813ffd0>
3.0
a.graph: <\tensorflow.python.framework.ops.Graph object at 0x10813ffd0>
result.graph: <\tensorflow.python.framework.ops.Graph object at 0x10813ffd0>
sess.graph: <\tensorflow.python.framework.ops.Graph object at 0x10813ffd0>
  • 可以看到兩張圖為不同的內存地址,彼此互不干擾

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

操作函數 & 操作對象

調用 操作函數 過程中會產生 操作對象

操作函數 操作對象
調用tf.constant(Tensor對象)函數 輸入Tensor對象 -> Const-> 輸出Tensor對象
調用tf.add(Tensor對象I, Tensor對象II)函數 輸入2個Tensor對象 -> Add -> 輸出1個Tensor對象
  • 每一個OP指令(Const,Add)都對應了一個唯一的名稱
    • ConstConst_1
    • 不同的圖(graph)命名空間是獨立的
    • 創建OP時可通過name參數重新命名