【火爐煉AI】深度學習002-構建並訓練單層神經網路模型
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
前面我們介紹了神經網路的基本結構單元-感知器,現在我們再升一級,看看神經網路的基本結構和訓練方法。
1. 單層神經網路
單層神經網路由一個層次中的多個神經元組成,總體來看,單層神經網路的結構是:一個輸入層,一個隱含層,一個輸出層。如下為結構示意圖。

圖中描述的是前向網路,但其反向傳播網路的結構也是一樣的。藍色方框表示輸入層,綠色圓圈表示隱含層,輸出層沒有繪製出來。圖片來源於 ofollow,noindex">2017/7/20 朱興全教授學術講座觀點與總結第二講:單個神經元/單層神經網路 。
也可以從下圖中看出單層神經網路的基本結構:

那麼從程式碼上怎麼建立單層神經網路,並對其進行訓練呢?
1.1 載入資料集
首先我們載入資料集,該資料集很簡單,包含16行,四列,前兩列是double型資料,構成了特徵列,後兩列是整數(0或1),構成了標籤列。載入方式很簡單,前面講過多次,此處只把該資料集中特徵列的分佈情況繪製出來。如下

1.2 建立模型並訓練
資料集準備完成後, 就需要構建單層神經網路模型,並對其進行訓練。
# 構建單層NN模型,該模型的隱含層含有兩個感知器 import neurolab as nl x_min, x_max = dataset_X[:,0].min(), dataset_X[:,0].max() y_min, y_max = dataset_X[:,1].min(), dataset_X[:,1].max() single_layer_net = nl.net.newp([[x_min, x_max], [y_min, y_max]], 2) # 隱含層含有兩個神經元 # 所以本單層NN模型含有兩個輸入神經元,兩個隱含層神經元,兩個輸出神經元 cost = single_layer_net.train(dataset_X, dataset_y, epochs=50, show=2, lr=0.01) # 訓練該單層NN模型,50個回合,每2個回合顯示一下訓練結果,學習速率為0.01 複製程式碼
-------------------------------------輸---------出--------------------------------
Epoch: 2; Error: 7.5; Epoch: 4; Error: 7.0; Epoch: 6; Error: 4.0; Epoch: 8; Error: 4.0; Epoch: 10; Error: 4.0; Epoch: 12; Error: 4.0; Epoch: 14; Error: 4.0; Epoch: 16; Error: 4.0; Epoch: 18; Error: 4.0; Epoch: 20; Error: 4.0; Epoch: 22; Error: 4.0; Epoch: 24; Error: 4.0; Epoch: 26; Error: 4.0; Epoch: 28; Error: 4.0; Epoch: 30; Error: 4.0; Epoch: 32; Error: 4.0; Epoch: 34; Error: 4.0; Epoch: 36; Error: 4.0; Epoch: 38; Error: 4.0; Epoch: 40; Error: 4.0; Epoch: 42; Error: 4.0; Epoch: 44; Error: 4.0; Epoch: 46; Error: 4.0; Epoch: 48; Error: 4.0; Epoch: 50; Error: 4.0; The maximum number of train epochs is reached
--------------------------------------------完-------------------------------------
可以看出在第6個回合時,cost就達到最低,並不再變化,表示已經收斂,再提高訓練回合數也用處不大。將Error變化圖繪製出來可以得到:

1.3 使用訓練好的模型來預測新樣本
訓練後的模型肯定是要用它來預測新樣本,期望它能對從來沒有見過的新樣本也能得到理想的結果。
預測的程式碼為:
# 用訓練好的模型來預測新樣本 new_samples=np.array([[0.3, 4.5], [4.5, 0.5], [4.3, 8]]) print(single_layer_net.sim(new_samples)) 複製程式碼
-------------------------------------輸---------出--------------------------------
[[0. 0.] [1. 0.] [1. 1.]]
--------------------------------------------完-------------------------------------
單單從結果上來看,我們成功的構建了單層NN模型並對其進行訓練,通過訓練後的模型來成功預測了新樣本,一般的,一個深度學習模型流程就是這樣的。
單層神經網路模型雖然結構簡單,訓練很快,比較適合一些簡單問題,對於複雜一些的問題,這個模型就會力不從心,並且,有時我們的優化方法並不一定能夠找到所希望的優化引數,也找不到所需要的擬合函式,由於模型比較簡單,難以學習到複雜的內在機理,很容易產生欠擬合。
########################小**********結###############################
1,單層神經網路模型結構簡單,訓練耗時短,能夠解決的問題也相對比較簡單,對於比較複雜的問題會出現欠擬合,故而應用上受到一定限制,目前直接使用單層神經網路模型的情況非常少。
#################################################################
注:本部分程式碼已經全部上傳到( 我的github )上,歡迎下載。
參考資料:
1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯