TensorFlow

人工智慧 TensorFlow (1)

教學目標

初步了解 TensorFlow 開放源始碼軟體函式庫基礎應用。

重點概念

首先 TensorFlow 主要是機器智慧的開放源始碼軟體函式庫,它主要使用於資料流圖進行數值的運算,圖中的節點表示數學運算,而圖的邊代表多維資料陣列之間通訊。靈活的架構允許我們使用單一 API 將運算部署至桌面、伺服器或行動裝置中的一個或多個 CPU 或 GPU,因此主要有三個重點,分別為:

  1. 開放源始碼 (Open Source)
  2. 數值運算函式庫 (Library for Numerical Computation)
  3. 資料流圖 (Data Flow Graphs)

同時 TensorFlow 最初是由 Google 機器智慧研究機構的 Google Brian 團隊研究人員和工程師開發,主要應用於進行機器學習和深度學習的研究,並且該系統能夠適用於不同的領域。

接著 TensorFlow 主要目標並非提供現有的機器學習解決方案,而是提供一個能夠讓使用者透過數學方法從零開始定義模型的套件,以利具有一定技術背景的使用者可以快速的創建自定義且高靈活性的模型。此外 TensorFlow 的運算模型主要是有向圖 (Directed Graph),圖中每個節點代表函數或運算,圖中每個邊代表數值、矩陣或張量。

再來 TensorFlow 函式庫採用資料流圖主要的原因有三項,分別為:

  1. 實作:許多常見類神經網路的機器學習模型就是以有向圖的形式表示,因此採用資料流圖將更容易實作。
  2. 運算:透過運算分解決為較小和較易微分的環節,以利自動運算任意節點對於第一個節點的輸出產生的影響,請注意任何節點的導數和梯度能力對於建立機器學習模型非常重要。
  3. 優化:若我們將運算分散在多個 CPU 、 GPU 或其它運算機器上時,則僅需將完整且較大的資料流圖分解為較小的圖。以利每台運算機器負責一個獨立的運算子圖,同時不同機器之間將會共享資訊進行調整。

最後我們開始透過 TensorFlow 函式庫建立機器學習模型,我們主要透過一個簡單範例開始使用 TensorFlow ,我們將會先準備訓練資料,其中 W 代表權重 (Weight),介於 -1 至 1 之間,接著 b 代表偏值 (bias),從 0 開始的任意數值,y 代表預測值,接著我們的目標主要是要讓損失最小化,主要是採用總平方誤差,也就是模型針對每個訓練樣本的預測值與期望輸出值的差平方總和,並且透過實作梯度下降演算法的優化器進行優化,我們將會設定學習機制的學習率訓練模型。

安裝 TensorFlow 函式庫

我們可以透過下述指令安裝 CPU 版本的 TensorFlow 函式庫。

1
$ pip install tensorflow

測試 TensorFlow 函式庫

我們可以透過下述程式測試 TensorFlow 函式庫是否正常使用。

編輯 TensorflowTest.py 程式

1
2
3
4
import tensorflow as tf
hello = tf.constant('Hi TensorFlow.')
sess = tf.Session()
print(sess.run(hello))

執行 TensorflowTest.py 程式

1
2
$ python TensorflowTest.py
Hi TensorFlow.

應用 TensorFlow 函式庫

我們開始透過下述程式應用 TensorFlow 函式庫訓練模型讓模型中的學習函數一步一步逼近模擬資料的目標函數。

編輯 TensorflowTrainModel.py 程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import tensorflow as tf
import numpy as np
# 建立 100 個亂數值,其介於 0 ~ 1 之間
x_data = np.random.rand(100).astype(np.float32)
# 建立目標函數 Y=XW + b
y_data = x_data * 0.3 + 1.5
# 初始化權重和偏值的範圍
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
# 設定學習函數
y = W * x_data + b
# 設定損失函數
loss = tf.reduce_mean(tf.square(y - y_data))
# 設定優化函數
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.5)
# 設定訓練函數
train = optimizer.minimize(loss)
# 初始化所有變數
init = tf.global_variables_initializer()
# 建立工作階段
sess = tf.Session()

# 開始訓練模型
sess.run(init)
# 總共執行 201 次每 50 次輸出學習結果
for step in range(201):
sess.run(train)
if step % 50 == 0:
print(step, sess.run(W), sess.run(b))

# 關閉工作階段
sess.close()

執行 TensorflowTrainModel.py 程式

1
2
3
4
5
6
$ python TensorflowTrainModel.py
(0, array([ 1.37912631]), dtype=float32), array([ 1.24819088], dtype=float32))
(50, array([ 0.32600206]), dtype=float32), array([ 1.48647678], dtype=float32))
(100, array([ 0.30070987]), dtype=float32), array([ 1.49963081], dtype=float32))
(150, array([ 0.30001935]), dtype=float32), array([ 1.49998999], dtype=float32))
(200, array([ 0.30000103]), dtype=float32), array([ 1.49999952], dtype=float32))

透過上述結果我們可以了解訓練模型中的學習函數一步一步逼近目標函數,下一步我們可以在上述程式中加入下述程式,並且執行 Python 程式產生資料流圖的摘要記錄檔。

1
writer = tf.summary.FileWriter("TensorBoard/", graph = sess.graph)

緊接著我們執行下述 TensorBoard 指令啟動 TensorBoard 網站視覺化 TensorFlow 程式的執行結果。

1
$ tensorboard --logdir='TensorBoard/'

此時我們就能夠開啟瀏覽器輸入下述網址開啟 TensorBoard 網站,該網站就能夠瀏覽 TensorFlow 程式所產生的資料流圖,以利我們快速了解 TensorFlow 程式中不同運算節點之間的關係與連結。

1
http://localhost:6006

總結 TensorFlow 機器智慧的開放源始碼軟體函式庫,它比較適合有技術能力的專家使用,不太適合初學者使用,因為它並沒有提供現有的機器學習函式庫,而是提供框架透過數學方法建立機器學習的模型,同時針對訓練的結果視覺化產生資料流程以利使用者更有效率的調整與優化模型。

相關資源

資料分析 Machine Learning (6)

教學目標

初步了解如何透過 Amazon EC2 線上服務安裝 TensorFlow 機器學習環境,此篇主要為學習筆記。

重點概念

TensorFlow 是個 Google 所推出的開源軟體函式庫,主要用於進行機器學習和深層神經網路研究,並且適用於各種領域,其是採用資料流程圖進行數值運算,圖中每個節點皆表示數學運運算,說圖的邊緣則表示節點彼此之間傳遞的多維資料陣列,稱之為 Tensors。靈活的架構允許我們使用單個 API 部署至桌面、伺服器或行動裝置中。此外因為 TensorFlow 是開源軟體所以能夠部署至任何雲端平台,並且依據公司的需求進行程式碼重新編譯及調整,現在我們開始透過 Amazon EC2 線上服務安裝 TensorFlow 機器學習環境,首先開啟 Amazon EC2 線上服務選擇 Ubuntu Server 16.04 LTS 映像檔。

選擇實體的類型為「p2.xlarge」。

請選擇「Create a new key pair」,輸入「Key pair name」為「tensorflow」,再按下「Download Key Pair」下載「tensorflow.pem」金鑰檔,接著按下「Launch Instances」鈕啟動實體。

按下「View Instances」鈕。

將實體命名為「TensorFlow」,並且複製 IPv4 Public IP 位置。

透過終端機工具連線至 Amazon EC2 實體機器。

1
$ sudo ssh -i tensorflow.pem ubuntu@[IP 位置]

開啟環境變數設定檔。

1
$ vi .bachrc

確認有下述 CUDA 的路徑設定,所謂 CUDA 為 NVIDIA 所提出的平行運算架構,可運用繪圖處理單元 (GPU) 強大處理能力,大幅增加運算效能。

1
2
3
4
export CUDA_HOME=/usr/local/cuda
export CUDA_ROOT=/usr/local/cuda
export PATH=$PATH:$CUDA_ROOT/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_ROOT/lib64

安裝 CUDA 工具套件 8.0。

1
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
1
2
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo apt-get update

1
$ sudo apt-get install -y nvidia-367 libcuda1-367

(註: 目前 AWS 線上服務提供兩個支援 GPU 的實體 P2 和 G2,P2 使用 nvidia-367 和 libcuda1-367 ,而 G2 則使用 nvidia-375 和 libcuda1-375 )

1
2
$ sudo apt-get install -y cuda-toolkit-8-0
$ sudo reboot

檢查 GPU 顯示卡的狀態。

1
$ nvidia-smi

下載並設置 cuDNN 深度神經網路函式庫。

1
2
$ wget https://s3-ap-southeast-1.amazonaws.com/labs.leoyeh.me/ml/google_tensorflow/cudnn-8.0-linux-x64-v5.1.tgz
$ sudo tar -xvf cudnn-8.0-linux-x64-v5.1.tgz -C /usr/local

安裝 Python3 工具。

1
$ sudo apt-get install -y python3-pip

安裝 tensorflow-gpu 函式庫。

1
$ pip3 install tensorflow-gpu

進行驗證,簡單透過 TensorFlow 函式庫顯示訊息和進行運算。

1
2
3
4
5
6
$ python3
import tensorflow as tf
sess = tf.Session()
message = tf.constant("Hello, TensorFlow!")
print(sess.run(message))
print(sess.run(tf.constant(123)*tf.constant(456)))

機器學習實驗完成,可以先關閉 Amazon EC2 的實體機器,以節省經費,此外每次停止再重新啟動時若沒特別設定則 IP 會重新分配。

總結官方提供 virtualenv 、 Docker 和 Anaconda 相關安裝管理軟體的安裝方式,但是我們先試著只安裝 TensorFlow 函式庫和 CUDA 工具套件,確保正常運作進行驗證之後,接下來我們再嘗試相關安裝管理軟體,其實 Ansible 也是個不錯的選擇。

相關資源