目前爲止我已經完整地學完了三個機器學習教程:包括「Stanford CS229」,"Machine Learning on Coursrea" 和 "Stanford UFLDL",卷積神經網絡是其中最抽象的概念。git
維基百科對卷積的數學定義爲:
github
因爲卷積經常使用與信號處理,不少人基於「輸入->系統->響應」這一模型來解釋卷積的物理意義,這裏轉載一個很是通俗的版本:網絡
好比說你的老闆命令你幹活,你卻到樓下打檯球去了,後來被老闆發現,他很是氣憤,扇了你一巴掌(注意,這就是輸入信號,脈衝),因而你的臉上會漸漸地鼓起來一個包,你的臉就是一個系統,而鼓起來的包就是你的臉對巴掌的響應,好,這樣就和信號系統創建起來意義對應的聯繫。下面還須要一些假設來保證論證的嚴謹:假定你的臉是線性時不變系統,也就是說,不管何時老闆打你一巴掌,打在你臉的同一位置,你的臉上老是會在相同的時間間隔內鼓起來一個相同高度的包,而且假定以鼓起來的包的大小做爲系統輸出。好了,下面能夠進入核心內容——卷積了!app
若是你天天都到地下去打檯球,那麼老闆天天都要扇你一巴掌,不過當老闆打你一巴掌後,你5分鐘就消腫了,因此時間長了,你甚至就適應這種生活了……若是有一天,老闆忍無可忍,以0.5秒的間隔開始不間斷的扇你的過程,這樣問題就來了,第一次扇你鼓起來的包還沒消腫,第二個巴掌就來了,你臉上的包就可能鼓起來兩倍高,老闆不斷扇你,脈衝不斷做用在你臉上,效果不斷疊加了,這樣這些效果就能夠求和了,結果就是你臉上的包的高度隨時間變化的一個函數了(注意理解);若是老闆再狠一點,頻率愈來愈高,以致於你都辨別不清時間間隔了,那麼,求和就變成積分了。能夠這樣理解,在這個過程當中的某一固定的時刻,你的臉上的包的鼓起程度和什麼有關呢?和以前每次打你都有關!可是各次的貢獻是不同的,越早打的巴掌,貢獻越小,因此這就是說,某一時刻的輸出是以前不少次輸入乘以各自的衰減係數以後的疊加而造成某一點的輸出,而後再把不一樣時刻的輸出點放在一塊兒,造成一個函數,這就是卷積,卷積以後的函數就是你臉上的包的大小隨時間變化的函數。原本你的包幾分鐘就能夠消腫,但是若是連續打,幾個小時也消不了腫了,這難道不是一種平滑過程麼?反映到劍橋大學的公式上,f(a)就是第a個巴掌,g(x-a)就是第a個巴掌在x時刻的做用程度,乘起來再疊加就ok了,你們說是否是這個道理呢?我想這個例子已經很是形象了,你對卷積有了更加具體深入的瞭解了嗎?機器學習
這是一些嘗試解釋卷積的文章:函數
http://www.guokr.com/post/342476/ post
http://blog.csdn.net/yeeman/article/details/6325693 學習
https://zh.wikipedia.org/wiki/%E5%8D%B7%E7%A7%AF this
而在圖像處理中一般使用離散形式的卷積,在下一節中介紹。
編碼
假設有一個稀疏自編碼器 SAE,訓練使用的是 3×3 的小圖。將 SAE 用做深度網絡的隱藏層時,它依然只接受 3×3 的數據做爲輸入,且假設這個隱藏層有 k 個單元(每一個單元也被稱爲一個卷積核 - Convolution Kernel,由對應的權值向量 W 和 b 來體現)。
每一個隱藏單元的輸入是用本身的權值向量 W 與 3×3 的小圖作內積,再與截距項相加獲得的:
假如深度網絡的輸入是 5×5 的大圖,SAE 要從中提取特徵,必須將 5×5 的大圖分解成若干 3×3 的小圖並分別提取它們的特徵。分解方法就是:從大圖的 (1, 1)、(1, 2)、(1, 3)、... 、(3, 3)等 9 個點開始分別做爲小圖的左上角起點,依次截取 9 張帶有重合區域的小圖,而後分別提取這 9 張小圖的特徵:
因此,每一個隱藏單元將有 9 個輸入,不一樣於以前的 1 個。而後將全部輸入分別導入激活函數計算相應的輸出,卷積特徵提取的工做就完成了。
對於本例,隱藏層所提取的特徵共有 9×k 個;更通常化地,若是大圖尺寸是 r×c,小圖尺寸是 a×b,那麼所提取特徵的個數爲:
卷積特徵提取利用了天然圖像的統計平穩性(Stationary):
天然圖像有其固有特性,也就是說,圖像的一部分的統計特性與其餘部分是同樣的。這也意味着咱們在這一部分學習的特徵也能用在另外一部分上,因此對於這個圖像上的全部位置,咱們都能使用一樣的學習特徵。
在完成卷積特徵提取以後,對於每個隱藏單元,它都提取到 (r-a+1)×(c-b+1)個特徵,把它看作一個矩陣,並在這個矩陣上劃分出幾個不重合的區域,而後在每一個區域上計算該區域內特徵的均值或最大值,而後用這些均值或最大值參與後續的訓練,這個過程就是【池化】。
顯著減小了參數數量
池化單元具備平移不變性 (translation invariant)
有一個 12×12 的 feature map (隱藏層的一個單元提取到的卷積特徵矩陣),池化區域的大小爲 6×6,那麼池化後,feature map 的維度變爲 2×2。
假設原 feature map 中灰色元素的值爲 1,白色元素的值爲 0。若是採用 max pooling,那麼池化後左上角窗口的值爲 1。若是將圖像向右平移一個像素:
池化後左上角窗口的值仍是 1。若是將圖像縮小:
池化後左上角窗口的值依然是 1。
一般咱們認爲圖像通過有限的平移、縮放、旋轉,不該改變其識別結果,這就要求通過平移、縮放、旋轉的圖片所提取的特徵與原圖所提取的特徵相同或類似,所以分類器才能把它們識別成同一類。
比較主流的池化方式有以下幾種:
通常池化(General Pooling): max pooling 和 average pooling
如今已經知道了 max pooling 與 average pooling 的幾何意義,還有一個問題須要思考:它們分別適用於那些場合?在不一樣的場合下,它們的表現有什麼不同?爲何不同?
網絡上有人這樣區分 max pooling 和 average pooling:
「average對背景保留更好,max對紋理提取更好」。
限於篇幅以及個人理解還不深,就不展開討論了,若是之後須要,我會深刻研究一下。
重疊池化(Overlapping Pooling)
重疊池化的相鄰池化窗口之間會有重疊區域。
空間金字塔池化(Spatial Pyramid Pooling)
空間金字塔池化拓展了卷積神經網絡的實用性,使它可以以任意尺寸的圖片做爲輸入。
下面列出一些研究池化的論文:
http://yann.lecun.com/exdb/publis/pdf/boureau-icml-10.pdf
http://yann.lecun.com/exdb/publis/pdf/boureau-cvpr-10.pdf
有 m 張彩色天然圖片拿來訓練一個神經網絡,使它可以對圖片中的物體作分類。訓練過程能夠大體分爲如下幾步:
從圖片庫中隨機裁剪出相同尺寸的小圖若干張,用來訓練一個稀疏自編碼器 C1;
以 C1 做爲第一個卷積層,從原圖中作卷積特徵提取;
在 C1 下游添加一個池化層 S1,對 C1 所提取的特徵作池化計算;
若是須要提取更加抽象的特徵,在 S1 以後添加捲積層 C2,C2 是一個使用 S1 的數據進行訓練的稀疏自編碼器;
在 C2 下游添加一個池化層 S2,若是須要提取進一步抽象的特徵,重複添加捲積層與池化層便可;
以最後一個池化層的輸出做爲數據訓練分類器。
In this exercise you will use the features you learned on 8x8 patches sampled from images from the STL-10 dataset in the earlier exercise on linear decoders for classifying images from a reduced STL-10 dataset applying convolution and pooling. The reduced STL-10 dataset comprises 64x64 images from 4 classes (airplane, car, cat, dog).
此次做業依賴上一次「linear decoders」做業的代碼,使用的數據是 STL-10 的一個子集,用來識別四種圖像:飛機、汽車、貓和狗。
代碼地址,因爲 GIthub 有文件大小限制,因此此次沒有上傳數據文件。
Pooling 的代碼比較簡單,因此這裏把計算卷積的代碼詳細註釋後貼出來:
cnnConvolve.m
運行結果(識別的正確率):
使用 average pooling:
使用 max pooling: