基于tensorflow的MNIST手寫字識別(一)--白話卷積神經網絡模型
1、卷積
2、池化
3、全連接
4、梯度下降法
5、softmax
本次就是用最簡單的方法給大家講解這些概念,因為具體的各種論文網上都有,連推導都有,所以本文主要就是給大家做個鋪墊,如有錯誤請指正,相互學習共同進步。
大家應該知道大名鼎鼎的傅里葉變換,即一個波形,可以有不同的正弦函數和余弦函數進行疊加完成,卷積神經網絡也是一樣,可以認為一張圖片是由各種不同特征的圖片疊加而成的,所以它的作用是用來提取特定的特征,舉個例子,比如給定一張圖片,然后我只想提取它的輪廓,于是就需要卷積神經網絡。
如圖是大名鼎鼎的LeNet-5(識別數字的卷積網絡),效果和論文在此,這里拿出來只是為了說明一下卷積神經網絡的模型,就像圖中那樣,經過多次,卷積,池化(又叫子采樣),然后全連接,就完工了。
其實卷積很好理解,左側綠色的部分的5*5矩陣其實一般就是我們輸入的圖片的灰度值(可以想象成一張5px*5px的黑白照片,然后把黑白照片上的每一個點轉化成矩陣上的每一個元素),然后上面的黃色部分矩陣就是我們的過濾器,用來提取特征,(其實應該叫濾波器或者卷積核),讓卷積核在輸入矩陣上進行從左到右,從上到下滑動,然后每一次滑動,兩個矩陣對應位置的元素相乘然后求和,就是右邊那個矩陣的一個元素。
上面那張圖片從左到右,每次滑動的時候只移動一格,但是其實它一次滑動多格,這就是步長
如上圖所示,卷積后的矩陣只有3*3,比原來的圖片要小了,因為邊界沒有了,所以要考慮這個邊界的問題,網上說卷積的邊界處理有兩種方式:
一、丟掉邊界,也就是就按右邊那個縮小的矩陣來。
二、復制邊界,也就是把左邊的最外層原封不動地復制過去
但是在看matlab代碼和tensorflow代碼的時候發現并不是那么簡單的事情。
matlab中conv2這個“padding”參數可以設為三個值FULL,SAME,VALID
tensorflow中conv2d的"padding"參數可以設為兩個值SAME,VALID
它們對邊界是這樣處理的,對輸入的矩陣,包裹n層0,然后再按照上面所說的卷積方法進行卷積,這個n怎么求呢,
FULL:edge_row?=?kernel_row?-?1; ? edge_cols?=?kernel_cols?-?1;
SAME:edge_row?=?(kernel_row?-?1)?/?2;edge_cols?=?(kernel_cols?-?1)?/?2;
VALID:edge_row?=?edge_cols?=?0;
edge_row就是邊的行數,kernel_row就是卷積核的行數,所以上面講的其實就是VALID模式
右下角就是卷積的數學公式,矩陣的對應元素相乘求和,然后加上一個偏置值
池化分為兩種,一種是最大池化,在選中區域中找最大的值作為抽樣后的值,另一種是平均值池化,把選中的區域中的平均值作為抽樣后的值,這樣做的,原因是為了后面全連接的時候減少連接數
左邊的是沒有沒有進行卷積的全連接,假設圖片是1000*1000的,然后用1M的神經元去感知,最后需要10^12個權值作為參數,右邊是經過卷積過的,每個圓點是一個神經元,因此只是用一個卷積核的話,其實只要100*10^6,數量級就大大減少,而且因為提取的就是所需的特征,所以在加快訓練速度的時候對結果并不會產生過大的影響,甚至更為精確。
可能很多人會問,那個卷積核是怎么得出來的呢,其實它是被各種訓練集訓練出來的,利用梯度下降法使得我們的參數到達最優解。
梯度下降法可以這樣子理解,假設我們正在下山,要使得下山的路徑達到最短,于是我們每走一步之前就判斷一下四面八方從哪個方向跨出這一步會最短,不過學過算法的人應該都知道,有個問題就是,我們當前走的這一步是當前位置最短的,但是真正從山上到山下最短路徑可能并不路過這一步。也就是說這是個局部最優解,而不是全局最優解,我們得到的路徑并不一定是最短的,但是也足夠優秀,原因就是,得到最優解費時費力,性價比并不高。這一個知識點還是建議大家伙去看一下斯坦福Andrew?Ng的《機器學習》,然后就能理解上面所說的權值參數要少的意義了。
softmax是分類用的,說直白一點就是歸一化,因為這個店最好跟例子結合起來,所以暫時不多說,感興趣的可以去網上找,也可以關注后面的系列文章。
三、總結
其實感覺講的并不深入,因此還是希望各位能自己去仔細鉆研一下,這里給各位一些基礎吧,讀起論文和數學公式來會更輕松一些。
四、參考文章
神經網絡介紹
http://ufldl.stanford.edu/wiki/index.php/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C
技術向:一文讀懂卷積神經網絡CNN
http://www.cnblogs.com/nsnow/p/4562308.html
深度學習(卷積神經網絡)一些問題總結
http://blog.csdn.net/nan355655600/article/details/17690029
卷積神經網絡(CNN)
http://ibillxia.github.io/blog/2013/04/06/Convolutional-Neural-Networks/
Deep Learning模型之:CNN卷積神經網絡(一)深度解析CNN
http://www.cnblogs.com/nsnow/p/4562363.html
數據挖掘系列(10)——卷積神經網絡算法的一個實現(轉)
http://blog.sina.com.cn/s/blog_4ff49c7e0102vl5m.html
Matlab/DeepLearnToolbox
https://github.com/rasmusbergpalm/DeepLearnToolbox
Deep Learning論文筆記之(四)CNN卷積神經網絡推導和實現
http://blog.csdn.net/zouxy09/article/details/9993371
Deep Learning論文筆記之(五)CNN卷積神經網絡代碼理解
http://blog.csdn.net/zouxy09/article/details/9993743
斯坦福? 池化
http://ufldl.stanford.edu/wiki/index.php/%E6%B1%A0%E5%8C%96
CNN神經網絡層次分析
http://blog.csdn.net/liulina603/article/details/44915905
深度學習筆記1(卷積神經網絡)
http://blog.csdn.net/lu597203933/article/details/46575779
CNN公式推導
http://blog.csdn.net/lu597203933/article/details/46575871
前向型神經網絡之BPNN(附源碼)
http://blog.csdn.net/heyongluoyao8/article/details/48213345
殘差與誤差的區別
http://wenku.baidu.com/link?url=DUDkyV1tnD_SEGzgcxb9AaFU5VUcP9ISNR8q39-fpCcq_LGUHY7ucx5vDwr-MCfU_ofr7yIQZ_UgTfiivTtaDOulW2DD3pGs07eYmiQv5P7
反向傳導算法
http://deeplearning.stanford.edu/wiki/index.php/%E5%8F%8D%E5%90%91%E4%BC%A0%E5%AF%BC%E7%AE%97%E6%B3%95
圖像卷積與濾波的一些知識點
http://blog.csdn.net/zouxy09/article/details/49080029
CNN卷積神經網絡原理簡介+代碼詳解
http://doc.okbase.net/u012162613/archive/126058.html
卷積神經網絡(lenet)
http://deeplearning.net/tutorial/lenet.html
激活函數的作用
https://www.zhihu.com/question/22334626
神經網絡入門第一部分
http://blog.sina.com.cn/s/blog_6a67b5c50100tspb.html
神經網絡入門第二部分
http://blog.sina.com.cn/s/blog_6a67b5c50100tspe.html
卷積神經網絡全面解析
http://www.moonshile.com/post/juan-ji-shen-jing-wang-luo-quan-mian-jie-xi
Deep learning:四十一(Dropout簡單理解)
http://www.cnblogs.com/tornadomeet/p/3258122.html
DeepLearning (六) 學習筆記整理:神經網絡以及卷積神經網絡
http://www.07net01.com/2015/11/963741.html
深度卷積網絡CNN與圖像語義分割
http://blog.csdn.net/xiahouzuoxin/article/details/47789361
MATLAB conv2卷積的實現
http://blog.csdn.net/celerychen2009/article/details/38852105