【火炉炼AI】深度学习003-构建并训练深度神经网络模型
【火爐煉AI】深度學(xué)習(xí)003-構(gòu)建并訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)模型
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
前面我們講解過單層神經(jīng)網(wǎng)絡(luò)模型,發(fā)現(xiàn)它結(jié)構(gòu)簡單,難以解決一些實際的比較復(fù)雜的問題,故而現(xiàn)在發(fā)展出了深度神經(jīng)網(wǎng)絡(luò)模型。
深度神經(jīng)網(wǎng)絡(luò)的深度主要表現(xiàn)在隱含層的層數(shù)上,前面的單層神經(jīng)網(wǎng)絡(luò)只有一個隱含層,而深度神經(jīng)網(wǎng)絡(luò)使用>=2個隱含層。其基本結(jié)構(gòu)為:
圖中有兩個隱含層,分別是醬色的圓圈(有4個神經(jīng)元)和綠色的圓圈(有2個神經(jīng)元),所以這個深度神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)就是3-4-2結(jié)構(gòu)。圖片來源于2017/7/20 朱興全教授學(xué)術(shù)講座觀點與總結(jié)第二講:單個神經(jīng)元/單層神經(jīng)網(wǎng)絡(luò)。
對于一些很復(fù)雜的深度神經(jīng)網(wǎng)絡(luò),隱含層的個數(shù)可能有幾百上千個,比如ResNet網(wǎng)絡(luò)結(jié)構(gòu)的等,其訓(xùn)練過程也更復(fù)雜,耗時更長。那么這些模型就非常地“深”了。
使用更深層的神經(jīng)網(wǎng)絡(luò),可以得到更好的表達效果,這可以直觀地理解為:在每一個網(wǎng)絡(luò)層中,輸入特征的特點被一步步的抽象出來;下一層網(wǎng)絡(luò)直接使用上一層抽象的特征進行進一步的線性組合或非線性組合,從而一步一步地得到輸出。
1. 構(gòu)建并訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)模型
1.1 準備數(shù)據(jù)集
本次使用自己生成的一些數(shù)據(jù),如下生成代碼:
# 準備數(shù)據(jù)集 # 此處自己生成一些原始的數(shù)據(jù)點 dataset_X=np.linspace(-10,10,100) dataset_y=2*np.square(dataset_X)+7 # 即label是feature的平方*2,偏置是7 dataset_y /=np.linalg.norm(dataset_y) # 歸一化處理 dataset_X=dataset_X[:,np.newaxis] 復(fù)制代碼該數(shù)據(jù)集的數(shù)據(jù)分布為:
1.2 構(gòu)建并訓(xùn)練模型
直接上代碼:
# 構(gòu)建并訓(xùn)練模型 import neurolab as nl x_min, x_max = dataset_X[:,0].min(), dataset_X[:,0].max() multilayer_net = nl.net.newff([[x_min, x_max]], [10, 10, 1]) # 模型結(jié)構(gòu):隱含層有兩層,每層有10個神經(jīng)元,輸出層一層。 multilayer_net.trainf = nl.train.train_gd # 設(shè)置訓(xùn)練算法為梯度下降 dataset_y=dataset_y[:,np.newaxis] error = multilayer_net.train(dataset_X, dataset_y, epochs=800, show=100, goal=0.01) 復(fù)制代碼-------------------------------------輸---------出--------------------------------
Epoch: 100; Error: 2.933891201182385; Epoch: 200; Error: 0.032819979078409965; Epoch: 300; Error: 0.040183833367277225; The goal of learning is reached
--------------------------------------------完-------------------------------------
看來,雖然我們設(shè)置要800個循環(huán),但是到達目標0.01時,便自動退出??梢援媹D看一下error的走勢
1.3 用訓(xùn)練好的模型來預(yù)測新數(shù)據(jù)
此處我們沒有新數(shù)據(jù),假設(shè)原始的dataset_X是新數(shù)據(jù),那么可以預(yù)測出這些新數(shù)據(jù)的結(jié)果,并比較一下真實值和預(yù)測值之間的差異,可以比較直觀的看出模型的預(yù)測效果
# 用訓(xùn)練好的模型來預(yù)測 predict_y=multilayer_net.sim(dataset_X) plt.scatter(dataset_X,dataset_y,label='dataset') plt.scatter(dataset_X,predict_y,label='predicted') plt.legend() plt.title('Comparison of Truth and Predicted') 復(fù)制代碼可以看出模型的預(yù)測值和真實值大致相同,至少表明模型在訓(xùn)練集上表現(xiàn)比較好。
關(guān)于深度神經(jīng)網(wǎng)絡(luò)的更具體內(nèi)容,可以參考博文 神經(jīng)網(wǎng)絡(luò)淺講:從神經(jīng)元到深度學(xué)習(xí).
其實,要解決復(fù)雜的問題,不一定要增加模型的深度(即增加隱含層數(shù),但每一層的神經(jīng)元個數(shù)比較少,即模型結(jié)構(gòu)是深而瘦的),還可以增加模型的寬度(即一個或少數(shù)幾個隱含層,但是增加隱含層的神經(jīng)元個數(shù),即模型結(jié)構(gòu)是淺而肥的),那么哪一種比較好?
在文章干貨|神經(jīng)網(wǎng)絡(luò)最容易被忽視的基礎(chǔ)知識一中提到:雖然有研究表明,淺而肥的網(wǎng)絡(luò)結(jié)構(gòu)也能擬合任何函數(shù),但它需要非常的“肥胖”,可能一個隱含層需要成千上萬個神經(jīng)元,這樣會導(dǎo)致模型中參數(shù)的數(shù)量極大地增加。如下比較圖:
從上圖可以看出:當準確率差不多的時候,參數(shù)的數(shù)量卻相差數(shù)倍。這也說明我們一般用深層的神經(jīng)網(wǎng)絡(luò)而不是淺層“肥胖”的網(wǎng)絡(luò)。
########################小**********結(jié)###############################
1,深度神經(jīng)網(wǎng)絡(luò)的構(gòu)建和訓(xùn)練已經(jīng)有成熟的框架來實現(xiàn),比如Keras,Tensorflow,PyTorch等,用起來更加的簡單,此處僅僅用來解釋內(nèi)部結(jié)構(gòu)和進行簡單的建模訓(xùn)練。
2,為了解決更加復(fù)雜的問題,一般我們選用深而瘦的模型結(jié)構(gòu),不選用淺而肥的模型,因為這種模型的參數(shù)數(shù)量非常大,訓(xùn)練耗時長。
#################################################################
注:本部分代碼已經(jīng)全部上傳到(我的github)上,歡迎下載。
參考資料:
1, Python機器學(xué)習(xí)經(jīng)典實例,Prateek Joshi著,陶俊杰,陳小莉譯
總結(jié)
以上是生活随笔為你收集整理的【火炉炼AI】深度学习003-构建并训练深度神经网络模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: controller 有两种写法,讨论一
- 下一篇: Yoshua Bengio首次中国演讲: