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