1. 程式人生 > >深度學習入門(二)——TensorFlow介紹

深度學習入門(二)——TensorFlow介紹

TensorFlow

    1.使用圖 (graph) 來表示計算任務.

    2.在被稱之為 會話 (Session) 的上下文 (context) 中執行圖.

    3.使用 tensor 表示資料.

    4通過 變數 (Variable) 維護狀態.

    5.使用 feed 和 fetch 可以為任意的操作(arbitrary operation) 賦值或者從其中獲取資料.

TensorFlow 是一個程式設計系統, 使用圖來表示計算任務. 圖中的節點被稱之為 op (operation 的縮寫). 一個 op 獲得 0 個或多個 Tensor, 執行計算, 產生 0 個或多個 Tensor

. 每個 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.]