首頁?學習  »   正文

TensorFlow 2.0實戰入門(下)

在昨天的文章中,我們介紹了TensorFlow 2.0的初學者教程中實現一個基本神經網絡的知識,今天我們繼續昨天沒有聊完的話題。開始學習吧~

傳送門:TensorFlow 2.0實戰入門(下)

激活功能

與神經網絡的布局和結構一樣重要的是,最好記住,在一天結束時,神經網絡所做的是大量的數學運算。每個節點接受上一層中節點的值,并計算它們的加權和,生成一個標量值,稱為logit。就像人腦中的神經元在特定輸入的提示下如何“觸發”一樣,我們必須指定網絡中的每個節點(有時也稱為神經元)在給定特定輸入時如何“觸發”。這就是激活函數的作用。它們取上述加權和的結果logits,并根據所使用的函數將其轉換為“激活”。

一個常見的激活函數,在我們的網絡中的第一個Dense()層中使用的,叫做“ReLU”,它是校正線性單元的縮寫。

TensorFlow 2.0實戰入門(下)

ReLU激活函數

ReLU所做的是激活任何負logits 0(節點不觸發),而保持任何正logits不變(節點以與輸入強度成線性比例的強度觸發)。有關ReLU的功能以及為什么它有用的更多信息,請參閱本文。

另一個常用的激活函數Dense()的第二個實例中使用稱為“softmax”。

TensorFlow 2.0實戰入門(下)

在SoftMax上的Udacity深度學習

如上圖所示,softmax采用由上一層激活的加權和計算的logits,并將其轉換為總和為1.0的概率。這使得在輸出層中使用它成為一個非常有用的激活函數,因為它為圖像成為特定數字的可能性提供了易于解釋的結果。

還有許多其他的激活函數,決定使用哪一個通常是一個實驗或啟發式判斷(或兩者兼而有之)的問題。

Dropout

到目前為止,我們研究的最后一個未解釋的代碼片段是tf.keras.layers.Dropout()的調用。dropout的概念可以追溯到早期關于層之間連接性的討論,并且必須特別處理與密集連接層相關的一些缺點。密集連接層的一個缺點是,它可能導致非常昂貴的計算神經網絡。隨著每一個節點向下一層的每一個節點傳輸信息,計算每一個節點加權和的復雜度隨著每一層節點數量的增加呈指數增長。另一個缺點是,隨著如此多的信息從一層傳遞到另一層,模型可能有過度適應訓練數據的傾向,最終損害性能。

這就是Dropout存在的原因。Dropout使得給定層中的一些節點不會將它們的信息傳遞到下一層。這有助于計算時間和過擬合。因此,在初學者的記事本中,在兩個colse()層之間調用Dropout(0.2)使得第一個colse ()層中的每個節點從計算下一層的激活中被刪除的概率為0.2。您可能已經了解到,這實際上使模型中的輸出層成為一個稀疏連接的層。

TensorFlow 2.0實戰入門(下)

現在我們已經了解了模型的所有組件,讓我們利用model.summary()函數對網絡結構進行全面檢查。

TensorFlow 2.0實戰入門(下)

在仔細檢查了輸出形狀之后,一切看起來都很好,所以現在讓我們繼續編譯、培訓和運行模型!

編譯、訓練和運行神經網絡

既然我們已經指定了神經網絡的樣子,下一步就是告訴Tensorflow如何訓練它。

編譯模型

我們在本節中研究的代碼片段如下:

model.compile(optimizer='adam',

loss='sparse_categorical_crossentropy',

metrics=['accuracy'])

在預構建的模型上調用model.compile()函數,它指定了損失函數、優化器和度量,每一個都將被解釋。這些是神經網絡如何產生最終預測的重要特征。

損失函數

在本指南的開頭提到,在高層次上,初學者筆記本中構建的模型將學習如何將某些圖像分類為數字,它通過做出預測來做到這一點,觀察預測與正確答案之間的距離,然后更新自身以更好地預測這些數字。損失函數是模型的一部分,用于量化預測與正確答案之間的距離。不同的模型需要不同的損失函數。例如,對于這樣一個問題的損失函數,我們的模型的輸出是概率,它必須與試圖預測美元價格的模型的損失函數非常不同。這個特定模型的損失函數是’ sparse_categorical_crossentropy ‘,這對于這類多類分類問題非常有用。。在我們的例子中,如果模型預測一個圖像只有很小的概率成為它的實際標簽,這將導致很高的損失。

優化器

另一種表達訓練模型實際意義的方法是,它尋求最小化損失。如果損失是對預測與正確答案之間的距離的測量,而損失越大意味著預測越不正確,則尋求最小化損失是確定模型性能的一種可量化方法。如前所述,訓練神經網絡的一個關鍵部分是根據這些參數對圖像分類的有效性來修改網絡節點的數學參數。在一個稱為反向傳播的過程中,神經網絡使用一個稱為梯度下降的數學工具來更新參數來改進模型。這些術語的詳細信息有些超出了本指南的范圍,但是為了理解初學者的記事本在做什么,model.compile()函數的優化器參數指定了一種使反向傳播過程更快、更有效的方法。“adam”優化器是一種常用的優化器,可以很好地解決這個問題。

度量標準

最后的部分是在model.compile()函數指定它在評估模型時應該使用的度量標準。。精度是一個有用的,但不完美的度量模型,為gauging模型性能和它的使用,它應該由一個小的量的警告。

Training the model

最后是對模型的實際訓練,使用TensorFlow2.0,這很容易做到。

model.fit(x_train, y_train, epochs=5)

這一行代碼非常直觀,可以傳遞訓練數據和數據的正確標簽。fit()函數中的epoch參數是模型查看所有訓練數據的次數。我們希望模型多次看到所有訓練數據的原因是,在計算加權和以顯著提高預測能力時,一次經歷可能不足以使模型充分更新其權重。

TensorFlow 2.0實戰入門(下)

運行這段代碼,您可以看到在每個時段,模型都會瀏覽訓練集中的所有60K圖像。您還可以看到損失隨著每個時段的增加而減少,精度也隨之提高,這意味著模型在對每個時段的數字進行分類方面越來越出色。

評估模型

最后,使用model.evaluate(x_測試,y_測試),我們可以預測測試集的類,并查看模型的運行情況。

TensorFlow 2.0實戰入門(下)

這張圖顯示,盡管我們訓練的時間越長,訓練的準確性就越高,但驗證的準確性開始趨于平穩或下降,這表明我們可能不需要訓練超過5個階段。

TensorFlow 2.0實戰入門(下)

為了更詳細地評估模型的執行情況,我們可以構建一個混淆矩陣。從這個混淆矩陣中我們可以看出,我們的模型中9的問題最多,而且往往與7、4或3混淆。

結論

恭喜你!您已經通過了TensorFlow2.0初學者筆記本的指南,現在對神經網絡層的形狀、激活函數、logits、dropout、優化器、丟失函數和丟失以及epochs有了更好的理解。您還熟悉了如何使用TensorFlow/Keras實現這些概念!對于更多的實踐,我建議使用本指南中討論的不同參數進行試驗,看看它們對模型性能有什么影響。快去感受創造的快樂吧!

 

歡迎關注ATYUN官方公眾號,商務合作及內容投稿請聯系郵箱:[email protected]

發表評論