這系列紀錄了學習 Google Tensorflow 的歷程和一些小心得,主要是參考官方文件。

先從簡介開始吧。



什麼是 Tensorflow?

TensorFlow 是 Google 繼 2011 年開發了 DistBelief 之後,透過使用資料流 (flow) 圖像,來進行數值演算的新一代開源機器學習工具。這個機器學習工具的基礎設計,主要透過圖學裡的「節點」來表達數學運算,「邊」 來表示「節點」間的多維度資料陣列 (tensors,張量),因此命名做 TensorFlow。TensorFlow 主要由 Google 機器智慧研究室與 Google 大腦研究組 (Google Brain Team) 的學者與工程師所開發,容許開發者自由配置運算環境來做深度神經網絡研究,但也足以支持普通環境所需要的服務(例如透過影片進行圖像辨識)。

Tensorflow 的架構

Tensorflow 首先要定義類神經網路的架構,然後再把資料放進架構中去做運算。如下圖:

tensors_flowing

Tensorflow 是透過圖學的概念來運作,一開始要先建立一個 data flow,再將資料放進去。其中節點(Nodes)在圖中表示數學運算,邊(edges)則表示節點間相互聯繫的多維度資料陣列,也就是張量(tensor)。訓練模型時,tensor 會不斷從 data flow graph 中的一個節點流(flow)到另一個節點,這就是 Tensorflow 名稱的由來。

簡單的程式碼

這段來看看要怎麼用簡單的程式碼來建立一個 Tensorflow。

首先,將 tensorflow 和 numpy import 進來,numpy 是用來產生簡單的資料。

1
2
3
4
5
6
import tensorflow as tf
import numpy as np
# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3

接著,用 $tf.Variable$ 來將例描述 $y$ 的參數 $W$(weights) 和 $b$(bias)。透過前面的 $y_data = x_data * 0.1 + 0.3$,我們都知道 $W$ 會是 $0.1$,而 $b$ 是 $0.3$。Tensorflow 的工作就是一步步學習、找出答案,最後將 $W$ 學成 $0.1$,$b$ 學成 $0.3$。

1
2
3
4
5
6
7
# Try to find values for W and b that compute y_data = W * x_data + b
# (We know that W should be 0.1 and b 0.3,
# but TensorFlow will figure that out for us.)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) # 1 dimension, range from -1.0 to 1.0
b = tf.Variable(tf.zeros([1])) # 1 dimension, set to zero
y = W * x_data + b

接著計算 $y$ 和 $y_data$ 的誤差,即 $y$ 和實際 $y_data$ 的差距。這裡的 optimizer 利用 Gradient Descent 來進行 Back Propagation。然後利用這個 optimizer 來減少誤差,提升參數的準確度,而目標就是將誤差最小化。

1
2
3
4
# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5) #learning rate = 0.5
train = optimizer.minimize(loss)

目前為止,只是將 Tensorflow 的架構建起來,在使用這個架構之前,必須先將之前定義的所有 Variable 初始化。

1
2
# Before starting, initialize the variables. We will 'run' this first.
init = tf.global_variables_initializer()

真正開始之前,還有一步,就是建立 Session,利用 Session 來執行剛剛定義的 init 初始化的步驟。

1
2
3
# Launch the graph.
sess = tf.Session()
sess.run(init)

現在,就讓這個神經網路開始一步步的訓練,也就是上面定義的 train。這個訓練一樣是用 Session 來進行,Session 每 run 一次 train,optimizer 就會去減少 $y$ 和 $y_data$ 的誤差,漸漸地這個誤差會越來越小,而理論上預測的準確性也會越來越高。

1
2
3
4
5
6
7
# Fit the line.
for step in range(201): # train 200 times
sess.run(train)
if step % 20 == 0: # print Weight and bias every 20 steps
print(step, sess.run(W), sess.run(b))
# Learns best fit is W: [0.1], b: [0.3]

這是完整的程式碼執行結果:

0 [ 0.26253623] [ 0.29924595]
20 [ 0.13903731] [ 0.27772433]
40 [ 0.1123959] [ 0.29292658]
60 [ 0.10393622] [ 0.2977539]
80 [ 0.10124992] [ 0.29928678]
100 [ 0.10039689] [ 0.29977354]
120 [ 0.10012604] [ 0.2999281]
140 [ 0.10004003] [ 0.29997718]
160 [ 0.10001272] [ 0.29999277]
180 [ 0.10000405] [ 0.29999772]
200 [ 0.10000129] [ 0.29999927]

可以看到,Weight 和 bias 經過學習之後,會慢慢地逼近 0.1 和 0.3。而這就是整個 Tensorflow 的基礎架構和基本用法。

參考連結