TensorFlow簡要教程及線性回歸算法示例


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算法比自己搭建平台省心。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM