天天看點

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

點選檢視第一章 點選檢視第三章

第2章

TensorFlow進階

本章将介紹如何使用TensorFlow的關鍵元件,并串聯起來建立一個簡單的分類器,評估輸出結果。閱讀本章你會學到以下知識點:

  • 計算圖中的操作
  • TensorFlow的嵌入Layer
  • TensorFlow的多層Layer
  • TensorFlow實作損失函數
  • TensorFlow實作反向傳播
  • TensorFlow實作随機訓練和批量訓練
  • TensorFlow實作建立分類器
  • TensorFlow實作模型評估

2.1 簡介

現在我們已經學習完TensorFlow如何建立張量,使用變量和占位符;下面将把這些對象組成一個計算圖。基于此,建立一個簡單的分類器,并看下性能如何。

本書的所有源代碼可以在GitHub(

https://github.com/nfmcclure/tensorflow_cookbook

)下載下傳。

2.2 計算圖中的操作

現在可以把這些對象表示成計算圖,下面介紹計算圖中作用于對象的操作。

2.2.1 開始

導入TensorFlow,建立一個會話,開始一個計算圖:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.2.2 動手做

在這個例子中,我們将結合前面所學的知識,傳入一個清單到計算圖中的操作,并列印傳回值:

1.首先,聲明張量和占位符。這裡,建立一個numpy數組,傳入計算圖操作:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

上述代碼的輸出如下所示:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.2.3 工作原理

首先,建立資料集和計算圖操作,然後傳入資料、列印傳回值。下面展示計算圖(見圖2-1):

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.3 TensorFlow的嵌入Layer

在本節,我們将學習如何在同一個計算圖中進行多個乘法操作。

2.3.1 開始

下面我們将用兩個矩陣乘以占位符,然後做加法。傳入兩個矩陣(三維numpy數組):

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.3.2 動手做

知道資料在傳入後是如何改變形狀的也是非常重要的。我們将傳入兩個形狀為3×5的numpy數組,然後每個矩陣乘以常量矩陣(形狀為5×1),将傳回一個形狀為3×1的矩陣。緊接着再乘以1×1的矩陣,傳回的結果矩陣仍然為3×1。最後,加上一個3×1的矩陣,示例如下:

1.首先,建立資料和占位符:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.接着,建立矩陣乘法和加法中要用到的常量矩陣:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

3.現在聲明操作,表示成計算圖:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

4.最後,通過計算圖傳入資料:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.3.3 工作原理

上面建立的計算圖可以用Tensorboard可視化。Tensorboard是TensorFlow的功能,允許使用者在圖中可視化計算圖和值。這些功能是原生的,不像其他機器學習架構。如果想知道這是如何做到的,可參見第11章。圖2-2是分層的計算圖。

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.3.4 延伸學習

在我們通過計算圖運作資料之前要提前估計好聲明資料的形狀以及預估操作傳回值的形狀。由于預先不知道,或者次元在變化,情況也可能發生變化。為了實作目标,我們指明變化的次元,或者事先不知道的次元設為None。例如,占位符列數未知,使用方式如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

上面雖然允許打破矩陣乘法規則,但仍然需要遵守——乘以常量矩陣傳回值有一緻的行數。在計算圖中,也可以傳入動态的x_data,或者更改形狀的x_data,具體細節将在多批量傳入資料時講解。

盡管可以使用None調節變量在某個次元上的大小,但是建議讀者盡量能夠明确變量的形狀,并在代碼中明确。None次元主要應用在限制訓練或者測試時的資料批量大小(即一次計算時多少個資料點參與運算)方面。

2.4 TensorFlow的多層Layer

目前,我們已經學完在同一個計算圖中進行多個操作,接下來将講述如何連接配接傳播資料的多個層。

2.4.1 開始

本節中,将介紹如何更好地連接配接多層Layer,包括自定義Layer。這裡給出一個例子(資料是生成随機圖檔資料),以更好地了解不同類型的操作和如何用内建層Layer進行計算。我們對2D圖像進行滑動視窗平均,然後通過自定義操作層Layer傳回結果。

在這節,我們将會看到TensorFlow的計算圖太大,導緻無法完整檢視。為了解決此問題,将對各層Layer和操作進行層級命名管理。按照慣例,加載numpy和tensorf?low子產品,建立計算圖,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.4.2 動手做

1.首先,通過numpy建立2D圖像,4×4像素圖檔。我們将建立成四維:第一維和最後一維大小為1。注意,TensorFlow的圖像函數是處理四維圖檔的,這四維是:圖檔數量、高度、寬度和顔色通道。這裡是一張圖檔,單顔色通道,是以設兩個次元值為1:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.下面在計算圖中建立占位符。此例中占位符是用來傳入圖檔的,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

3.為了建立過濾4×4像素圖檔的滑動視窗,我們将用TensorFlow内建函數conv2d()(常用來做圖像處理)卷積2×2形狀的常量視窗。conv2d()函數傳入滑動視窗、過濾器和步長。本例将在滑動視窗四個方向上計算,是以在四個方向上都要指定步長。建立一個2×2的視窗,每個方向長度為2的步長。為了計算平均值,我們将用常量為0.25的向量與2×2的視窗卷積,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

可以使用函數中的name參數将層命名為Moring-Arg-Window。還可以使用公式:Output = (W - F + 2P)/S + 1計算卷積層的傳回值形狀。這裡,W是輸入形狀,F是過濾器形狀,P是padding的大小,S是步長形狀。

4.現在定義一個自定義Layer,操作滑動視窗平均的2×2的傳回值。自定義函數将輸入張量乘以一個2×2的矩陣張量,然後每個元素加1。因為矩陣乘法隻計算二維矩陣,是以剪裁圖像的多餘次元(大小為1)。TensorFlow通過内建函數squeeze()剪裁。下面是新定義的Layer:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

5.現在把剛剛新定義的Layer加入到計算圖中,并且用tf.name_scope()命名唯一的Layer名字,後續在計算圖中可折疊/擴充Custom_Layer層,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

6.為占位符傳入4×4像素圖檔,然後執行計算圖,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.4.3 工作原理

已命名的層級Layer和操作的可視化圖看起來更清晰,我們可以折疊和展開已命名的自定義層Layer。在圖2-3中,我們可以在左邊看到折疊的概略圖,在右邊看到展開的詳細圖:

2.5 TensorFlow實作損失函數

損失函數(loss function)對機器學習來講是非常重要的。它們度量模型輸出值與目标值(target)間的內插補點。本節會介紹TensorFlow中實作的各種損失函數。

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.5.1 開始

為了優化機器學習算法,我們需要評估機器學習模型訓練輸出結果。在TensorFlow中評估輸出結果依賴損失函數。損失函數告訴TensorFlow,預測結果相比期望的結果是好是壞。在大部分場景下,我們會有算法模型訓練的樣本資料集和目标值。損失函數比較預測值與目标值,并給出兩者之間的數值化的內插補點。

本節會介紹TensorFlow能實作的大部分損失函數。

為了比較不同損失函數的差別,我們将會在圖表中繪制出來。先建立計算圖,然後加載matplotlib(Python的繪圖庫),代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.5.2 動手做

1.回歸算法的損失函數。回歸算法是預測連續因變量的。建立預測序列和目标序列作為張量,預測序列是-1到1之間的等差數列,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.L2正則損失函數(即歐拉損失函數)。L2正則損失函數是預測值與目标值內插補點的平方和。注意,上述例子中目标值為0。L2正則損失函數是非常有用的損失函數,因為它在目标值附近有更好的曲度,機器學習算法利用這點收斂,并且離目标越近收斂越慢,代碼

如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

TensorFlow有内建的L2正則形式,稱為nn.l2_loss()。這個函數其實是實際L2正則的一半,換句話說,它是上面l2_y_vals的1/2。

3.L1正則損失函數(即絕對值損失函數)。與L2正則損失函數對內插補點求平方不同的是,L1正則損失函數對內插補點求絕對值,其優勢在于當誤差較大時不會變得更陡峭。L1正則在目标值附近不平滑,這會導緻算法不能很好地收斂。代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

4.Pseudo-Huber損失函數是Huber損失函數的連續、平滑估計,試圖利用L1和L2正則削減極值處的陡峭,使得目标值附近連續。它的表達式依賴參數delta。我們将繪圖來顯示delta1 = 0.25和delta2 = 5的差別,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

現在我們轉向用于分類問題的損失函數。分類損失函數是用來評估預測分類結果的。通常,模型對分類的輸出為一個0~1之間的實數。然後我們標明一個截止點(通常為0.5),并根據輸出是否高于此點進行分類。

5.重新給x_vals和target指派,儲存傳回值并在下節繪制出來,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

6.Hinge損失函數主要用來評估支援向量機算法,但有時也用來評估神經網絡算法。在本例中是計算兩個目标類(-1,1)之間的損失。下面的代碼中,使用目标值1,是以預測值離1越近,損失函數值越小:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

7.兩類交叉熵損失函數(Cross-entropy loss)有時也作為邏輯損失函數。比如,當預測兩類目标0或者1時,希望度量預測值到真實分類值(0或者1)的距離,這個距離經常是0到1之間的實數。為了度量這個距離,我們可以使用資訊論中的交叉熵,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

8.Sigmoid交叉熵損失函數(Sigmoid cross entropy loss)與上一個損失函數非常類似,有一點不同的是,它先把x_vals值通過sigmoid函數轉換,再計算交叉熵損失,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

9.權重交叉熵損失函數(Weighted cross entropy loss)是Sigmoid交叉熵損失函數的權重,對正目标權重。舉個例子,我們将正目标權重權重0.5,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

10.Softmax交叉熵損失函數(Softmax cross-entropy loss)是作用于非歸一化的輸出結果,隻針對單個目标分類的計算損失。通過softmax函數将輸出結果轉化成機率分布,然後計算真值機率分布的損失,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

11.稀疏Softmax交叉熵損失函數(Sparse softmax cross-entropy loss)和上一個損失函數類似,它是把目标分類為true的轉化成index,而Softmax交叉熵損失函數将目标轉成機率分布。代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.5.3 工作原理

這裡用matplotlib繪制回歸算法的損失函數(見圖2-4):

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

下面是用matplotlib繪制各種分類算法損失函數(見圖2-5):

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章
帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.5.4 延伸學習

下面總結一下前面描述的各種損失函數:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

其他分類算法的損失函數都需要做交叉熵損失。Sigmoid交叉熵損失函數被用在非歸一化邏輯操作,先計算sigmoid,再計算交叉熵。TensorFlow有很好的内建方法來處理數值邊界問題。Softmax交叉熵和稀疏Softmax交叉熵都類似。

這裡大部分描述的分類算法損失函數是針對二類分類預測,不過也可以通過對每個預測值/目标的交叉熵求和,擴充成多類分類。

也有一些其他名額來評價機器學習模型,這裡給出一個清單。

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.6 TensorFlow實作反向傳播

使用TensorFlow的一個優勢是,它可以維護操作狀态和基于反向傳播自動地更新模型變量。本節将介紹如何使用這種優勢來訓練機器學習模型。

2.6.1 開始

現在開始介紹如何調節模型變量來最小化損失函數。前面已經學習了建立對象和操作,建立度量預測值和目标值之間內插補點的損失函數。這裡将講解TensorFlow是如何通過計算圖來實作最小化損失函數的誤差反向傳播進而更新變量的。這步将通過聲明優化函數(optimization function)來實作。一旦聲明好優化函數,TensorFlow将通過它在所有的計算圖中解決反向傳播的項。當我們傳入資料,最小化損失函數,TensorFlow會在計算圖中根據狀态相應的調節變量。

本節先舉個簡單的回歸算法的例子。從均值為1、标準差為0.1的正态分布中抽樣随機數,然後乘以變量A,目标值為10,損失函數為L2正則損失函數。理論上,A的最優值是10,因為生成的樣例資料均值是1。

第二個例子是一個簡單的二值分類算法。從兩個正态分布(N (-1, 1)和N (3, 1))生成100個數。所有從正态分布N (-1, 1)生成的資料标為目标類0;從正态分布N (3, 1)生成的資料标為目标類1,模型算法通過sigmoid函數将這些生成的資料轉換成目标類資料。換句話講,模型算法是sigmoid (x + A),其中,A是要拟合的變量,理論上A = - 1。假設,兩個正态分布的均值分别是m1和m2,則達到A的取值時,它們通過- (m1 + m2)/2轉換成到0等距的值。後面将會在TensorFlow中見證怎樣取到相應的值。

同時,指定一個合适的學習率對機器學習算法的收斂是有幫助的。優化器類型也需要指定,前面的兩個例子使用标準梯度下降法,由TensorFlow中的GradientDescentOptimizer()函數實作。

2.6.2 動手做

這裡是回歸算法例子:

1.導入Python的數值計算子產品,numpy和tensorf?low:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.建立計算圖會話:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

3.生成資料,建立占位符和變量A:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

4.增加乘法操作:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

5.增加L2正則損失函數:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

6.現在聲明變量的優化器。大部分優化器算法需要知道每步疊代的步長,這距離是由學習率控制的。如果學習率太小,機器學習算法可能耗時很長才能收斂;如果學習率太大,機器學習算法可能會跳過最優點。相應地導緻梯度消失和梯度爆炸問題。學習率對算法的收斂影響較大,我們會在本節結尾探讨。在本節中使用的是标準梯度下降算法,但實際情況應該因問題而異,不同的問題使用不同的優化器算法,具體見2.6.5節中Sebastian Ruder所寫的文章。

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

7.在運作之前,需要初始化變量:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

選取最優的學習率的理論很多,但真正解決機器學習算法的問題很難。2.6.5節列出了特定算法的學習率選取方法。

8.最後一步是訓練算法。我們疊代101次,并且每25次疊代列印傳回結果。選擇一個随機的x和y,傳入計算圖中。TensorFlow将自動地計算損失,調整A偏差來最小化損失:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

現在将介紹簡單的分類算法例子。如果先重置一下前面的TensorFlow計算圖,我們就可以使用相同的TensorFlow腳本繼續分類算法的例子。我們試圖找到一個優化的轉換方式A,它可以把兩個正态分布轉換到原點,sigmoid函數将正态分布分割成不同的兩類。

9.首先,重置計算圖,并且重新初始化變量:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

10.從正态分布(N (-1, 1),N (3, 1))生成資料。同時也生成目标标簽,占位符和偏差變量A:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

初始化變量A為10附近的值,遠離理論值-1。這樣可以清楚地顯示算法是如何從10收斂為-1的。

11.增加轉換操作。這裡不必封裝sigmoid函數,因為損失函數中會實作此功能:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

12.由于指定的損失函數期望批量資料增加一個批量數的次元,這裡使用expand_dims()函數增加次元。下節将讨論如何使用批量變量訓練,這次還是一次使用一個随機資料:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

13.初始化變量A:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

14.聲明損失函數,這裡使用一個帶非歸一化logits的交叉熵的損失函數,同時會用sigmoid函數轉換。TensorFlow的nn.sigmoid_cross_entropy_with_logits()函數實作所有這些功能,需要向它傳入指定的次元,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

15.如前面回歸算法的例子,增加一個優化器函數讓TensorFlow知道如何更新和偏差變量:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

16.最後,通過随機選擇的資料疊代幾百次,相應地更新變量A。每疊代200次列印出損失和變量A的傳回值:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章
帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.6.3 工作原理

作為概括,總結如下幾點:

1.生成資料,所有樣本均需要通過占位符進行加載。

2.初始化占位符和變量。這兩個算法中,由于使用相同的資料,是以占位符相似,同時均有一個乘法變量A,但第二個分類算法多了一個偏差變量。

3.建立損失函數,對于回歸問題使用L2損失函數,對于分類問題使用交叉熵損失

函數。

4.定義一個優化器算法,所有算法均使用梯度下降。

5.最後,通過随機資料樣本進行疊代,更新變量。

2.6.4 延伸學習

前面涉及的優化器算法對學習率的選擇較敏感。下面給出學習率選擇總結:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

有時,标準梯度下降算法會明顯示卡頓或者收斂變慢,特别是在梯度為0的附近的點。為了解決此問題,TensorFlow的MomentumOptimizer()函數增加了一項勢能,前一次疊代過程的梯度下降值的倒數。

另外一個可以改變的是優化器的步長,理想情況下,對于變化小的變量使用大步長;而變化迅速的變量使用小步長。這裡不會進行數學公式推導,但給出實作這種優點的常用算法:Adagrad算法。此算法考慮整個曆史疊代的變量梯度,TensorFlow中相應功能的實作是AdagradOptimizer()函數。

有時,由于Adagrad算法計算整個曆史疊代的梯度,導緻梯度迅速變為0。解決這個局限性的是Adadelta算法,它限制使用的疊代次數。TensorFlow中相應功能的實作是AdadeltaOptimizer()函數。

還有一些其他的優化器算法實作,請閱讀TensorFlow官方文檔:

https://www.

tensorflow.org/api_guides/python/train 。

2.6.5 參考

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章
帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.7 TensorFlow實作批量訓練和随機訓練

根據上面描述的反向傳播算法,TensorFlow更新模型變量。它能一次操作一個資料點,也可以一次操作大量資料。一個訓練例子上的操作可能導緻比較“古怪”的學習過程,但使用大批量的訓練會造成計算成本昂貴。到底選用哪種訓練類型對機器學習算法的收斂非常關鍵。

2.7.1 開始

為了TensorFlow計算變量梯度來讓反向傳播工作,我們必須度量一個或者多個樣本的損失。與前一節所做的相似,随機訓練會一次随機抽樣訓練資料和目标資料對完成訓練。另外一個可選項是,一次大批量訓練取平均損失來進行梯度計算,批量訓練大小可以一次上擴到整個資料集。這裡将顯示如何擴充前面的回歸算法的例子——使用随機訓練和批量訓練。

導入numpy、matplotlib和tensorf?low子產品,開始一個計算圖會話,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.7.2 動手做

1.開始聲明批量大小。批量大小是指通過計算圖一次傳入多少訓練資料:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.接下來,聲明模型的資料、占位符和變量。這裡能做的是改變占位符的形狀,占位符有兩個次元:第一個次元為None,第二個次元是批量訓練中的資料量。我們能顯式地設定次元為20,也能設為None。如第1章所述,我們必須知道訓練模型中的次元,這會阻止不合法的矩陣操作:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

3.現在在計算圖中增加矩陣乘法操作,切記矩陣乘法不滿足交換律,是以在matmul()函數中的矩陣參數順序要正确:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

4.改變損失函數,因為批量訓練時損失函數是每個資料點L2損失的平均值。在TensorFlow中通過reduce_mean()函數即可實作,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

5.聲明優化器以及初始化模型變量,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

6.在訓練中通過循環疊代優化模型算法。這部分代碼與之前不同,因為我們想繪制損失值圖與随機訓練對比,是以這裡初始化一個清單每間隔5次疊代儲存損失函數:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

7.疊代100次輸出最終傳回值。注意,A值現在是二維矩陣:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.7.3 工作原理

批量訓練和随機訓練的不同之處在于它們的優化器方法和收斂過程。找到一個合适的批量大小是挺難的。為了展現兩種訓練方式收斂過程的不同,批量損失的繪圖代碼見下文。這裡是存儲随機損失的代碼,接着上一節的代碼:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章
帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

繪制回歸算法的随機訓練損失和批量訓練損失(見圖2-6),代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.7.4 延伸學習

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.8 TensorFlow實作建立分類器

在本節中,将結合前面所有的知識點建立一個iris資料集的分類器。

2.8.1 開始

iris資料集詳細細節見第1章。加載樣本資料集,實作一個簡單的二值分類器來預測一朵花是否為山鸢尾。iris資料集有三類花,但這裡僅預測是否是山鸢尾。導入iris資料集和工具庫,相應的對原資料集進行轉換。

2.8.2 動手做

1.導入相應的工具庫,初始化計算圖。注意,這裡導入matplotlib子產品是為了後續繪制結果:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.導入iris資料集,根據目标資料是否為山鸢尾将其轉換成1或者0。由于iris資料集将山鸢尾标記為0,我們将其從0置為1,同時把其他物種标記為0。本次訓練隻使用兩種特征:花瓣長度和花瓣寬度,這兩個特征在x-value的第三列和第四列:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

3.聲明批量訓練大小、資料占位符和模型變量。注意,資料占位符的第一次元設為None:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

注意,通過指定dtype = tf.f?loat32降低f?loat的位元組數,可以提高算法的性能。

4.定義線性模型。線性模型的表達式為:x2 = x1A + b。如果找到的資料點在直線以上,則将資料點代入x2 - x1A - b計算出的結果大于0;同理找到的資料點在直線以下,則将資料點代入x2 - x1A - b計算出的結果小于0。将公式x2 - x1A - b傳入sigmoid函數,然後預測結果1或者0。TensorFlow有内建的sigmoid損失函數,是以這裡僅僅需要定義模型輸出即可,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

5.增加TensorFlow的sigmoid交叉熵損失函數sigmoid_cross_entropy_with_logits(),代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

6.聲明優化器方法,最小化交叉熵損失。選擇學習率為0.05,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

7.建立一個變量初始化操作,然後讓TensorFlow執行它,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

8.現在疊代100次訓練線性模型。傳入三種資料:花瓣長度、花瓣寬度和目标變量。每200次疊代列印出變量值,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

9.下面的指令抽取模型變量并繪圖,結果圖在下一小節展示,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.8.3 工作原理

我們的目的是利用花瓣長度和花瓣寬度的特征在山鸢尾與其他物種間拟合一條直線。繪制所有的資料點和拟合結果,将會看到圖2-7。

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.8.4 延伸學習

目前用一條直線分割兩類目标并不是最好的模型。第4章将會介紹一種更好的方法來分割兩類目标。

2.8.5 參考

關于iris資料集的介紹,可以看維基百科:

https://en.wikipedia.org/wiki/Iris_flower_data_set

。或者Scikit Learn的iris資料集:

http://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html

2.9 TensorFlow實作模型評估

學完如何使用TensorFlow訓練回歸算法和分類算法,我們需要評估模型預測值來評估訓練的好壞。

2.9.1 開始

模型評估是非常重要的,每個模型都有很多模型評估方式。使用TensorFlow時,需要把模型評估加入到計算圖中,然後在模型訓練完後調用模型評估。

在訓練模型過程中,模型評估能洞察模型算法,給出提示資訊來調試、提高或者改變整個模型。但是在模型訓練中并不是總需要模型評估,我們将展示如何在回歸算法和分類算法中使用它。

訓練模型之後,需要定量評估模型的性能如何。在理想情況下,評估模型需要一個訓練資料集和測試資料集,有時甚至需要一個驗證資料集。

想評估一個模型時就得使用大批量資料點。如果完成批量訓練,我們可以重用模型來預測批量資料點。但是如果要完成随機訓練,就不得不建立單獨的評估器來處理批量資料點。

如果在損失函數中使用的模型輸出結果經過轉換操作,例如,sigmoid_cross_entropy_with_logits()函數,為了精确計算預測結果,别忘了在模型評估中也要進行轉換操作。

另外一個重要方面是在評估前注意是回歸模型還是分類模型。

回歸算法模型用來預測連續數值型,其目标不是分類值而是數字。為了評估這些回歸預測值是否與實際目标相符,我們需要度量兩者間的距離。這裡将重寫本章上一小節的回歸算法的例子,列印訓練過程中的損失,最終評估模型損失。

分類算法模型基于數值型輸入預測分類值,實際目标是1和0的序列。我們需要度量預測值與真實值之間的距離。分類算法模型的損失函數一般不容易解釋模型好壞,是以通常情況是看下準确預測分類的結果的百分比。這次将使用本章上一小節的分類算法的例子。

2.9.2 動手做

首先,将展示如何評估簡單的回歸算法模型,其拟合常數乘法,目标值是10,步驟如下:

1.加載所需的程式設計庫,建立計算圖、資料集、變量和占位符。建立完資料後,将它們随機分割成訓練資料集和測試資料集。不管算法模型預測的如何,我們都需要測試算法模型,這點相當重要。在訓練資料和測試資料上都進行模型評估,以搞清楚模型是否過拟合:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.聲明算法模型、損失函數和優化器算法。初始化模型變量A,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

3.像以往一樣疊代訓練模型,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

4.現在,為了評估訓練模型,将列印訓練資料集和測試資料集訓練的MSE損失函數值,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

對于分類模型的例子,與前面的例子類似。建立準确率函數(accuracy function),分别調用sigmoid來測試分類是否正确。

5.重新加載計算圖,建立資料集、變量和占位符。記住,分割資料集和目标成為訓練集和測試集,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章
帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

6.在計算圖中,增加模型和損失函數,初始化變量,并建立優化器,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

7.現在進行疊代訓練,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

8.為了評估訓練模型,我們建立預測操作。用squeeze()函數封裝預測操作,使得預測值和目标值有相同的次元。然後用equal()函數檢測是否相等,把得到的true或false的boolean型張量轉化成f?loat32型,再對其取平均值,得到一個準确度值。我們将用這個函數評估訓練模型和測試模型,代碼如下:

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章
帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

9.模型訓練結果,比如準确度、MSE等,将幫助我們評估機器學習模型。因為這是一維模型,能很容易地繪制模型和資料點。用matplotlib繪制兩個分開的直方圖來可視化機器學習模型和資料點(見圖2-8):

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章

2.9.3 工作原理

圖中的結果标明了兩類直方圖的最佳分割。

帶你讀《TensorFlow機器學習實戰指南(原書第2版)》之二:TensorFlow進階第2章