原文: Deep Learning From Scratch VI: TensorFlow
翻譯:羅莎
審校:孫一萌
TensorFlow
做完了土法神經網路,現在我們來點專業的:上真正的 TensorFlow!
既然 TensorFlow 的執行原理與我們的土法實現是完全相同的,那為什麼不用土法的呢?原因有以下幾個:
-
與我們的土法相關的各種演算法,TensorFlow 都有現成的高效的實現,而且它已歷經其團隊多年的打磨,谷歌有一批專家就專門致力於優化這些演算法的實現。所以我們不需要知道這些演算法細節。我們只需要知道這些演算法在概念上會起到的作用(本節內容),以及如何呼叫它們。
-
TensorFlow 可以在 GPU 上訓練神經網路,藉助大規模的並行運算實現巨大的加速。
-
谷歌正在建立 Tensor 處理單元(TPU),一種專為執行和訓練 TensorFlow Graph 而建立的硬體裝置,能夠更好地提高速度。
-
TensorFlow 內建了許多神經網路體系結構,自己動手實現會非常麻煩。
-
TensorFlow 提供了名為 Keras 的高階 API,它可以用來構建神經網路體系結構,這比之前我們自己定義計算圖要容易得多。
安裝 TensorFlow 非常容易。
在程式碼中,匯入方式如下:
import tensorflow as tf
複製程式碼
由於我們的土法實現的語法仿照了 TensorFlow,因此其實我們已經很熟悉怎樣使用 TensorFlow 了。我們只需作出如下更改:
- 在所有函式呼叫,以及類的前面加上
tf.
。 - 在構建 Graph 之後,呼叫
session.run(tf.global_variables_initializer())
其他方面就完全一樣了。
讓我們用 TensorFlow 建立上一節中的多層感知器:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 在 (0, 0) 和 (1, 1) 處分別建立兩簇紅色點
red_points = np.concatenate((
0.2*np.random.randn(25, 2) + np.array([[0, 0]]*25),
0.2*np.random.randn(25, 2) + np.array([[1, 1]]*25)
))
# 在 (0, 1) 和 (1, 0) 處分別建立兩簇藍色點
blue_points = np.concatenate((
0.2*np.random.randn(25, 2) + np.array([[0, 1]]*25),
0.2*np.random.randn(25, 2) + np.array([[1, 0]]*25)
))
# 建立輸入 placeholder
X = tf.placeholder(dtype=tf.float64)
# 為訓練分類建立 placeholder
c = tf.placeholder(dtype=tf.float64)
# 構建隱藏層
W_hidden = tf.Variable(np.random.randn(2, 2))
b_hidden = tf.Variable(np.random.randn(2))
p_hidden = tf.sigmoid( tf.add(tf.matmul(X, W_hidden), b_hidden) )
# 構建輸出層
W_output = tf.Variable(np.random.randn(2, 2))
b_output = tf.Variable(np.random.randn(2))
p_output = tf.nn.softmax( tf.add(tf.matmul(p_hidden, W_output), b_output) )
# 構建交叉熵損失
J = tf.negative(tf.reduce_sum(tf.reduce_sum(tf.multiply(c, tf.log(p_output)), axis=1)))
# 構建最小化優化器
minimization_op = tf.train.GradientDescentOptimizer(learning_rate = 0.01).minimize(J)
# 構建 placeholder 輸入
feed_dict = {
X: np.concatenate((blue_points, red_points)),
c:
[[1, 0]] * len(blue_points)
+ [[0, 1]] * len(red_points)
}
# 建立 session
session = tf.Session()
# 初始化 variable
session.run(tf.global_variables_initializer())
# 進行 1000 次梯度下降
for step in range(1000):
J_value = session.run(J, feed_dict)
if step % 100 == 0:
print("Step:", step, " Loss:", J_value)
session.run(minimization_op, feed_dict)
# 輸出最終結果
W_hidden_value = session.run(W_hidden)
print("Hidden layer weight matrix:\n", W_hidden_value)
b_hidden_value = session.run(b_hidden)
print("Hidden layer bias:\n", b_hidden_value)
W_output_value = session.run(W_output)
print("Output layer weight matrix:\n", W_output_value)
b_output_value = session.run(b_output)
print("Output layer bias:\n", b_output_value)
# 視覺化分類邊界
xs = np.linspace(-2, 2)
ys = np.linspace(-2, 2)
pred_classes = []
for x in xs:
for y in ys:
pred_class = session.run(p_output,
feed_dict={X: [[x, y]]})[0]
pred_classes.append((x, y, pred_class.argmax()))
xs_p, ys_p = [], []
xs_n, ys_n = [], []
for x, y, c in pred_classes:
if c == 0:
xs_n.append(x)
ys_n.append(y)
else:
xs_p.append(x)
ys_p.append(y)
plt.plot(xs_p, ys_p, 'ro', xs_n, ys_n, 'bo')
複製程式碼