PyMC3和Lasagne构建神经网络(ANN)和卷积神经网络(CNN)
轉自http://www.sohu.com/a/162460147_505915
源地址https://twiecki.io/blog/2016/07/05/bayesian-deep-learning/
今天,我們將使用Lasagne構建一個更有趣的模型,這是一個靈活的Theano圖書館,用于構建各種類型的神經網絡。你可能知道,PyMC3還使用了Theano,因此在Lasagne中建立了人工神經網絡(ANN),將貝葉斯先驗放在參數上,然后在PyMC3中使用變分推理(ADVI)來估計模型。
由于Lasagne的優秀表現,我們可以輕松地建立一個具有最大匯集層的分層貝葉斯卷積ANN,在MNIST上實現98%的準確性。
數據集:MNIST
我們將使用手寫數字的經典MNIST數據集。 與之前的博客文章相反,MNIST是具有合理數量的維度和數據點的有實際挑戰性的ML任務(當然不如像ImageNet那樣有挑戰性)。
Loading data...
模型說明
我想像應該可以把Lasagne和PyMC3搭在一起,因為他們都依賴于Theano。 然而,目前還不清楚它將會是多么困難。 幸運的是,第一個實驗做得很好,但有一些潛在的方法可以使這更容易。 我開設了一個GitHub issue在Lasagne's的報告里,在這幾天后,PR695被合并,允許他們更好的整合。
首先,Lasagne創建一個具有2個完全連接的隱藏層(每個具有800個神經元)的ANN,這幾乎是從教程中直接采用的Lasagne代碼。 當使用lasagne.layers.DenseLayer創建圖層時,我們可以傳遞一個函數init,該函數必須返回一個用作權重和偏差矩陣的Theano表達式。
接下來,為ANN創建權重函數。 因為PyMC3要求每個隨機變量具有不同的名稱,我們創建一個類并且是唯一命名的先驗。
在這里,priors充當了調節者的角色,試圖保持ANN small的權重。它在數學上等價于一個L2的損失項,作為通常的做法是將大的權重懲罰到目標函數中。
下面是一些設置小批量ADVI的函數。
放在一起
讓我們用小批量的ADVI來運行ANN:
確保一切聚合:
Accuracy on test data = 89.81%
分層神經網絡:學習數據的正則化
上面我們只是固定了所有層的sd = 0.1,但是可能第一層應該有不同于第二層的值。也許開始時是0.1,要么太小或太大。在貝葉斯建模中,很常見的是在這種情況下放置hyperprior,并學習最佳正則化應用到數據中去。這節省了我們在超參數優化中對參數進行調優的時間。
Accuracy on test data = 92.25999999999999%
我們得到一個很小但很好的boost在準確性上。 我們來看看超參數后面的部分:
有趣的是,它們都是不同的,這表明改變正規化數量在網絡的每一層是有意義的。
卷積神經網絡
但到目前為止,在PyMC3中實現也很簡單。有趣的是,我們現在可以構建更復雜的ANNs,像卷積神經網絡:
Accuracy on test data = 98.03%
總結
以上是生活随笔為你收集整理的PyMC3和Lasagne构建神经网络(ANN)和卷积神经网络(CNN)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫:利用cookie获取人人网登录后网
- 下一篇: 卷积神经网络(CNN:Convoluti