本章包括:
- 神經網絡的核心組件
- 對Keras的介紹
- 設置深度學習工作站
- 使用神經網絡解決基本分類和回歸問題
一、神經網絡的剖析
??訓練神經網絡圍繞以下對象:
- 圖層,組合成網絡(或模型)。層是數據處理模塊,其將一個或多個張量作為輸入并且輸出一個或多個張量。存儲在形狀(樣本,特征)的2D張量中的簡單矢量數據通常由密集連接的層處理,也稱為完全連接或密集層(Keras中的密集類)。存儲在形狀(樣本,時間步長,特征)的3D張量中的序列數據通常由諸如LSTM層的循環層處理。 存儲在4D張量中的圖像數據通常由2D卷積層(Conv2D)處理。
- 輸入數據和相應的目標 常見的網絡拓撲結構:Two-branch、networks、 Multihead networks、 Inception blocks。通過選擇網絡拓撲,可以將可能性空間(假設空間)約束到一系列特定的張量,將輸入數據映射到輸出數據。 接下來將要搜索的是這些張量操作中涉及的權重張量的一組很好的值。
- 損失函數,定義用于學習的反饋信號。使其最小化。
-
優化器,決定學習的進度。
二、 Keras
??目前,三個現有的后端實現是TensorFlow后端,Theano后端和Microsoft Cognitive Toolkit(CNTK)后端。使用Keras編寫的任何代碼都可以使用任何這些后端運行,而無需更改代碼中的任何內容。
??定義模型有兩種方法:使用Sequential類(僅用于線性堆棧的層,這是迄今為止最常見的網絡架構)或功能API(用于層的有向非循環圖,它允許您構建完全任意的體系結構)。
三、建立深度學習工作站—NVIDIA GPU。
四、電影評論分類:二分分類示例
查看GitHub源碼
??學習根據評論的文本內容將電影評論分類為正面或負面。
??使用IMDB數據集:來自Internet電影數據庫的一組50,000個高度極化的評論。 他們分為25,000條培訓評論和25,000條測試評論,每組評估50%為負,50%為正面評價。
1. IMDB數據集
??1)Loading the IMDB dataset
2、準備數據
??1)Encoding the integer sequences into a binary matrix
??因為無法將整數列表提供給神經網絡,將列表轉換為張量的兩種方法:
- 填充列表,使它們都具有相同的長度,將它們轉換為整數張形狀(samples,word_indices),然后將網絡中的第一層用作處理此類整數張量的層(嵌入層);
- 對您的列表進行One-hot encode,將其轉換為0和1的向量。這里使用的是這個。將整數序列編碼為二進制矩陣。
3、構建網絡
??輸入數據是向量,標簽是標量(1和0):這是將遇到的最簡單的設置。Dense(16,activation=‘relu’),傳遞給每個Dense層(16)的參數是該層的隱藏單元的數量。 隱藏單元是圖層的表示空間中的維度。
??關于這樣一堆Dense圖層,有兩個關鍵的架構決策:1)要使用多少層;2)每層選擇多少個隱藏單位;這里使用了兩個中間層,每個層有16個隱藏單元,第三層將輸出關于當前評論情緒的標量預測。中間層將使用relu作為其激活功能,最后一層將使用sigmoid激活以輸出可執行性(得分在0和1之間,越靠近1越積極)
??1) The model definition
??2) Compiling the model
??3) Configuring the optimizer
??4) Using custom losses and metrics
4、驗證方法
??1)Setting aside a validation set
??2)Training your model
??3)Plotting the training and validation loss
??4)Plotting the training and validation accuracy
??5)Retraining a model from scratch
5、使用經過訓練的網絡生成對新數據的預測
6、進一步實驗
7、總結
- 通常需要對原始數據進行相當多的預處理,以便能夠將其作為張量傳送到神經網絡中。單詞序列可以編碼為二進制向量,但也有其他編碼選項。
- 具有relu激活的密集層堆棧可以解決各種問題(包括情感分類),可能經常使用。
- 在二分分類問題(兩個輸出類)中,網絡應該以一個單元和一個sigmoid激活的Dense層結束:網絡的輸出應該是0到1之間的標量,編碼概率。
- 在二分分類問題上使用這樣的標量sigmoid輸出,應該使用的損失函數是binary_crossentropy。
- 無論遇到什么問題,rmsprop優化器通常都是一個不錯的選擇。
- 隨著模型的訓練數據越來越好,神經網絡最終開始過度擬合,并最終獲得越來越糟糕的數據,這些數據是模型以前從未見過的。
-
務必始終監控訓練集之外的數據的性能。
運行結果:
五、新聞專線分類:多類分類示例
查看GitHub源碼
這是一個single-label, multiclass classification的例子
1、 Reuters數據集
??Reuters數據集是一個簡單,廣泛使用的文本分類數據集。 有46個不同的主題; 某些主題比其他主題更具代表性,但每個主題在訓練集中至少有10個示例。
??1) Loading the Reuters dataset
??2) Decoding newswires back to text
2、 準備數據
??1) Encoding the data
??要對標簽進行矢量化,有兩種方法:可以將標簽列表轉換為整數張量,也可以使用one-hot encoding(也叫做分類編碼,經常使用)。除此外,在Keras中有一種內置的方法。(from keras.utils.np_utils import to_categorical)
3、 構建網絡
??1) Model definition
??2) Compiling the model
4、 驗證方法
??1) Setting aside a validation set
??2) Training the model
??3) Plotting the training and validation loss
??4) Plotting the training and validation accuracy
??5) Retraining a model from scratch
5、 生成對新數據的預測
??1) Generating predictions for new data
6、 處理標簽和損失的不同方式
??處理標簽和損失的不同方式,我們之前提到過,編碼標簽的另一種方法是將它們轉換為整數張量,這種方法唯一會改變的是損失函數的選擇,從頭開始重新訓練模型中使用的損失函數是ategorical_crossentropy,期望標簽遵循分類編碼。但是對于整數標簽,應該使用sparse_categorical_crossentropy。
7、 具有足夠大的中間層的重要性
??1) 一個具有信息瓶頸的模型的例子,以4維為例
8、 進一步實驗
??1)嘗試使用更大或更小的層:32個單位,128個單位,依此類推。
??2)嘗試使用單個隱藏層或三個隱藏層。
9、總結
- 如果嘗試在N個類別中對數據點進行分類,則網絡應以大小為N的Dense層結束。
- 在單標簽,多類別分類問題中,網絡應以softmax激活結束,以便在N個輸出類別上輸出概率分布。
- Categorical crossentropy幾乎總是我們應該用于此類問題的損失函數。它最小化了網絡輸出的概率分布與目標的真實分布之間的距離。
- 在多類分類中有兩種處理標簽的方法:a) 通過分類編碼(也稱為單熱編碼)對標簽進行編碼,并使用categorical_crossentropy作為丟失函數; b) 將標簽編碼為整數并使用arse_categorical_crossentropy損失函數。
-
如果需要將數據分類為大量類別,則應避免由于中間層太小而在網絡中造成信息瓶頸。
運行結果:
顯示loss 和 accuracy 曲線:
顯示準確度和與random baseline的對比:
六、預測房價:一個回歸的例子
查看GitHub源碼
??前兩個示例被認為是分類問題,其目標是預測輸入數據點的單個離散標簽。 另一種常見類型的機器學習問題是回歸,它包括預測連續值而不是離散標簽。
??注意:不要混淆回歸和算法邏輯回歸。 邏輯回歸不是回歸算法 - 它是一種分類算法。
1、 波士頓住房價格數據集–Loading the Boston housing dataset
??本次采用的數據集具有相對較少的數據:僅506,在404個訓練樣本和102個測試樣本之間分配。 輸入數據中的每個功能(例如,犯罪率)都有不同的比例。目標是自住房屋的中位數,價值數千美元
2、 準備數據—Normalizing the data
??將神經網絡輸入所有采用不同范圍的值都是有問題的,處理此類數據的一種廣泛的最佳實踐是進行特征標準化:對于輸入數據中的每個特征(輸入數據矩陣中的一列),減去feature的平均值并除以標準偏差,以便該要素以0為中心并具有單位標準差。 這很容易在Numpy中完成。
??注意,使用訓練數據計算用于歸一化測試數據的量。 不應該在工作流程中使用在測試數據上計算的任何數量,即使對于像數據規范化這樣簡單的事情也是如此。
3、 構建網絡—Model definition
??擁有的訓練數據越少,過度擬合就越差,使用小型網絡是緩解過度擬合的一種方法。
??網絡以單個單元結束而不激活(它將是線性層)。 這是標量回歸的典型設置(嘗試預測單個連續值的回歸)。應用激活函數會限制輸出可以采用的范圍, 例如,如果將sigmoid激活函數應用于最后一層,網絡只能學習預測0到1之間的值。這里,因為最后一層是純線性的,所以網絡可以自由地學習預測任何范圍內的值。
??對于回歸問題,廣泛使用的損失函數:mse loss函數 - 均方誤差編譯網絡,即預測和目標之間差異的平方。
??在訓練期間監控新指標:平均絕對誤差(MAE)。 它是預測和目標之間差異的絕對值。 例如,此問題的MAE為0.5意味著您的預測平均減少500美元。
4、 使用K-fold驗證來驗證我們的方法
??1) K-fold validation
??它包括將可用數據拆分為K個分區(通常為K = 4或5),實例化K個相同模型,并在評估剩余分區時對K-1分區進行訓練。所用模型的驗證分數是獲得的K驗證分數的平均值。
??2) Saving the validation logs at each fold
??3) Building the history of successive mean K-fold validation scores
??4) Plotting validation scores
??5) Plotting validation scores, excluding the first 10 data points
??6) Training the final model
5、總結
- 使用與我們用于分類的不同的損失函數進行回歸。 均方誤差(MSE)是通常用于回歸的損失函數。
- 用于回歸的評估指標與用于分類的評估指標不同; 自然地,準確性的概念不適用于回歸。 常見的回歸度量是平均絕對誤差(MAE)。
- 當輸入數據中的要素具有不同范圍的值時,應將每個要素作為預處理步驟單獨進行縮放。
- 當數據很少時,使用K-fold驗證是可靠評估模型的好方法。
- 當可用的訓練數據很少時,最好使用一個隱藏層較少的小型網絡(通常只有一個或兩個),以避免嚴重的過度擬合。
??運行結果:
??K-fold validation:
??繪制驗證分數:
??繪制排除前10個數據點的驗證分數 :
??訓練最終模型,結果:
??我們仍然偏離約$ 2,678
本章總結
- 目前為止,可以處理矢量數據中最常見的機器學習任務:二分分類,多類分類和標量回歸。
- 通常需要在將原始數據輸入神經網絡之前對其進行預處理。
- 當數據具有不同范圍的要素時,要在預處理過程中單獨縮放每個要素。
- 隨著訓練的進行,神經網絡最終開始過度擬合并在前所未見的數據上獲得更差的結果。
- 如果沒有太多的訓練數據,使用只有一個或兩個隱藏層的小型網絡,避免嚴重過度擬合。
- 如果數據分為多個類別,如果使中間層太小,可能會導致信息瓶頸。
- 回歸使用不同的損失函數和不同的評估指標而不是分類。
- 當處理少量數據時,K-fold驗證可以可靠地評估模型。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
