1. 程式人生 > 其它 >tensorflow(一)windows 10 python3.6安裝tensorflow1.4與基本概念解讀

tensorflow(一)windows 10 python3.6安裝tensorflow1.4與基本概念解讀

一.安裝

目前用了tensorflow、deeplearning4j兩個深度學習框架, tensorflow 之前一直支援到python 3.5,目前以更新到3.6,故安裝最新版體驗使用。 慢慢長征路:安裝過程如下 WIN10: anaconda3.5: PYTHON3.6: tensorflow1.4:

二.TensorFlow 基本概念與原理理解

1.TensorFlow 的工作原理

TensorFlow是用資料流圖(data flow graphs)技術來進行數值計算的。資料流圖是描述有向圖中的數值計算過程。

有向圖中,節點通常代表數學運算,邊表示節點之間的某種聯絡,它負責傳輸多維資料(Tensors)。

節點可以被分配到多個計算裝置上,可以非同步和並行地執行操作。因為是有向圖,所以只有等到之前的入度節點們的計算狀態完成後,當前節點才能執行操作。

2.TensorFlow 基本用法

接下來按照官方文件中的具體程式碼,來看一下基本用法。你需要理解在TensorFlow中,是如何: 5步: 一.將計算流程表示成圖; 二.通過Sessions來執行圖計算; 三將資料表示為tensors; 四 使用Variables來保持狀態資訊; 五  分別使用feeds和fetches來填充資料和抓取任意的操作結果

使用TensorFlow,你必須明白TensorFlow:

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

案例

例1,生成三維資料,然後用一個平面擬合它:

以下是官網的操作案例

import tensorflow as tf
import numpy as np

# 用 NumPy 隨機生成 100 個數據
x_data = np.float32(np.random.rand(2, 100)) 
y_data = np.dot([0.100, 0.200], x_data) + 0.300

# 構造一個線性模型
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# 初始化變數
init = tf.global_variables_initializer()
#官網是tf.initialize_all_variables() 該函式將不再使用,在 2017年#3月2號以後;用 tf.global_variables_initializer() 替代 #tf.initialize_all_variables()
# 啟動圖 (graph)
sess = tf.Session()
sess.run(init)

# 擬合平面
for step in xrange(0, 201):
    sess.run(train)
    if step % 20 == 0:
        print step, sess.run(W), sess.run(b)
# 輸出結果為:
0 [[-0.14751725  0.75113136]] [ 0.2857058]
20 [[ 0.06342752  0.32736415]] [ 0.24482927]
40 [[ 0.10146417  0.23744738]] [ 0.27712563]
60 [[ 0.10354312  0.21220125]] [ 0.290878]
80 [[ 0.10193551  0.20427427]] [ 0.2964265]
100 [[ 0.10085492  0.201565  ]] [ 0.298612]
120 [[ 0.10035028  0.20058727]] [ 0.29946309]
140 [[ 0.10013894  0.20022322]] [ 0.29979277]
160 [[ 0.1000543   0.20008542]] [ 0.29992008]
180 [[ 0.10002106  0.20003279]] [ 0.29996923]
200 [[ 0.10000814  0.20001261]] [ 0.29998815]

接下來看具體概念: TensorFlow 用圖來表示計算任務,圖中的節點被稱之為operation,縮寫成op。 一個節點獲得 0 個或者多個張量 tensor,執行計算,產生0個或多個張量。 圖必須在會話(Session)裡被啟動,會話(Session)將圖的op分發到CPU或GPU之類的裝置上,同時提供執行op的方法,這些方法執行後,將產生的張量(tensor)返回。

構建圖 例2,計算矩陣相乘:

import tensorflow as tf
# 建立一個 常量 op, 返回值 'matrix1' 代表這個 1x2 矩陣.
matrix1 = tf.constant([[3., 3.]])

# 建立另外一個 常量 op, 返回值 'matrix2' 代表這個 2x1 矩陣.
matrix2 = tf.constant([[2.],[2.]])

# 建立一個矩陣乘法 matmul op , 把 'matrix1' 和 'matrix2' 作為輸入.
# 返回值 'product' 代表矩陣乘法的結果.
product = tf.matmul(matrix1, matrix2)

預設圖有三個節點, 兩個 constant() op, 和一個 matmul() op. 為了真正進行矩陣相乘運算, 並得到矩陣乘法的結果, 你必須在會話裡啟動這個圖.

張量 Tensor

從向量空間到實數域的多重線性對映(multilinear maps)(v是向量空間,v*是對偶空間) 你可以把Tensorflow的tensor看做是一個n維的陣列或列表。一個tensor包含一個靜態型別rank和一個shape。

階 在Tensorflow系統中,張量的維數被描述為階。但是張量的階和矩陣的階並不是同一個概念。張量的階是張量維數的一個數量描述,下面的張量(使用python中list定義的)就是2階: t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 你可以認為一個二階張量就是我們平常所說的矩陣,一階張量可以認為是一個向量。對於一個二階張量,你可以使用語句t[i, j]來訪問其中的任何元素。而對於三階張量你可以通過t[i, j, k]來訪問任何元素:

形狀

Tensorflow文件中使用了三種記號來方便地描述張量的維度:階,形狀以及維數。以下展示了它們之間的關係:

資料型別

除了維度,tensor有一個數據型別屬性。你可以為一個張量指定下列資料型別中的任意一個型別:

在一個會話中啟動圖 建立一個 Session 物件, 如果無任何建立引數, 會話構造器將啟動預設圖。 會話負責傳遞 op 所需的全部輸入,op 通常是併發執行的。

# 啟動預設圖.
sess = tf.Session()

# 呼叫 sess 的 'run()' 方法, 傳入 'product' 作為該方法的引數,
# 觸發了圖中三個 op (兩個常量 op 和一個矩陣乘法 op),
# 向方法表明, 我們希望取回矩陣乘法 op 的輸出.
result = sess.run(product)

# 返回值 'result' 是一個 numpy `ndarray` 物件.
print result
# ==> [[ 12.]]

# 任務完成, 需要關閉會話以釋放資源。
sess.close()

互動式使用
在 Python API 中,使用一個會話 Session 來 啟動圖, 並呼叫 Session.run() 方法執行操作.

為了便於在 IPython 等互動環境使用 TensorFlow,需要用 InteractiveSession 代替 Session 類, 使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run()。

例3,計算 ‘x’ 減去 ‘a’:

# 進入一個互動式 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.]

變數 Variable

上面用到的張量是常值張量(constant)。

變數 Variable,是維護圖執行過程中的狀態資訊的. 需要它來保持和更新引數值,是需要動態調整的。

下面程式碼中有 tf.initialize_all_variables,是預先對變數初始化, Tensorflow 的變數必須先初始化,然後才有值!而常值張量是不需要的。

下面的 assign() 操作和 add() 操作,在呼叫 run() 之前, 它並不會真正執行賦值和加和操作。

例4,使用變數實現一個簡單的計數器:

# -建立一個變數, 初始化為標量 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 初始化,
# 才真正通過Tensorflow的initialize_all_variables對這些變數賦初值
init_op = tf.initialize_all_variables()

# 啟動預設圖, 執行 op
with tf.Session() as sess:

  # 執行 'init' op
  sess.run(init_op)

  # 列印 'state' 的初始值
  # 取回操作的輸出內容, 可以在使用 Session 物件的 run() 呼叫 執行圖時, 
  # 傳入一些 tensor, 這些 tensor 會幫助你取回結果. 
  # 此處只取回了單個節點 state,
  # 也可以在執行一次 op 時一起取回多個 tensor: 
  # result = sess.run([mul, intermed])
  print sess.run(state)

  # 執行 op, 更新 'state', 並列印 'state'
  for _ in range(3):
    sess.run(update)
    print sess.run(state)

上面的程式碼定義了一個如下的計算圖:

Ok,總結一下,來一個清晰的程式碼: 過程就是:建圖->啟動圖->執行取值

計算矩陣相乘:

import tensorflow as tf

# 建圖
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])

product = tf.matmul(matrix1, matrix2)

# 啟動圖
sess = tf.Session()

# 取值
result = sess.run(product)
print result

sess.close()

上面的幾個程式碼介紹了基本用法,通過觀察,有沒有覺得 tf 和 numpy 有點像呢。

TensorFlow和普通的Numpy的對比,來看一下二者之間的區別:

eval()

在 Python 中定義完 a 後,直接列印就可以看到 a。

In [37]: a = np.zeros((2,2))

In [39]: print(a)
[[ 0.  0.]
 [ 0.  0.]]

但是在 Tensorflow 中需要顯式地輸出(evaluation,也就是說藉助eval()函式)!

In [38]: ta = tf.zeros((2,2))

In [40]: print(ta)
Tensor("zeros_1:0", shape=(2, 2), dtype=float32)

In [41]: print(ta.eval())
[[ 0.  0.]
[ 0. 0.]]