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