卷积神经网络初探 | 数据科学家联盟 http://dataunion.org/20942.html
轉(zhuǎn)載自:
卷積神經(jīng)網(wǎng)絡(luò)初探 | 數(shù)據(jù)科學(xué)家聯(lián)盟
http://dataunion.org/20942.html
前言
目前為止我已經(jīng)完整地學(xué)完了三個(gè)機(jī)器學(xué)習(xí)教程:包括“Stanford CS229”,”Machine Learning on Coursrea” 和 “Stanford UFLDL”,卷積神經(jīng)網(wǎng)絡(luò)是其中最抽象的概念。
維基百科對(duì)卷積的數(shù)學(xué)定義為:
由于卷積常用與信號(hào)處理,很多人基于“輸入->系統(tǒng)->響應(yīng)”這一模型來解釋卷積的物理意義,這里轉(zhuǎn)載一個(gè)非常通俗的版本:
比 如說你的老板命令你干活,你卻到樓下打臺(tái)球去了,后來被老板發(fā)現(xiàn),他非常氣憤,扇了你一巴掌(注意,這就是輸入信號(hào),脈沖),于是你的臉上會(huì)漸漸地鼓起來 一個(gè)包,你的臉就是一個(gè)系統(tǒng),而鼓起來的包就是你的臉對(duì)巴掌的響應(yīng),好,這樣就和信號(hào)系統(tǒng)建立起來意義對(duì)應(yīng)的聯(lián)系。下面還需要一些假設(shè)來保證論證的嚴(yán)謹(jǐn): 假定你的臉是線性時(shí)不變系統(tǒng),也就是說,無論什么時(shí)候老板打你一巴掌,打在你臉的同一位置,你的臉上總是會(huì)在相同的時(shí)間間隔內(nèi)鼓起來一個(gè)相同高度的包,并 且假定以鼓起來的包的大小作為系統(tǒng)輸出。好了,下面可以進(jìn)入核心內(nèi)容——卷積了!
如果你每天都到地下去打臺(tái)球,那么老板每天 都要扇你一巴掌,不過當(dāng)老板打你一巴掌后,你5分鐘就消腫了,所以時(shí)間長(zhǎng)了,你甚至就適應(yīng)這種生活了……如果有一天,老板忍無可忍,以0.5秒的間隔開始 不間斷的扇你的過程,這樣問題就來了,第一次扇你鼓起來的包還沒消腫,第二個(gè)巴掌就來了,你臉上的包就可能鼓起來兩倍高,老板不斷扇你,脈沖不斷作用在你 臉上,效果不斷疊加了,這樣這些效果就可以求和了,結(jié)果就是你臉上的包的高度隨時(shí)間變化的一個(gè)函數(shù)了(注意理解);如果老板再狠一點(diǎn),頻率越來越高,以至 于你都辨別不清時(shí)間間隔了,那么,求和就變成積分了。可以這樣理解,在這個(gè)過程中的某一固定的時(shí)刻,你的臉上的包的鼓起程度和什么有關(guān)呢?和之前每次打你 都有關(guān)!但是各次的貢獻(xiàn)是不一樣的,越早打的巴掌,貢獻(xiàn)越小,所以這就是說,某一時(shí)刻的輸出是之前很多次輸入乘以各自的衰減系數(shù)之后的疊加而形成某一點(diǎn)的 輸出,然后再把不同時(shí)刻的輸出點(diǎn)放在一起,形成一個(gè)函數(shù),這就是卷積,卷積之后的函數(shù)就是你臉上的包的大小隨時(shí)間變化的函數(shù)。本來你的包幾分鐘就可以消 腫,可是如果連續(xù)打,幾個(gè)小時(shí)也消不了腫了,這難道不是一種平滑過程么?反映到劍橋大學(xué)的公式上,f(a)就是第a個(gè)巴掌,g(x-a)就是第a個(gè)巴掌在 x時(shí)刻的作用程度,乘起來再疊加就ok了,大家說是不是這個(gè)道理呢?我想這個(gè)例子已經(jīng)非常形象了,你對(duì)卷積有了更加具體深刻的了解了嗎?
這是一些嘗試解釋卷積的文章:
http://www.guokr.com/post/342476/
http://blog.csdn.net/yeeman/article/details/6325693
https://zh.wikipedia.org/wiki/%E5%8D%B7%E7%A7%AF
而在圖像處理中通常使用離散形式的卷積,在下一節(jié)中介紹。
卷積特征提取(convolution)
?卷積特征提取的過程
假設(shè)有一個(gè)稀疏自編碼器 SAE,訓(xùn)練使用的是 3×3 的小圖。將?SAE?用作深度網(wǎng)絡(luò)的隱藏層時(shí),它依然只接受?3×3 的數(shù)據(jù)作為輸入,且假設(shè)這個(gè)隱藏層有 k 個(gè)單元(每個(gè)單元也被稱為一個(gè)卷積核 – Convolution Kernel,由對(duì)應(yīng)的權(quán)值向量 W 和 b 來體現(xiàn))。
每個(gè)隱藏單元的輸入是用自己的權(quán)值向量 W 與?3×3 的小圖做內(nèi)積,再與截距項(xiàng)相加得到的:
假如深度網(wǎng)絡(luò)的輸入是?5×5 的大圖,SAE 要從中提取特征,必須將?5×5 的大圖分解成若干?3×3 的小圖并分別提取它們的特征。分解方法就是:從大圖的 (1, 1)、(1, 2)、(1, 3)、… ?、(3, 3)等 9 個(gè)點(diǎn)開始分別作為小圖的左上角起點(diǎn),依次截取 9 張帶有重合區(qū)域的小圖,然后分別提取這 9 張小圖的特征:
所以,每個(gè)隱藏單元將有 9 個(gè)輸入,不同于之前的 1 個(gè)。然后將所有輸入分別導(dǎo)入激活函數(shù)計(jì)算相應(yīng)的輸出,卷積特征提取的工作就完成了。
對(duì)于本例,隱藏層所提取的特征共有 9×k 個(gè);更一般化地,如果大圖尺寸是?r×c,小圖尺寸是?a×b,那么所提取特征的個(gè)數(shù)為:
卷積特征提取的原理
卷積特征提取利用了自然圖像的統(tǒng)計(jì)平穩(wěn)性(Stationary):
自然圖像有其固有特性,也就是說,圖像的一部分的統(tǒng)計(jì)特性與其他部分是一樣的。這也意味著我們?cè)谶@一部分學(xué)習(xí)的特征也能用在另一部分上,所以對(duì)于這個(gè)圖像上的所有位置,我們都能使用同樣的學(xué)習(xí)特征。
池化(Pooling)
?池化過程
在完成卷積特征提取之后,對(duì)于每一個(gè)隱藏單元,它都提取到 (r-a+1)×(c-b+1)個(gè)特征,把它看做一個(gè)矩陣,并在這個(gè)矩陣上劃分出幾個(gè)不重合的區(qū)域,然后在每個(gè)區(qū)域上計(jì)算該區(qū)域內(nèi)特征的均值或最大值,然后用這些均值或最大值參與后續(xù)的訓(xùn)練,這個(gè)過程就是【池化】。
池化的優(yōu)點(diǎn)
假設(shè)原 feature map 中灰色元素的值為 1,白色元素的值為 0。如果采用 max pooling,那么池化后左上角窗口的值為 1。如果將圖像向右平移一個(gè)像素:
池化后左上角窗口的值還是 1。如果將圖像縮小:
池化后左上角窗口的值依然是 1。
通常我們認(rèn)為圖像經(jīng)過有限的平移、縮放、旋轉(zhuǎn),不應(yīng)改變其識(shí)別結(jié)果,這就要求經(jīng)過平移、縮放、旋轉(zhuǎn)的圖片所提取的特征與原圖所提取的特征相同或相似,因此分類器才能把它們識(shí)別成同一類。
幾種池化方式
比較主流的池化方式有如下幾種:
網(wǎng)絡(luò)上有人這樣區(qū)分?max pooling 和 average pooling:
“average對(duì)背景保留更好,max對(duì)紋理提取更好”。
限于篇幅以及我的理解還不深,就不展開討論了,如果以后需要,我會(huì)深入研究一下。
http://yann.lecun.com/exdb/publis/pdf/boureau-cvpr-10.pdf
http://yann.lecun.com/exdb/publis/pdf/boureau-iccv-11.pdf
http://ais.uni-bonn.de/papers/icann2010_maxpool.pdf
匯總
有 m 張彩色自然圖片拿來訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò),使它能夠?qū)D片中的物體做分類。訓(xùn)練過程可以大致分為以下幾步:
課后作業(yè)(Convolution and Pooling)
In this exercise you will use the features you learned on 8×8 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 64×64 images from 4 classes (airplane, car, cat, dog).
這次作業(yè)依賴上一次“l(fā)inear decoders”作業(yè)的代碼,使用的數(shù)據(jù)是 STL-10 的一個(gè)子集,用來識(shí)別四種圖像:飛機(jī)、汽車、貓和狗。
代碼地址,由于 GIthub 有文件大小限制,所以這次沒有上傳數(shù)據(jù)文件。
Pooling 的代碼比較簡(jiǎn)單,所以這里把計(jì)算卷積的代碼詳細(xì)注釋后貼出來:
cnnConvolve.m
運(yùn)行結(jié)果(識(shí)別的正確率):
?
總結(jié)
以上是生活随笔為你收集整理的卷积神经网络初探 | 数据科学家联盟 http://dataunion.org/20942.html的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习系列(2)_从初等数学视角解读逻
- 下一篇: 九十分钟极速入门Linux——Linux