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年#32號以後;用 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.]]