Tensorflow基礎學習極簡版

一、知識框架

在這裏插入圖片描述

二、內容概述

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)]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章