運行 TensorFlow
打開一個 python 終端:
1 $ python 2 >>> import tensorflow as tf 3 >>> hello = tf.constant('Hello, TensorFlow!') 4 >>> sess = tf.Session() 5 >>> print sess.run(hello) 6 Hello, TensorFlow! 7 >>> a = tf.constant(10) 8 >>> b = tf.constant(32) 9 >>> print sess.run(a+b) 10 42 11 >>>
使用 TensorFlow, 你必須明白 TensorFlow:
• 使用圖 (graph) 來表示計算任務.
• 在被稱之為 會話 (Session) 的上下文 (context) 中執行圖.
• 使用 tensor 表示數據.
• 通過 變量 (Variable) 維護狀態.
• 使用 feed 和 fetch 為任意操作輸入和輸出數據.
綜述
TensorFlow 是一個編程系統, 使用圖來表示計算任務. 圖中的節點被稱之為 op(operation 的縮寫). 一個 op獲得 0 個或多個 Tensor , 執行計算, 產生 0 個或多個 Tensor . 每個 Tensor 是一個類型化的多維數組. 例如, 你可以將一小組圖像集表示為一個四維浮點數數組, 這四個維度分別是 [batch, height, width, channels] .一個TensorFlow 圖 描述 了計算的過程. 為了進行計算, 圖必須在 會話 里被啟動. 會話 將圖的 op 分發到諸如 CPU 或 GPU 之類的 設備 上, 同時提供執行 op 的方法. 這些方法執行后, 將產生的 tensor 返回. 在 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 類 文檔 來了解如何管理多個圖.
1 import tensorflow as tf 2 # 創建一個常量 op, 產生一個 1x2 矩陣. 這個 op 被作為一個節點 3 # 加到默認圖中. 4 # 5 # 構造器的返回值代表該常量 op 的返回值. 6 matrix1 = tf.constant([[3., 3.]]) 7 # 創建另外一個常量 op, 產生一個 2x1 矩陣. 8 matrix2 = tf.constant([[2.],[2.]]) 9 # 創建一個矩陣乘法 matmul op , 把 'matrix1' 和 'matrix2' 作為輸入. 10 # 返回值 'product' 代表矩陣乘法的結果. 11 product = tf.matmul(matrix1, matrix2)
默認圖現在有三個節點, 兩個 constant() op, 和一個 matmul() op. 為了真正進行矩陣相乘運算, 並得到矩陣乘法的 結果, 你必須在會話里啟動這個圖.
在一個會話中啟動圖
構造階段完成后, 才能啟動圖. 啟動圖的第一步是創建一個 Session 對象, 如果無任何創建參數, 會話構造器
將啟動默認圖.
欲了解完整的會話 API, 請閱讀Session 類.
# 啟動默認圖. sess = tf.Session() # 調用 sess 的 'run()' 方法來執行矩陣乘法 op, 傳入 'product' 作為該方法的參數. # 上面提到, 'product' 代表了矩陣乘法 op 的輸出, 傳入它是向方法表明, 我們希望取回 第 1 章 起步 | 21 # 矩陣乘法 op 的輸出. # # 整個執行過程是自動化的, 會話負責傳遞 op 所需的全部輸入. op 通常是並發執行的. # # 函數調用 'run(product)' 觸發了圖中三個 op (兩個常量 op 和一個矩陣乘法 op) 的執行. # # 返回值 'result' 是一個 numpy `ndarray` 對象. result = sess.run(product) print result # ==> [[ 12.]] # 任務完成, 關閉會話. sess.close()