TensorFlow初入

老司機的詩和遠方發表於2020-04-06

介紹

TensorFlow™ 是一個採用資料流圖(data flow graphs),用於數值計算的開源軟體庫。TensorFlow 最初由Google大腦小組(隸屬於Google機器智慧研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網路方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。它是谷歌基於DistBelief進行研發的第二代人工智慧學習系統。2015年11月9日,Google釋出人工智慧系統TensorFlow並宣佈開源。

TensorFlow名字的來源

其命名來源於本身的原理,Tensor(張量)意味著N維陣列,Flow(流)意味著基於資料流圖的計算。Tensorflow執行過程就是張量從圖的一端流動到另一端的計算過程。張量從圖中流過的直觀影像是這個工具取名為“TensorFlow”的原因。

什麼是資料流圖(Data Flow Graph)?

資料流圖用“節點”(nodes)和“線”(edges)的有向圖來描述數學計算。“節點”一般用來表示施加的數學操作,但也可以表示資料輸入(feed in)的起點/輸出(push out)的終點,或者是讀取/寫入持久變數(persistent variable)的終點。“線”表示“節點”之間的輸入/輸出關係。這些資料“線”可以運輸“size可動態調整”的多維陣列,即“張量”(tensor)。一旦輸入端所有張量準備好,節點將被分配到各種計算裝置完成非同步並行地執行計算。

流圖

Tensorflow的特性

  • 高度的靈活性: TensorFlow不是一個嚴格的“神經網路”庫。只要你可以將你的計算表示為一個資料流圖,你就可以使用TensorFlow。

  • 可移植性(Portability):Tensorflow可以執行在桌上型電腦、伺服器、手機移動等等裝置上。而且它可以充分使用計算資源,在多CPU和多GPU上執行。

  • 多語言支援:Tensorflow提供了一套易用的Python使用介面來構建和執行graphs,也同樣提供了一套易於C++使用的介面(目前訓練神經網路只支援python,C++介面只能使用已經訓練好的模型)。未來還會支援Go、Java、Lua、Javascript、R等等。

  • 效能最優化:TensorFlow給予了執行緒、佇列、非同步操作等最佳的支援,TensorFlow可以把你手邊硬體的計算潛能全部發揮出來,它可以充分利用多CPU和多GPU。

下載及安裝

既可以直接使用二進位制程式包也可以從github原始碼庫克隆原始碼編譯安裝。

要求
TensorFlow 提供的Python API支援Python2.7和Python3.3+

GPU版本的二進位制程式包只能使用Cuda Toolkit8.0 和 cuDNN v5。如果你使用的是其他版本(Cuda toolkit >= 7.0 and cuDNN >= v3),那你就必須使用原始碼重新編譯安裝。

推薦幾種Linux平臺的安裝方式:

  • Pip install: 可能會升級你之前安裝過的Python包,對你機器上的Python程式造成影響。
  • Anaconda install:把TensorFlow安裝在Anaconda提供的環境中,不會影響其他Python程式。
  • Installing from sources:把TensorFlow原始碼構建成一個pip wheel 檔案,使用pip工具安裝它。

Pip installation
Pip是一個用來安裝和管理Python軟體包的包管理系統。

安裝pip(如果已經安裝,可以跳過)
# Ubuntu/Linux 64-bit

$ sudo apt-get install python-pip python-dev
  • 1

直接使用pip安裝TensorFlow

$ pip install tensorflow
  • 1

如果提示找不到對應的包,使用

pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp27-none-linux_x86_64.whl
  • 1

安裝GPU支援的版本:
# Requires CUDA toolkit 8.0 and CuDNN v5. 其他版本,參考下面的 “Installing from sources”

$ pip install tensorflow-gpu
  • 1

如果提示找不到對應的包,使用

pip install --ignore-installed --upgrade TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp27-none-linux_x86_64.whl
  • 1

注意:如果是從一個較老的版本(TensorFlow<0.7.1)進行升級,需要首先解除安裝之前的TensorFlow和protobuf使用:pip uninstall

Anaconda installation
Anaconda是一個Python發行版,包括大量的數字和科學計算包。使用“conda”來管理軟體包,並且擁有自己的環境系統。安裝步驟
安裝Anaconda
建立conda環境
啟用conda環境,在其中安裝TensorFlow
每次使用TensorFlow時,啟用conda環境

Anaconda具體的安裝和使用可以參考:https://www.continuum.io/downloads

Installing from sources

從原始碼構建TensorFlow,具體的步驟參考:http://blog.csdn.net/toormi/article/details/52904551#t8

基本使用

基本概念

使用TensorFlow前必須明白的基本概念:
圖(Graph):圖描述了計算的過程,TensorFlow使用圖來表示計算任務。
張量(Tensor):TensorFlow使用tensor表示資料。每個Tensor是一個型別化的多維陣列。
操作(op):圖中的節點被稱為op(opearation的縮寫),一個op獲得0個或多個Tensor,執行計算,產生0個或多個Tensor。
會話(Session):圖必須在稱之為“會話”的上下文中執行。會話將圖的op分發到諸如CPU或GPU之類的裝置上執行。
變數(Variable):執行過程中可以被改變,用於維護狀態。

計算圖(The computation graph)

Tensorflow程式通常被組織成一個構建階段和一個執行階段。在構建階段,op的執行步驟被描述成一個圖。在執行階段,使用會話執行圖中的op。

構建圖

構建圖的第一步是建立源op(sources op)。源op不需要任何輸入,例如常量(Constant)。源op的輸出被傳遞給其他op做運算。

在TensorFlow的Python庫中,op構造器的返回值代表這個op的輸出。這些返回值可以作為輸入傳遞給其他op構造器。

TensorFlow的Python庫中包含了一個預設的graph,可以在上面使用新增節點。如果你的程式需要多個graph那就需要使用Graph類管理多個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)
  • 1

預設圖中包含了3個節點:兩個constant() op和一個matmul() op。為了真正的執行矩陣相乘運算,並得到矩陣乘法的結果,你必須在會話中啟動這個圖。

啟動圖

構造階段完成後,才能在會話中啟動圖。啟動圖的第一步是建立一個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()
  • 1

Session物件在使用完成或需要關閉以釋放資源。除了顯示呼叫close外,也可以使用“with”程式碼塊來自動完成關閉動作。

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

Tensorflow的實現上,會把圖轉換成可分散式執行的操作,以充分利用計算資源(例如CPU或GPU)。通常情況下,你不需要顯示指使用CPU或者GPU。TensorFlow能自動檢測,如果檢測到GPU,TensorFlow會使用第一個GPU來執行操作。

如果機器上有多個GPU,除第一個GPU外的其他GPU是不參與計算的,為了使用這些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)
...
  • 1

裝置用字串進行標識. 目前支援的裝置包括:
“/cpu:0”: 機器的 CPU.
“/gpu:0”: 機器的第一個 GPU, 如果有的話.
“/gpu:1”: 機器的第二個 GPU, 以此類推.

Tensor

Tensorflow使用tensor資料結構來代表所有的資料。計算圖的操作之間僅能傳遞tensor。你可以把tensor當作多維陣列或列表。每一個tensor包含有一個靜態型別,一個rank和一個shape。想了解更多TensorFlow是如何操作這些概念的,參考Rank, Shape, and Type

變數

變數維持圖計算過程中的狀態資訊。下面的例子演示瞭如何使用變數作為一個簡單的計數器。

# Create a Variable, that will be initialized to the scalar value 0.
state = tf.Variable(0, name="counter")

# Create an Op to add one to `state`.

one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# Variables must be initialized by running an `init` Op after having
# launched the graph. We first have to add the `init` Op to the graph.
init_op = tf.global_variables_initializer()

# Launch the graph and run the ops.
with tf.Session() as sess:
# Run the 'init' op
sess.run(init_op)
# Print the initial value of 'state'
print(sess.run(state))
# Run the op that updates 'state' and print 'state'.
for _ in range(3):
sess.run(update)
print(sess.run(state))

# output:

# 0
# 1
# 2
# 3
  • 1

通常可以將一個統計模型中的參數列示為一組變數。例如,你可以將一個神經網路的權重當作一個tensor儲存在變數中。在訓練圖的重複執行過程中去更新這個tensor。

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)]
  • 1

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

Feed

上面的例子中展示了在計算圖中引入tensor,以常量和變數的形式儲存。TensorFlow還提供了feed機制,該機制可以臨時替換圖中的tensor。

feed使用一個tensor值臨時替換一個操作的輸出。可以把feed資料作為引數提供給run()方法。標記的方法是使用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)]

轉載:http://blog.csdn.net/toormi/article/details/53609245

相關文章