深度學習入門(二)——TensorFlow介紹
TensorFlow
1.使用圖 (graph) 來表示計算任務.
2.在被稱之為 會話 (Session)
的上下文 (context) 中執行圖.
3.使用 tensor 表示資料.
4通過 變數 (Variable)
維護狀態.
5.使用 feed 和 fetch 可以為任意的操作(arbitrary operation) 賦值或者從其中獲取資料.
TensorFlow 是一個程式設計系統, 使用圖來表示計算任務. 圖中的節點被稱之為 op (operation 的縮寫). 一個 op 獲得 0 個或多個 Tensor
, 執行計算, 產生 0 個或多個 Tensor
[batch, height, width, channels]
.一個 TensorFlow 圖描述了計算的過程. 為了進行計算, 圖必須在 會話
裡被啟動.
Session——>graph——>op——>tensor
會話將圖中的op分發到GPU/CPU等裝置上,同時提供執行op的方法,這些方法執行後,將產生的tensor返回
tensor:張量 flow:流 tensorflow
TensorFlow 程式使用 tensor 資料結構來代表所有的資料, 計算圖中, 操作間傳遞的資料都是 tensor. 你可以把 TensorFlow tensor 看作是一個 n 維的陣列或列表. 一個 tensor 包含一個靜態型別 rank, 和 一個 shape.
在 Python 語言中, 返回的 tensor 是 numpy ndarray
物件; 在 C 和 C++ 語言中, 返回的 tensor 是tensorflow::Tensor
例項.
計算圖
TensorFlow 程式通常被組織成一個構建階段和一個執行階段. 在構建階段, op 的執行步驟 被描述成一個圖. 在執行階段, 使用會話執行執行圖中的 op.
例如, 通常在構建階段建立一個圖來表示和訓練神經網路, 然後在執行階段反覆執行圖中的訓練 op.
TensorFlow 支援 C, C++, Python 程式語言. 目前, TensorFlow 的 Python 庫更加易用, 它提供了大量的輔助函式來簡化構建圖的工作, 這些函式尚未被 C 和 C++ 庫支援.
三種語言的會話庫 (session libraries) 是一致的.
構建圖
構建圖的第一步, 是建立源 op (source op). 源 op 不需要任何輸入, 例如 常量 (Constant)
. 源 op 的輸出被傳遞給其它 op 做運算.
Python 庫中, op 構造器的返回值代表被構造出的 op 的輸出, 這些返回值可以傳遞給其它 op 構造器作為輸入.
TensorFlow Python 庫有一個預設圖 (default graph), op 構造器可以為其增加節點. 這個預設圖對 許多程式來說已經足夠用了. 閱讀 Graph 類 文件 來了解如何管理多個圖.
import tensorflow as tf
# 建立一個常量 op, 產生一個 1x2 矩陣. 這個 op 被作為一個節點
# 加到預設圖中.
#
# 構造器的返回值代表該常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])
# 建立另外一個常量 op, 產生一個 2x1 矩陣.
matrix2 = tf.constant([[2.],[2.]])
# 建立一個矩陣乘法 matmul op , 把 'matrix1' 和 'matrix2' 作為輸入.
# 返回值 'product' 代表矩陣乘法的結果.
product = tf.matmul(matrix1, matrix2)
預設圖現在有三個節點, 兩個 constant()
op, 和一個matmul()
op. 為了真正進行矩陣相乘運算, 並得到矩陣乘法的 結果, 你必須在會話裡啟動這個圖.
在一個會話中啟動圖
構造階段完成後, 才能啟動圖. 啟動圖的第一步是建立一個 Session
物件, 如果無任何建立引數, 會話構造器將啟動預設圖.
欲瞭解完整的會話 API, 請閱讀Session 類.
# 啟動預設圖.
sess = tf.Session()
# 呼叫 sess 的 'run()' 方法來執行矩陣乘法 op, 傳入 'product' 作為該方法的引數.
# 上面提到, 'product' 代表了矩陣乘法 op 的輸出, 傳入它是向方法表明, 我們希望取回
# 矩陣乘法 op 的輸出.
#
# 整個執行過程是自動化的, 會話負責傳遞 op 所需的全部輸入. op 通常是併發執行的.
#
# 函式呼叫 'run(product)' 觸發了圖中三個 op (兩個常量 op 和一個矩陣乘法 op) 的執行.
#
# 返回值 'result' 是一個 numpy `ndarray` 物件.
result = sess.run(product)
print result
# ==> [[ 12.]]
# 任務完成, 關閉會話.
sess.close()
Session
物件在使用完後需要關閉以釋放資源. 除了顯式呼叫 close 外, 也可以使用 "with" 程式碼塊 來自動完成關閉動作.
with tf.Session() as sess:
result = sess.run([product])
print result
在實現上, TensorFlow 將圖形定義轉換成分散式執行的操作, 以充分利用可用的計算資源(如 CPU 或 GPU). 一般你不需要顯式指定使用 CPU 還是 GPU, TensorFlow 能自動檢測. 如果檢測到 GPU, TensorFlow 會盡可能地利用找到的第一個 GPU 來執行操作.
如果機器上有超過一個可用的 GPU, 除第一個外的其它 GPU 預設是不參與計算的. 為了讓 TensorFlow 使用這些 GPU, 你必須將 op 明確指派給它們執行. with...Device
語句用來指派特定的 CPU 或 GPU 執行操作:
with tf.Session() as sess:
with tf.device("/gpu:1"):
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
...
裝置用字串進行標識. 目前支援的裝置包括:
"/cpu:0"
: 機器的 CPU."/gpu:0"
: 機器的第一個 GPU, 如果有的話."/gpu:1"
: 機器的第二個 GPU, 以此類推.
閱讀使用GPU章節, 瞭解 TensorFlow GPU 使用的更多資訊.
互動式使用
文件中的 Python 示例使用一個會話 Session
來 啟動圖, 並呼叫 Session.run()
方法執行操作.
# 進入一個互動式 TensorFlow 會話.
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])
# 使用初始化器 initializer op 的 run() 方法初始化 'x'
x.initializer.run()
# 增加一個減法 sub op, 從 'x' 減去 'a'. 執行減法 op, 輸出結果
sub = tf.sub(x, a)
print sub.eval()
# ==> [-2. -1.]