深度學習之TensorFlow(一)——基本使用

1、目前主流的深度學習框架Caffe, TensorFlow, MXNet, Torch, Theano比較python

庫名稱linux

開發語言c++

速度編程

靈活性數組

文檔網絡

適合模型session

平臺數據結構

上手難易併發

Caffe框架

c++/cuda

通常

全面

CNN

全部系統

中等

TensorFlow

c++/cuda/Python

中等

中等

CNN/RNN

Linux, OSX

MXNet

c++/cuda

全面

CNN

全部系統

中等

Torch

c/lua/cuda

全面

CNN/RNN

linux, OSX

中等

Theano

python/c++/cuda

中等

中等

CNN/RNN

Linux, OSX

2、TensorFlow的編程思想

  TensorFlow 使用graph來表示計算任務. 圖中的節點被稱之爲 op (operation 的縮寫). 一個 op得到 0 個或多個 Tensor(類型化多維數組) , 執行計算, 產生 0 個或多個 Tensor . 

  一個tensorflow的圖描述了計算的過程,圖必須在session裏被啓動,session將圖的op分發到cpu或gpu之類的設備上,同時提供執行op的方法,被執行後將產生的tensor返回。python語言中,返回的tensor是numpy對象;c/c++語言中,返回的是tensorflow::Tensor實例。

         計算圖的兩個階段:構建階段和執行階段。

         構建階段,op執行步驟被描述成一個圖(建立一個圖表示和訓練神經網絡)。執行階段使用session執行圖中的op(反覆執行圖中的訓練op)。

(1)構建圖

  第一步是建立源op(source op),不須要任何輸入,源op的輸出被傳遞給其餘op作運算(python庫中,op構造器的返回值表明構造出的op的輸出),tensorflow python庫中有一個默認圖,op構造器能夠爲其增長節點,這個默認圖對許多程序來貨已經夠用了。

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)
#只是構造,若是要真正進行矩陣相乘,必須在session裏啓動這個圖。

   

函數說明:

  1.tf.constant(value,dtype=None,shape=None,name=’Const’)

  建立一個常量tensor,按照給出value來賦值,能夠用shape來指定其形狀。value能夠是一個數,也能夠是一個list。若是是一個數,那麼這個常量中全部值都按該數來賦值。若是是list,那麼len(value)必定要小於等於shape展開後的長度。賦值時,先將value中的值逐個存入。不夠的部分,則所有存入value的最後一個值。例如:

a = tf.constant(2,shape=[2])
b = tf.constant(2,shape=[2,2])
c = tf.constant([1,2,3],shape=[6])
d = tf.constant([1,2,3],shape=[3,2])
sess = tf.InteractiveSession()
print(sess.run(a))
#[2 2]
print(sess.run(b))
#[[2 2]
# [2 2]]
print(sess.run(c))
#[1 2 3 3 3 3]
print(sess.run(d))
#[[1 2]
# [3 3]
# [3 3]]

   2. tf.matmul()用來作矩陣乘法。若a爲l*m的矩陣,b爲m*n的矩陣,那麼經過tf.matmul(a,b) 結果就會獲得一個l*n的矩陣。

不過這個函數還提供了不少額外的功能。咱們來看下函數的定義:

  matmul(a, b,

           transpose_a=False, transpose_b=False,

           a_is_sparse=False, b_is_sparse=False,

           name=None):

  能夠看到還提供了transpose和is_sparse的選項。若是對應的transpose項爲True,例如transpose_a=True,那麼a在參與運算以前就會先轉置一下。而若是a_is_sparse=True,那麼a會被當作稀疏矩陣來參與運算。

(2)在一個會話session中啓動圖

  第一步是建立一個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
若是機器上有超過一個可用的 GPU, 除第一個外的其它 GPU 默認是不參與計算的. 爲了讓 TensorFlow 使用這些 GPU, 你必須將 op 明確指派給它們執行. with...Device 語句用來指派特定的 CPU 或 GPU 執行操做:
with tf.Session() as sess:
  with tf.device("/gpu:1"):  #表示機器第二個GPU
    matrix1 = tf.constant([[3., 3.]])
    matrix2 = tf.constant([[2.],[2.]])
    product = tf.matmul(matrix1, matrix2)
    ...

 (3) 交互式使用

  文檔中的 Python 示例使用一個會話 Session 來啓動圖, 並調用 Session.run() 方法執行操做. 爲了便於使用諸如 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.]

 

函數說明:

  1.  tf.Session()與tf.InteractiveSession()的區別?

  tf.InteractiveSession()加載它自身做爲默認構建的session,tensor.eval()和operation.run()取決於默認的session. 換句話說:InteractiveSession 輸入的代碼少,緣由就是它容許變量不須要使用session就能夠產生結構(運行在沒有指定會話對象的狀況下運行變量)。

  2.  tf.Variable()

  一個變量經過調用run()方法來維持圖的狀態,咱們經過構造variable類的實例來添加一個變量到圖中。Variable()構造器須要一個初始值,能夠是任意類型和shape 的Tensor。構造完成以後,變量的type和shape 是固定的。可使用assign 方法來修改變量的值。

         eg:update = tf.assign(state,new_value)   #意思是state=new_value,而這個操做行爲被賦給了update

  若是你想修改變量的shape,你必須使用assign 操做,而且 validate_shpe=False。  

  屬性:

  device:這個變量的device

  dtype:變量的元素類型

  graph:存放變量的圖

  initial_value:這個變量的初始值

  initializer :這個變量的初始化器

  name:這個變臉的名字

  **op:**The Operation of this variable.

# 建立一個變量, 初始化爲標量 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.

  3.  tf.Tensor.eval(feed_dict=None, session=None):

  做用: 在一個Seesion裏面「評估」tensor的值(其實就是計算),首先執行以前的全部必要的操做來產生這個計算這個tensor須要的輸入,而後經過這些輸入產生這個tensor。在激發tensor.eval()這個函數以前,tensor的圖必須已經投入到session裏面,或者一個默認的session是有效的,或者顯式指定session.

  參數:

  feed_dict:一個字典,用來表示tensor被feed的值(聯繫placeholder一塊兒看)

  session:(可選) 用來計算(evaluate)這個tensor的session.要是沒有指定的話,那麼就會使用默認的session。

  返回:表示「計算」結果值的numpy ndarray

  4.  Tensor

  TensorFlow 程序使用 tensor 數據結構來表明全部的數據, 計算圖中, 操做間傳遞的數據都是 tensor. 你能夠把 TensorFlow tensor 看做是一個 n 維的數組或列表. 一個 tensor 包含一個靜態類型 rank, 和一個 shape.

  5.  Fetch

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

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() as sess:
  result = sess.run([mul, intermed])
  print result
# 輸出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

 6.  Feed

  TensorFlow 還提供了 feed 機制, 該機制能夠臨時替代圖中的任意操做中的 tensor 能夠對圖中任何操做提交補丁, 直接插入一個 tensor.feed使用一個tensor值臨時替換一個操做的輸出結果. 你能夠提供 feed 數據做爲 run() 調用的參數. feed 只在調用它的方法內有效, 方法結束, feed 就會消失. 最多見的用例是將某些特殊的操做指定爲 "feed" 操做, 標記的方法是使用 tf.placeholder() 爲這些操做建立佔位符.

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
  print sess.run([output], feed_dict={input1:[7.], input2:[2.]})
# 輸出:
# [array([ 14.], dtype=float32)]
相關文章
相關標籤/搜索