TensorFlow入門(二)——基本用法

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/PinkRiverside/article/details/72859596

TensorFlow:

  • 使用圖 (graph) 來表示計算任務
  • 在被稱之爲 會話 (Session) 的上下文 (context) 中執行圖
  • 使用 tensor 表示數據
  • 通過 變量 (Variable) 維護狀態
  • 使用 feed 和 fetch可以爲任意的操作(arbitrary operation) 賦值或者從其中獲取數據

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 構造器可以爲其增加節點。 這個默認圖對 許多程序來說已經足夠用了。

#!/usr/bin/env python3
import tensorflow as tf

#創建一個常量op,產生一個2×3矩陣
#這個op被作爲一個節點加到默認圖中
#
#構造器的返回值代表該常量op的返回值
matrix1 = tf.constant([[5.,3.,2.],[1.,2.,3.]])

#創建另一個常量op,產生一個3×4矩陣
matrix2 = tf.constant([[2.,1.,3.,4.],[2.,1.,3.,4.],[2.,1.,2.,4.]])

#創建一個矩陣乘法matmul op
#把matrix1和matrix2作爲輸入
#返回值product代表矩陣乘法的結果
product = tf.matmul(matrix1,matrix2)
# 啓動默認圖.
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)

# 任務完成, 關閉會話.
sess.close()

輸出結果:

[[ 20.  10.  28.  40.]
[ 12.   6.  15.  24.]]

這裏寫圖片描述

默認圖現在有三個節點, 兩個 constant() op, 和一個matmul() op. 爲了真正進行矩陣相乘運算, 並得到矩陣乘法的 結果, 必須在會話裏啓動這個圖。

在一個會話中啓動圖

構造階段完成後, 才能啓動圖。啓動圖的第一步是創建一個 Session 對象, 如果無任何創建參數, 會話構造器將啓動默認圖。
Session 對象在使用完後需要關閉以釋放資源.。除了顯式調用 close 外, 也可以使用 “with” 代碼塊來自動完成關閉動作。

with tf.Session() as sess:
  result = sess.run([product])
  print(result)

交互式使用
可以使用 InteractiveSession 代替 Session 類, 使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run()。 這樣可以避免使用一個變量來持有會話。

#!/usr/bin/env python3
import tensorflow as tf
sess = tf.InteractiveSession()

x = tf.Variable([1.,2.])
y = tf.constant([3.,4.])

#使用初始化器initializer op的run()方法初始化x
x.initializer.run()

#增加一個減法sub op,從x減去y
sub = tf.subtract(x,y)
print(sub.eval())

輸出結果:

[-2. -2.]

這裏寫圖片描述

Tensor

TensorFlow 程序使用 tensor 數據結構來代表所有的數據, 計算圖中, 操作間傳遞的數據都是 tensor。 可以把 TensorFlow tensor 看作是一個 n 維的數組或列表。一個 tensor 包含一個靜態類型 rank, 和 一個 shape。

變量

變量維護圖執行過程中的狀態信息。

使用變量實現一個簡單的計算器:

#!/usr/bin/env python3
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.assign(state,new_value)

#啓動圖後,變量必須先經過初始化(init)op初始化
#首先必須增加一個初始化op到圖中
init_op = tf.initialize_all_variables()

#啓動圖,運行op
with tf.Session() as sess:
    #運行init op
    sess.run(init_op)
    #打印state初始值
    print(sess.run(state))
    #運行op,更新state,並打印state
    for _ in range(3):
        sess.run(update)
        print(sess.run(state))

輸出結果:

0
1
2
3

這裏寫圖片描述

代碼中 assign() 操作是圖所描繪的表達式的一部分, 正如 add() 操作一樣。 所以在調用 run() 執行表達式之前, 它並不會真正執行賦值操作。

通常會將一個統計模型中的參數表示爲一組變量。 例如, 可以將一個神經網絡的權重作爲某個變量存儲在一個 tensor 中.。在訓練過程中, 通過重複運行訓練圖, 更新這個 tensor。

Fetch

爲了取回操作的輸出內容, 可以在使用 Session 對象的 run() 調用 執行圖時, 傳入一些 tensor, 這些 tensor 會幫助取回結果。在之前的例子裏, 我們只取回了單個節點 state, 但是也可以取回多個 tensor:

#!/usr/bin/env python3
import tensorflow as tf

input1 = tf.constant(4.0)
input2 = tf.constant(1.0)
input3 = tf.constant(3.0)
intermed = tf.add(input2, input3)
mul = tf.multiply(input1, intermed)

with tf.Session() as sess:
  result = sess.run([mul, intermed])
  print(result)

輸出結果:

[16.0, 4.0]

這裏寫圖片描述

需要獲取的多個 tensor 值,在 op 的一次運行中一起獲得(而不是逐個去獲取 tensor)。

Feed

上述示例在計算圖中引入了 tensor, 以常量或變量的形式存儲。 TensorFlow 還提供了 feed 機制, 該機制 可以臨時替代圖中的任意操作中的 tensor 可以對圖中任何操作提交補丁, 直接插入一個 tensor。

feed 使用一個 tensor 值臨時替換一個操作的輸出結果。可以提供 feed 數據作爲 run() 調用的參數。feed 只在調用它的方法內有效, 方法結束, feed 就會消失。最常見的用例是將某些特殊的操作指定爲 “feed” 操作, 標記的方法是使用 tf.placeholder() 爲這些操作創建佔位符。

#!/usr/bin/env python3
import tensorflow as tf

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)

with tf.Session() as sess:
  print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))

輸出結果:

[array([ 14.], dtype=float32)]

這裏寫圖片描述

如果沒有正確提供 feed, placeholder() 操作將會產生錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章