本博客是根據斯坦福大學的一門 tensorflow 課程的課件整理。這是課程地址 CS 20: Tensorflow for Deep Learning Research。
1 前言
什麼是 TensorFlow?
“Open source software library for numerical computation using data flow graphs”
爲什麼用 TensorFlow?
- 有許多機器學習庫;
- 具有靈活性和擴展性;
- 許多人已經在用了,現今很流行,許多聞名的大公司也在用 TensorFlow;
- ………..
上面這些都不重要,讓我們進入正題。
2 Graphs and Sessions(圖和會話)
什麼是 張量(Tensor)?
所謂的 TensorFlow 中的 TensorFlow 是什麼呢?這個問題其實比較複雜,我們這裏就不細講,就給出一個非常簡單的概念:
0 維張量:標量(scalar)。也就是我們一般意義上的 數字(number)。
1 維張量:向量(vector)。
2 維張量:矩陣(matrix)。
TensorFlow separates definition of computations from their execution.
TensorFlow 將計算的定義和執行分開了。所以我們使用 TensorFlow 計算的步驟應該是:
- 定義一張 計算圖(Graphs);
- 使用一個 會話(session) 去執行圖中的操作。
假如你在終端輸入下面兩行代碼:
import tensorflow as tf a = tf.add(3, 5)
上面兩行代碼定義的其實就是:
如果你學過神經網絡,會發現這東西很眼熟。就像神經網絡是由很多神經元組成的一樣,TensorFlow 中的計算圖也將由許多如上的結構組成。其中,
- 節點(Nodes):表示操作,變量或者常亮;
- 邊(Edges):表示張量(tensors)。
現在我們試着將上面定義的東西打印出來看一下:
import tensorflow as tf a = tf.add(3, 5) print(a)
輸出:
>> Tensor("Add:0", shape=(), dtype=int32)
沒有輸出我們期待的
8
,要怎麼樣能計算出a
的值呢?答案就是session
.我們來創建一個
session
試試:import tensorflow as tf a = tf.add(3, 5) sess = tf.Session() print(sess.run(a)) sess.close()
輸出:
>> 8
有了
session
,我們就能計算出a
的值了 。但是以防我們忘記關閉
session
,所以官方推薦我們這麼寫:import tensorflow as tf a = tf.add(3, 5) with tf.Session() as sess: print(sess.run(a))
所以
session
的作用是什麼呢?A Session object encapsulates the environment in which Operation objects are executed, and Tensor objects are evaluated.
Session will also allocate memory to store the current values of variables .
因爲英語比較渣,所以一直翻譯不通順這兩句話,大概意思就是
session
封裝了一個環境,在這個環境裏,就可以去執行圖中各種操作了,同時session
還會去分配變量的內存。我們還可以定義更多節點的圖:
x = 2 y = 3 op1 = tf.add(x, y) op2 = tf.multiply(x, y) op3 = tf.pow(op2, op1) with tf.Session() as sess: op3 = sess.run(op3)
上述代碼定義瞭如下的圖:
需要指出的一點是,TensorFlow 並不會自動的去計算圖中所有節點的值,只有這個節點需要被計算出來的時候(比如其他節點的輸出依賴此節點的輸出。或者用戶想要計算這個節點的值),TensorFlow 纔會去計算,因爲並不是每一次計算都需要所有節點的值。
3 分佈式計算
tensorFlow 之所以強大,有一個原因是因爲它可以將一張圖分成多個部分並行計算,比如在你的 4 張
GTX 1080Ti
上並行計算。可以自行指定要在哪個
CPU
或者GPU
上執行:# Creates a graph. with tf.device('/gpu:2'): a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], name='a') b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], name='b') c = tf.multiply(a, b) # Creates a session with log_device_placement set to True. sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) # Runs the op. print(sess.run(c))
4 創建多張圖
建議你不要這麼做,因爲
- 因爲多張圖意味着要多個
session
,而每個session
都會努力的搶佔你計算機上的所有資源; - 不能在不通過
numpy
的情況下傳遞數據,不然就不能分佈式計算了; - 可以通過分開一張圖變成多張子圖來滿足你想要多張圖的需求。
所以你應該不再想創建多張圖了。
- 因爲多張圖意味着要多個
如果你還是堅持的話………….那你自己去找其他資料吧,裏面有很多坑。
5 Why graphs?
- 節省計算。只去計算那些你想要求值的子圖。
- 分解計算,以便可以實現自動微分。
- 促進分佈式計算,將計算過程分佈在
CPU
,GPU
,TPU
或者你想要的其他設備。 - 許多常見的機器學習模型都是可以看成有向圖結構的。