1. 程式人生 > >【火爐煉AI】深度學習002-構建並訓練單層神經網路模型

【火爐煉AI】深度學習002-構建並訓練單層神經網路模型

【火爐煉AI】深度學習002-構建並訓練單層神經網路模型

(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

前面我們介紹了神經網路的基本結構單元-感知器,現在我們再升一級,看看神經網路的基本結構和訓練方法。


1. 單層神經網路

單層神經網路由一個層次中的多個神經元組成,總體來看,單層神經網路的結構是:一個輸入層,一個隱含層,一個輸出層。如下為結構示意圖。

圖中描述的是前向網路,但其反向傳播網路的結構也是一樣的。藍色方框表示輸入層,綠色圓圈表示隱含層,輸出層沒有繪製出來。圖片來源於

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著,陶俊傑,陳小莉譯