起源:喵星人的視覺皮層
1958 年,一群奇葩的神經科學家把電極插到喵星人的腦子里,去觀察視覺皮層的活動。從而推斷生物視覺系統是從物體的小部分入手,
經過層層抽象,最后拼起來送入處理中心,減少物體判斷的可疑性的。這種方法就與BP網絡背道而馳。
BP網絡認為,大腦每個神經元都要感知物體的全部(全像素全連接),並且只是簡單的映射,並沒有對物體進行抽象處理。
誰對誰錯呢?卷積神經網絡(Convolution Neural Network)最先證明了BP網絡的不科學性。
CNN起源於機器學習大師LeCun在80年代末搞的支票數字識別神經網絡。他在BP網絡前面嘗試了多層的卷積、降采樣、以及部分網絡連接的創意,
結果訓練效果好得驚人。LeCun的導師是Hinton,也就是最先在2006年提出深度學習(Deep Learning)概念的計算機科學家兼神經科學家。
LeCun本人也算是半個神經科學家。師徒二人攜手撐起了深度學習的藍天。
Part I:圖像的卷積與降采樣
卷積運算具有平滑、模糊信號的效果,它對原始信號與卷積核鄰域做了乘積加權和。一幅圖像可分為噪聲、細節兩部分。
卷積運算合並了信號部分內容之后,起到了消除噪聲,突出細節兩個作用。同時,卷積運算的參數也是可以由機器自動訓練的,這就成為神經網絡的瞄准對象。
CNN中使用的是二維卷積,卷積方式很簡單:參考 http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

上圖為vaild卷積,還有一種full卷積,考慮將卷積核移到源圖像之外,vaild卷積維度會變小,full會變大(一般不用)
$vaild:Dim^{new}=Dim^{old}-filter.Dim+1$
$full:Dim^{new}=Dim^{old}+filter.Dim-1$
當然這是后話。二維離散卷積的定義是這樣的:g與f順序是不一樣的

上圖中黃色3*3卷積核實際上在做滑動乘積之前,被旋轉了180度。
$\begin{bmatrix}
1 & 2\\
3 & 4\\
5 & 6
\end{bmatrix}=>\begin{bmatrix}
6 & 5\\
4 & 3\\
2 & 1
\end{bmatrix}$
所以手寫卷積時,千萬不要忘記了卷積核旋轉。
降采樣(Pooling)對應一個size,假如是(2,2),那么每2X2的像素會被合並為1個像素。
有取最大值作為新值的,以便更加突出特征的Max Pooling方法。
也有取均值作為新值的,以便更加平滑特征的Mean Pooling方法。
當然這些都不是重點,pooling強制把像素降了一個量級,①降低了計算量②保證了縮放、旋轉不變性[?]
Part II CNN的結構

這是LeCun的LeNet5結構,通常拿來作為CNN的教學。
首先要區分一個概念,filter和feature map。feature map就是上面的一塊大板子,size是28x28
filter指的是卷積核,filter的數量決定着下一層大板子的數量,size就是卷積核大小。
卷積嵌入到神經網絡里,就有了一個權值共享的概念。傳統的神經網絡,對28x28像素,會有784個神經元,如果下一層也有784個神經元,那么就需要784*784個權值。
但是卷積神經網絡里,將卷積核權值看成是神經元,一個卷積核才多大?5x5=25罷了,784個像素共用這25個神經元,滾來滾去,也就是一套權值。
研究表明,卷積核數量與數據量規模沒有多少關系,而且根據視覺系統的特性,隨着層數加深,才有必要增加核數,且不多。比如LeNet的卷積層也就6、16個核
這樣,全連接過程中,盡管需要Num(層K)*Num(層K-1)套權值,但是由於每層feature map數量有限,且一套權值規模又不大,所以訓練起來很輕松。
Theano的注釋中用4D張量(其實就是個大小為4的數組)來表示結構轉移,假設一個batch有500張圖片,都是黑白單通道。
(圖片數,map數,高,寬)---image/input/output, input的map數即為通道數,比如RGB有三個通道,視為3。
(filter數,map數,高,寬)---filter
I/O的轉移如下:$(500,1,32,32)=>(500,6,28,28)=>(500,6,14,14)=>(500,16,10,10)=>(500,16,5,5)=>(500,120,1,1)$,下面就是隱層+分類器了。
filter的轉移如下:$(6,1,5,5)=>(16,6,5,5)=>(120,16,5,5)$
值得注意的是卷積之后的sigmoid,以及偏置b。
因為是全連接,前一層的map卷積並且結果疊加后,送入sigmoid處理。新一層的每張map的每個像素統一加上b。(Theano中把一維b轉成了四維)
也就是說b等於filter的數量,而不是和W的數量一致。tornadomeet中的解釋是錯的。
當然,因為下面還有降采樣,所以sigmoid、偏置b可以留到降采樣結束后再加上去,形成下一層的input。
LeCun在構建S2的6個map=>C3的16個map時,並沒有采用全連接的方式,而是采用更切合生物視覺的部分連接。參考tornadomeet的解釋。

這樣,更好的區分了特征,但是不太好實現。所以Theano干脆就利用conv2d封裝的全連接寫法搞了個簡易版本。
若是具體實現的話,我覺得首先得把output的map給reshape,然后利用這些map,在conv2d手艹16個單map,組合成下一層的input
