一、什麼是TensorFlow
(一)TensorFlow簡介
TensorFlow是由Google Brain團隊開發出來的一個可擴展的多平台程式設計介面,用於實作和執行機器學習演算法,於2015年11月以寬鬆的開源版權公開給大眾使用。TensorFlow目前支持多種程式語言的前端介面,而Python的API算是較完整的。
我們可將TensorFlow拆成Tensor與Flow二個部份,來更深入了解TensorFlow,餵給模型處理或由模型計算、輸出的數據可視為Tensor,而模型的演算流程即是Flow。
(二)Tenor(「張量」)概述
「張量」是紀錄數據值的一個物件,而「張量」的維數則稱為「階」(rank),例如:
-
一個整數或浮點數的「純量」,就稱為一個「階度」為0的「張量」
-
向量則是「階度」為1的「張量」
-
矩陣是「階度」為2的「張量」
依其性質,「張量」可區分為以下二種類型:
1.佔位符(placeholders)
「佔位符」是個事先定義好,具有特定型別和形狀的「張量」,是作為為模型輸入數據的機制。
2.變數(variable)
「變數」是個特殊型別的「張量」物件,我們利用它來儲存和更新模型演算過程中的運算參數。
(三)Flow概念
在這裏我們要認識「計算圖」(Graph)與「工作」(Session)這二個觀念,我們可簡略地將「計算圖」視為在規劃草圖,而「工作」則是真正在草圖上畫上顏色,所以同樣的草圖,我們可執行不同的「工作」為其畫上不同的顏色,而每次「工作」完成的圖可儲存起來,供未來使用。
步驟流程可略述如下:
1.建立一個新的、空的「計算圖」。
2.將節點(「張量」與模型運算式)加入這個「計算圖」。
3.執行這個「計算圖」:
(1)開始一個新的「工作」
(2)初始化「計算圖」中的「變數」
(3)執行這個「工作」中的「計算圖」
(4)將「工作」執行完成的「計算圖」儲存起來(儲存模型變數)
4.呼叫先前執行完成的「計算圖」
(1)重建一個與儲存模型具有相同節點和名稱的「計算圖」
(2)在新的「工作」環境中將儲存的變數載入
二、以一元一次迴歸模型練習說明TensorFlow流程
"""
迴歸模型
y = wx + b
x:特徵向量
y:目標向量
w:加權參數
b:偏誤參數
"""
"""
資料集
訓練資料:
x_train:訓練用特徵向量
y_train:訓練用目標向量
測試資料:
x_test:測試用特徵向量
y_test:測試用目標向量
"""
# 安裝TensorFlow套件至Python平台
pip install tensorflow
# 在Python程式中匯入tensorflow
import tensorflow as tf
# 產生一張TensorFlow的空白計算圖
g = tf.Graph()
# 將「張量」與模型運算式加到計算圖裏
with g.as_default():
# 設定隨機抽樣種子
tf.set_random_seed(123)
# 1.加入「張量」
# 1.1.加入模型佔位符
# 1.1.1.加入特徵向量佔位符
tf_x = tf.placeholder(shape=(None), dtype=tf.float32, name='tf_x') # shape設定為None的原因,是因為無法事先就知道會輸入多少筆資料
# 1.1.2.加入目標向量佔位符
tf_y = tf.placeholder(shape=(None), dtype=tf.float32, name='tf_y')
# 1.2.加入模型變數
# 1.2.1.加入加權參數變數
weight = tf.Variable(tf.random_normal(shape=(1,1),stddev=0.25)), name='weight) # 隨機設定加權參數初始值
# 1.2.2.加入偏誤參數變數
bias = tf.Variable(0.0, name='bias') # 設定偏誤參數初始值為0.0
# 2.加入模型運算式
# 2.1.建立y=wx+b迴歸模型
y_hat = tf.add(weight * tf_x, bias, name='y_hat')
# 2.2.以「均方誤差(MSE)」作為模型訓練時的成本函數
cost = tf.reduce_mean(tf.square(tf_y - y_hat), name='cost')
# 2.3.以梯度下降法最小化成本函數來訓練模型
optim = tf.train.GradientDescentOptimizer(learning_rate=0.001) # 設定梯度下降法
train_op = optim.minimize(cost, name='train_op') # 以最小化成本函數來訓練模型
# 3.我們產生一個tf.train.Saver類別物件,將模型訓練結果儲存起來
saver = tf.train.Saver()
# 開始一個新的「工作」,執行先前已定義好的「計算圖」g
with tf.Session(graph=g) as sess:
# 1.初始化「計算圖」g中定義的「變數」w、b的初始值
sess.run(tf.global_variables_initializer())
# 2.開始執行這個「工作」中的「計算圖」來訓練模型
## 設定訓練模型500次
for i in range(500):
## 指定數據集x_train為「計算圖」中佔位符tf_x
## 指定數據集y_train為「計算圖」中佔位符tf_y
## 使用tf_x及tf_y這二個「佔位符」「張量」,執行「計算圖」裏定義的最小成本梯度下降法運算式來訓練模型
c, _ = sess.run([cost, train_op], feed_dict={tf_x: x_train, tf_y: y_train})
# 3.完成500次的訓練後,將模型的訓練結果儲存起來
saver.save(sess, './trained-model') # './trained-model'為指定檔案儲存名稱
"""
模型經過500次訓練後,會產生一組經訓練結果產生的w與b值
"""
"""
利用前面訓練好的模型,餵給模型測試資料x_test,求算迴歸模型的預測目標向量
"""
# 產生一張新的「計算圖」
g2 = tf.Graph()
# 開始一個新的「工作」,執行g2「計算圖」
with tf.Session(graph=g2) as sess:
# 1.重建一個與先前儲存模型有相同節點和名稱的「計算圖」
new_saver = tf.train.import_meta_graph('./trained-model.meta')
# 2.在新的工作環境中,將儲存的w、b變數載入
new_saver.restore(sess, './trained-model')
# 3.餵給模型測試資料x_test,執行「計算圖」定義的迴歸運算式,求算模型的預測目標向量
y_pred = sess.run('y_hat: 0, feed_dict={'tf_x:0': x_test})
下一則: Python機器學器筆記(十二):多層類神經網路
限會員,要發表迴響,請先登入



