一、知識框架
二、內容概述
2.1 定義
TensorFlow是一個採用數據流圖,用於數值計算的開源軟件庫。
2.2 特徵
- 高度的靈活性
將計算表示爲一個數據流圖,構建圖,描寫驅動計算的內部循環,就可以使用Tensorflow - 真正的可移植性
Tensorflow 在CPU和GPU上運行,比如說可以運行在臺式機、服務器、手機移動設備等等。 - 自動求微分
只需要定義預測模型的結構,將這個結構和目標函數(objective function)結合在一起,並添加數據,Tensorflow將自動爲你計算相關的微分導數 - 多語言支持
Tensorflow 有一個合理的c++使用界面,也有一個易用的python使用界面來構建和執行graphs。 - 性能最優化
由於Tensorflow 給予了線程、隊列、異步操作等以最佳的支持,可以將硬件的計算潛能全部發揮出來。用戶可以自由地將Tensorflow圖中的計算元素分配到不同設備上,Tensorflow可以管理好這些不同副本。
2.3 基本用法
通常需要經過三個步驟:構圖(準備數據集)->啓動Session(爲了運算)->釋放資源
2.3.1 構圖
圖中的股東被稱爲op (operation的縮寫,即操作對象)。一個op獲得0個或多個Tensor,執行計算,產生0個或多個Tensor。每個Tensor是一個類型化的多維數組。
op不需要特殊的輸入,通常可以是常數、矩陣乘法 matmul op等。
import tensorflow as tf
# 構造器的返回值代表該常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])# 創建一個常量 op, 1x2 矩陣. 這個 op 被作爲一個節點,加到默認圖中.
matrix2 = tf.constant([[2.],[2.]])# 創建另外一個常量 op, 2x1 矩陣.
# 創建一個矩陣乘法 matmul op , 把 'matrix1' 和 'matrix2' 作爲輸入.
# 返回值 'product' 代表矩陣乘法的結果.
product = tf.matmul(matrix1, matrix2)
但是這只是構建,計算並沒有開始,需要將默認圖加入到Session會話中才能進行運算。接下來在2.3.2繼續介紹。
2.3.2 計算過程
爲了進行計算,圖必須在Session裏被啓動。 會話將圖的op分發到CPU或GPU之類的設備上,同時提供執行op的方法。這些方法執行後,將產生的張量返回。在Python語言中,返回的tensor是 numpy ndarray對象; 在C和C ++語言中,返回的tensor是 tensorflow::Tensor實例。
過程:啓動默認圖->傳入想要取回的參數->op併發執行->
sess = tf.Session()# 啓動默認圖.
result = sess.run(product)# 返回值 'result' 是一個 numpy `ndarray` 對象.
print result# ==> [[ 12.]]
sess.close()# 任務完成, 關閉會話.
注:
1、 調用 sess 的 ‘run()’ 方法來執行矩陣乘法 op, 傳入 ‘product’ 作爲該方法的參數.
上面提到, ‘product’ 代表了矩陣乘法 op 的輸出, 傳入它是向方法表明, 我們希望取回
#矩陣乘法 op 的輸出.
2、 整個執行過程是自動化的, 會話負責傳遞 op 所需的全部輸入.
3、op 通常是併發執行的.
函數調用 ‘run(product)’ 觸發了圖中三個 op (兩個常量 op 和一個矩陣乘法 op) 的執行.
4、在實現上,TensorFlow將圖形定義轉換成分佈式執行的操作,以充分利用可用的計算資源(例如CPU或GPU)。
5、一般不需要顯式指定使用CPU或GPU,TensorFlow能夠自動檢測。如果檢測到GPU,TensorFlow會重置地利用找到的第一個GPU來執行操作。
當GPU不夠使用時,需自主分配:with
with tf.Session() as sess:#使用with代碼塊釋放資源
with tf.device("/gpu:1"):#分配指定的GPU 此表示第二個,0表示第一個
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
...
6、交互使用:
爲了便於使用諸如 IPython 之類的 Python 交互環境, 可以使用 InteractiveSession 代替 Session 類, 使用 Tensor.eval() 和 Operation.run() 方法代替 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.]
7、變量維護圖執行過程中的狀態信息。因此驅動默認圖後首先需要對變量進行初始化。
import tensorflow as tf
# 創建一個變量, 初始化爲標量 0.
state = tf.Variable(0, name="counter")
# 創建一個 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.compat.v1.assign(state, new_value)
# 啓動圖後, 變量必須先經過`初始化` (init) op 初始化,
# 首先必須增加一個`初始化` op 到圖中.
init_op = tf.compat.v1.initialize_all_variables()
# 啓動圖, 運行 op
with tf.compat.v1.Session() as sess:
sess.run(init_op) # 運行 'init' op
print(sess.run(state))# 打印 'state' 的初始值
# 運行 op, 更新 'state', 並打印 'state'
for i in range(3):
print(sess.run(update))
# 輸出:0 1 2 3
2.3.3 Fetch與Feed
1、Fetch:爲了取回操作的輸出內容, 可以在使用 Session 對象的 run() 調用 執行圖時, 傳入一些 tensor, 這些 tensor 會幫助你取回結果. 在之前的例子裏, 取回了單個節點 state, 但也可以取回多個 tensor:
import tensorflow as tf
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)
with tf.Session():
result = sess.run([mul, intermed])
print result
# 輸出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
2、Feed: 可以臨時替代圖中的任意操作中的 tensor 可以對圖中任何操作提交補丁, 直接插入一個 tensor.
import tensorflow as tf
input1 = tf.placeholder(tf.types.float32)#提供佔位符
input2 = tf.placeholder(tf.types.float32)
output = tf.mul(input1, input2)
#啓動默認圖,使用with代碼塊
with tf.Session() as sess:
print sess.run([output], feed_dict={input1:[7.], input2:[2.]})#使用字典
# 輸出:
# [array([ 14.], dtype=float32)]