TensorFlow是谷歌推出的深度學習平台,目前在各大深度學習平台中使用的最廣泛。
一、安裝命令
pip3 install -U tensorflow --default-timeout=1800 -i https://mirrors.ustc.edu.cn/pypi/web/simple
上面是不支持GPU的版本,支持GPU版本的安裝命令如下
pip3 install -U tensorflow-gpu --default-timeout=1800 -i https://mirrors.ustc.edu.cn/pypi/web/simple
https://mirrors.ustc.edu.cn/pypi/web/simple 是國內的鏡像,安裝速度更快
二、基本數據類型
TensorFlow 中最基本的單位是常量(Constant)、變量(Variable)和占位符(Placeholder)。常量在定義后它的值和維度不可變,變量在定義后它的值可變而維度不可變。在神經網絡中,變量一般可作為存儲權重和其他信息的矩陣,常量可作為存儲超參數或其他結構信息的變量。
三、使用TensorFlow進行機器學習的基本流程
● 准備樣本數據(訓練樣本、驗證樣本、測試樣本)
● 定義節點准備接收數據
● 設計神經網絡:隱藏層和輸出層
● 定義損失函數loss
● 選擇優化器(optimizer) 使 loss 達到最小
● 對所有變量進行初始化,通過 sess.run optimizer,迭代N次進行學習
下面的示意圖是所有 TensorFlow 機器學習模型所遵循的構建流程,即構建計算圖、把數據輸入張量、更新權重變量並返回輸出值。
在第一步使用 TensorFlow 構建計算圖中,需要構建整個模型的架構。例如在神經網絡模型中,需要從輸入層開始構建整個神經網絡的架構,包括隱藏層的數量、每一層神經元的數量、層級之間連接的情況與權重、整個網絡中每個神經元使用的激活函數等。此外,還需要配置整個訓練、驗證與測試的過程。例如在神經網絡中,定義整個正向傳播的過程與參數並設定學習率、正則化率和批量大小等各類超參數。
第二步將訓練數據或測試數據等輸送到模型中,TensorFlow 在這一步中一般需要打開一個會話(Session)來執行參數初始化和輸送數據等任務。例如在計算機視覺中,需要隨機初始化整個模型參數數值,並將圖像成批(圖像數等於批量大小)地輸送到定義好的卷積神經網絡中。
第三步更新權重並獲取返回值,控制訓練過程與獲得最終的預測結果。
TensorFlow 線性回歸示例
線性回歸模型如下圖所示
其中「×」為數據點,找到一條直線最好地擬合這些數據點,這條直線和數據點之間的距離即損失函數,所以我們希望找到一條能令損失函數值最小的直線。以下是使用 TensorFlow 構建線性回歸的簡單示例。
1、構建目標函數(即直線)
目標函數即 H(x)=Wx+b,其中 x 是特征向量、W是特征向量中每個元素對應的權重(Weight)、b(Bias)是偏置項。
# 用來訓練模型的樣本數據
x_train = [1, 2, 3]
y_train = [1, 2, 3]
W = tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
# hypothesis函數 XW+b
hypothesis = x_train * W + b
如上所示定義了 y=wx+b 的運算,即需要擬合的一條直線。
2、構建損失函數
下面構建損失函數,即各數據點到該直線的距離,這里構建的損失函數是均方誤差函數:
該函數表明根據數據點預測的值和該數據點真實值之間的距離,代碼實現:
# 代價/損失 函數
cost = tf.reduce_mean(tf.square(hypothesis - y_train))
其中 tf.square() 是取某個數的平方, tf.reduce_mean() 是取均值。
3、采用梯度下降更新權重
α是學習速率(Learning rate),控制學習速度,需要調節的超參數。
# 最小化
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
為了尋找能擬合數據的最好直線,需要最小化損失函數,即數據與直線之間的距離,采用梯度下降算法。
4、 運行計算圖開始訓練模型
# 打開一個會話Session
sess = tf.Session()
# 初始化變量
sess.run(tf.global_variables_initializer())
# 迭代
for step in range(2000):
sess.run(train)
if step % 200 == 0:
print(step, sess.run(cost), sess.run(W), sess.run(b))
上面的代碼打開了一個會話並執行變量初始化和輸送數據。
5、完整的實現代碼
6、某次訓練時的輸出
step(s): 0001 cost = 0.595171
step(s): 0201 cost = 0.002320
step(s): 0401 cost = 0.000886
step(s): 0601 cost = 0.000338
step(s): 0801 cost = 0.000129
step(s): 1001 cost = 0.000049
step(s): 1201 cost = 0.000019
step(s): 1401 cost = 0.000007
step(s): 1601 cost = 0.000003
step(s): 1801 cost = 0.000001
四、簡單小結
本文簡述了使用TensorFlow訓練模型的過程,無論設計多么復雜的神經網絡,都可以參考以上過程,當然在實際生產中還需要考慮很多因素,比如:樣本數據的收集、樣本數據的預處理、模型的選擇和神經網絡的設計、過擬合/欠擬合問題、梯度消失/膨脹問題、超參數的設置、是否需要GPU和分布式加快訓練速度等等。
在設計深度網絡時需要注意每層神經元的維度,這個地方容易出錯,特別是層數深、每層神經元數量多的復雜神經網絡, 參見《介紹一個快速確定神經網絡模型中各層矩陣維度的方法》。
ps:目前多個廠家都推出了機器學習公有平台,一般都會支持TensorFlow,在公有平台上學習AI算法比自己搭建平台省心。