和全連接神經(jīng)網(wǎng)絡(luò)的主要差別
全連接神經(jīng)網(wǎng)絡(luò):
??每個(gè)神經(jīng)元的輸入數(shù)據(jù),都使用了上一層的所有神經(jīng)元的輸出數(shù)據(jù),每個(gè)神經(jīng)元的輸出數(shù)據(jù),都被作為下一層的所有神經(jīng)元的輸入數(shù)據(jù),這容易導(dǎo)致參數(shù)數(shù)量膨脹、過擬合、容易陷入局部最優(yōu),尤其用于圖像識別時(shí),因?yàn)槿绻衙總€(gè)像素當(dāng)成一個(gè)特征,則會有大量的特征值,比如一副 32 * 32 * 3(3位 RGB)的圖片,輸入層就有 3072 個(gè)點(diǎn),假設(shè)第一個(gè)變換層有 100 個(gè)點(diǎn),則這一層就需要 3072*100+100 = 307300 個(gè)參數(shù),如果是精度更高的圖片,加上網(wǎng)絡(luò)還有多層,參數(shù)太多了
??
卷積神經(jīng)網(wǎng)絡(luò):
??主要用于圖像識別,其效果非常好,同時(shí)黑箱程度也非常著名(既數(shù)學(xué)上還無法解釋證明)
??在全連接神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上增加了卷積層(注意這里說的卷積和數(shù)學(xué)上的卷積不是一個(gè)意思),卷積層之間采用局部連接,既每個(gè)輸出數(shù)據(jù)只被下一層的部分?jǐn)?shù)據(jù)使用,每個(gè)數(shù)據(jù)只使用上一層的部分輸出數(shù)據(jù),卷積層直接使用三維數(shù)據(jù)(圖片的長、寬、顏色),而全連接網(wǎng)絡(luò)需要將其轉(zhuǎn)為一維數(shù)據(jù),所以全連接層一般用一排圓圈表示,而卷積層一般用一個(gè)長方體表示,卷積層通過卷積核(也叫 filter、濾波器)對數(shù)據(jù)進(jìn)行轉(zhuǎn)換,產(chǎn)生二維數(shù)據(jù),多個(gè)卷積核產(chǎn)生多個(gè)二維數(shù)據(jù)輸出,最終輸出的還是三維數(shù)據(jù)
??卷積層相當(dāng)于特征提取的作用,最后還是要通過全連接網(wǎng)絡(luò)進(jìn)行分類,實(shí)際上后面接其他分類算法也可以,只不過一般都是用全連接神經(jīng)網(wǎng)絡(luò)
??卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程與全連接神經(jīng)網(wǎng)絡(luò)基本一致
局部連接(Sparse Connectivity)& 權(quán)值共享(Shared Weights)
卷積的兩個(gè)基本概念
??
看到一個(gè)有趣的比喻:就像我們看風(fēng)景,由于視野有限,實(shí)際上我們一次只能看到一部分風(fēng)景,為了看到完整的風(fēng)景我們必須四處張望,然后得到對全景的感受。實(shí)際上完整地看一次可能還不夠,可能還會看多次,這次關(guān)注點(diǎn)是人,下次關(guān)注點(diǎn)是樹林,等等,但每次四處張望我們都用相同的思想分析看到的每一部分
??
在這里,視野有限就是局部連接,四處張望并得到對全景的感受就是卷積,使用的思想就是卷積核,同一次張望使用相同的思想觀察全景就是權(quán)值共享,用不同的思想多次觀察全景就是使用多個(gè)卷積核
??
更具體的說,卷積核是一個(gè)函數(shù),一個(gè)卷積層有多個(gè)卷積核函數(shù),不同卷積核的函數(shù)參數(shù)不一樣,每次卷積核取上一層的一小部分三維數(shù)據(jù)作為輸入,計(jì)算得出一個(gè)輸出值,從左到右再從上到下掃一遍得到一個(gè)二維數(shù)據(jù)結(jié)果,多個(gè)卷積核的結(jié)果組成三維數(shù)據(jù),每個(gè)卷積核的大小一樣,卷積核的大小決定了輸出的長度和寬度,卷積核的數(shù)量決定了輸出的深度
??
局部連接和權(quán)值共享大大減少了參數(shù)的數(shù)量
經(jīng)典數(shù)據(jù)集
MNIST
??0~9 的手寫體數(shù)據(jù)集,60000 張 28 x 28 的圖片
CIFAR-10
??60000 張 10 個(gè)不同種類的圖片,像素為 32 x 32
CIFAR-100
??60000 張 100 個(gè)不同種類的圖片,像素為 32 x 32
??100 個(gè)類被分成 20 個(gè)超類,每張圖片即屬于一個(gè)類又屬于一個(gè)超類,比如魚、鯊魚
ImageNet
??約 1500 萬張圖片,超過 20000 個(gè)分類,可以選擇 32 x 32 或 64 x 64 的尺寸
卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)

卷積神經(jīng)網(wǎng)絡(luò)一般包括了輸入層、卷積層、池化層、全連接層、輸出層
輸入層
將原始數(shù)據(jù)以三維的形式輸入
卷積層
結(jié)構(gòu)上,和全連接網(wǎng)絡(luò)的兩點(diǎn)不同
??1. 輸入的形式不同(一維和三維)
??2. 層與層之間的連接方式不同(全連接和局部連接)
?
每次計(jì)算一小塊數(shù)據(jù)相當(dāng)于獲取抽象程度更高的特征
??
假設(shè)一副 的圖像,其內(nèi)容為
??
??
??
卷積網(wǎng)絡(luò)直接接受這個(gè)三維數(shù)組作為輸入
??
假設(shè)使用 2 個(gè)卷積核,每個(gè)卷積核的長寬深是 (深度必須和上一層的相同)
每個(gè)卷積核的假設(shè)參數(shù)如下
?
卷積核 1?
?
??
?
卷積核 2
?
??
?
卷積核從第 0 行第 0 列開始,從左到右,從上到下,取 的數(shù)據(jù)計(jì)算
當(dāng)處于第 i 行第 j 列時(shí),將取得的數(shù)據(jù)轉(zhuǎn)換為激活函數(shù)的輸入
?
??
?
假設(shè)卷積核的激活函數(shù)為恒同函數(shù)
?
??
?
則上面例子的輸出為
??
???
???
??
??
???
???
?
??
???
???
?
??
???
???
??
??
??
???
???
??
??
???
???
??
??
???
???
??
??
???
???
??
最終是一個(gè) 的輸出(計(jì)算公式在后面的 VALID 和 SAME)
??
??
??
可以看到,參數(shù)個(gè)數(shù)由核數(shù)、核的長寬、輸入數(shù)據(jù)頻道大?。ɑ蛏疃龋Q定,和輸入數(shù)據(jù)的長寬沒有關(guān)系,這就大大減少了需要的參數(shù)個(gè)數(shù),卷積核大小可以遠(yuǎn)小于輸入數(shù)據(jù)的大小,這就是局部視野,在由左到右,由上到下移動(dòng)的過程中,使用的系數(shù)是一樣的,這就是權(quán)值共享
??
參數(shù)個(gè)數(shù) = (核長 x 核寬 x 輸入數(shù)據(jù)頻道+1) x 核數(shù)
上面的例子共需要
??
卷積核的大小一般選擇 或
居多
一般卷積層的輸出數(shù)據(jù)的頻道數(shù)會變得更多
??
Padding
??卷積會導(dǎo)致輸出數(shù)據(jù)的長寬變小,如果需要避免這個(gè)問題,可以采用填充(Padding)
??即在外圍再增加一層數(shù)據(jù),比如用 0 填充,比如前面的數(shù)據(jù)中的 R 頻道變?yōu)?br>
??
??
??
??此時(shí)用 2 x 2 卷積核,輸出是 4 x 4,用 3 x 3 卷積核,輸出是 3 x 3,避免了輸出維度變小
??
Stride
??此外還可以通過調(diào)整步長,改變輸出數(shù)據(jù)的維度
??步長既每次向左、向下移動(dòng)的步數(shù),前面使用的步長都是 1
??假設(shè)卷積核使用步長 2,長寬為 3 x 3,系數(shù) w 全是 1,偏移 b 是 0
??不考慮 GB 頻道,只對用 0 填充后的 R 使用,則輸出為
??
??
??
??
??
??
??
??既輸出 2 x 2 的數(shù)據(jù)
??
????
??
TensorFlow 的 padding 有兩種方式
?
??VALID:
????不會添加新元素
??
????out_height = ceil((in_height - filter_height + 1) / stride)??# ceil 為向上取整
????out_width = ceil((in_width - filter_width + 1) / stride)
??
??SAME:
????TensorFlow 自動(dòng)計(jì)算需要在四周添加的元素維度
????(不一定需要四周都添加,優(yōu)先添加上方和左方,添加元素為 0)
????使得輸出數(shù)據(jù)的長和寬為
??????out_height = ceil(in_height / stride)
??????out_width = ceil(in_width / stride)
????
????需要添加的元素?cái)?shù)量
??????pad_needed_height = (out_height – 1) * stride + filter_height - in_height
??????pad_top = pad_needed_height / 2
??????pad_down = pad_needed_height - pad_top
????
??????pad_needed_width = (out_width – 1) * stride + filter_width - in_width
??????pad_left = pad_needed_width / 2
??????pad_right = pad_needed_width – pad_left
池化層(Pooling)
兩個(gè)卷積層之間往往會有一個(gè)池化層,目的是縮小矩陣尺寸,以加快計(jì)算速度、防止過擬合
??
池化層和卷積類似,也有長、寬、Padding、Stride
區(qū)別在于,池化層不是加權(quán)求和激化,而是簡單的取最大值或平均值,以及不會橫跨多個(gè)頻道
??
取最大值的稱為極大池化(Max Pooling),取平均值的稱為平均池化(Average Pooling)
為什么取平均或最大:CNN 一般處理的是圖像,像素級的差異很小,這為上述兩種池化提供了一定的合理性
??
實(shí)際中池化層的長寬用的最多的是 2 x 2 或 3 x 3
??
假設(shè)某個(gè)卷積層的輸出如下
??
??
??
池化層為 2 x 2 采用平均池化,各輸出為
??avg(11,12,14,15) = 13??avg(12,13,15,16) = 14
??avg(14,15,17,18) = 16??avg(15,16,18,19) = 17
??
??avg(21,22,24,25) = 23??avg(22,23,25,26) = 24
??avg(24,25,27,28) = 26??avg(25,26,28,29) = 27
??
??avg(31,32,34,35) = 33??avg(32,33,35,36) = 34
??avg(34,35,37,38) = 36??avg(35,36,38,39) = 37
??
最終輸出 3 x 2 x 2 的數(shù)據(jù)
??
??
??
可以看到池化層起壓縮的作用
全連接層
將池化層或卷積層的輸出鋪平,然后用全連接神經(jīng)網(wǎng)絡(luò)進(jìn)行非線性變換
??
可以將輸入層和卷積層當(dāng)作是特征提取,將全連接層和輸出層當(dāng)作分類器
??
全連接層一般不會有太多層
??
理論上講后面的分類可以用其他算法比如 SVM 等,但一般都是用的全連接神經(jīng)網(wǎng)絡(luò)
反向傳播算法
原理和全連接神經(jīng)網(wǎng)絡(luò)是一樣的,也是從輸出層開始,計(jì)算誤差,求梯度,通過梯度更新參數(shù)
公式推導(dǎo)可能復(fù)雜了點(diǎn),就不列出來了
卷積計(jì)算的解決方案
1 變換成比較大規(guī)模的矩陣相乘
2 利用快速傅里葉變換(Fast Fourier Transform,F(xiàn)FT)
??
TensorFlow 提供了各種函數(shù)用于卷積網(wǎng)絡(luò)的實(shí)現(xiàn)
經(jīng)典模型
LeNet-5
??1998 年提出,在 MNIST 數(shù)據(jù)集上達(dá)到 99.2% 的正確率
??
??第一層 卷積層
????接受 32 x 32 x 1 輸入(既 MNIST 圖片的大小)
????過濾器 5 x 5,卷積核 6 個(gè),不用填充,步長為 1
????共 (5 x 5 x 1+1) x 6 = 156 個(gè)參數(shù)
????輸出矩陣為 28 x 28 x 6
??
??第二層 池化層
????輸入為 28 x 28 x 6,過濾器 2 x 2,步長 2,輸出 14 x 14 x 6
??
??第三層 卷積層
????接受 14 x 14 x 6 輸入,過濾器 5 x 5,卷積核 16 個(gè),不用填充,步長為 1
????共 (5 x 5 x 6+1) x 16 = 2416 個(gè)參數(shù)
????輸出矩陣為 10 x 10 x 16
??
??第四層 池化層
????輸入為 10 x 10 x 16,過濾器 2 x 2,步長 2,輸出 5 x 5 x 16
??
??第五層 全連接層
????將輸入鋪平,得到 5 x 5 x 16 = 400 個(gè)輸入,輸出個(gè)數(shù) 120
????共 (5 x 5 x 16+1) x 120 = 48120 個(gè)參數(shù)
??
??第六層 全連接層
????輸入節(jié)點(diǎn) 120 個(gè),輸出節(jié)點(diǎn) 84 個(gè),共 (120+1) x 84 = 10164 個(gè)參數(shù)
??
??第七層 全連接層
????輸入節(jié)點(diǎn) 84 個(gè),輸出節(jié)點(diǎn) 10 個(gè) (圖片是 0~9 的數(shù)字),共 (84+1) x 10 = 850 個(gè)參數(shù)
??
Inception-v3
??正常情況下卷積層只能選取某個(gè)長寬和核數(shù)
??而 Inception-v3 并聯(lián)使用多個(gè)卷積層,每個(gè)卷積層使用不同的長寬和核數(shù)
??
??每個(gè)卷積層使用不同的過濾器尺寸,使用 SAME 模式,使用相同的步長
??這樣輸出數(shù)據(jù)的頻道數(shù)可能不同但長寬相同,可以拼接成更大的頻道作為輸出
??
??TensorFlow-Slim 可以更方便的實(shí)現(xiàn) Inception-v3
??Inception-v3 同樣會有池化層、全連接層
卷積神經(jīng)網(wǎng)絡(luò)的遷移學(xué)習(xí)
訓(xùn)練一個(gè)卷積網(wǎng)絡(luò),需要大量的標(biāo)注圖片(可能達(dá)到百萬級別),實(shí)際上很難收集到如此大的數(shù)據(jù)量,即使能,也要花費(fèi)大量的人力物力,而且訓(xùn)練過程可能需要幾天甚至幾周的時(shí)間
??
遷移學(xué)習(xí)就是將一個(gè)訓(xùn)練好的模型,通過簡單的調(diào)整使其適用于一個(gè)新的問題
??
可以保留訓(xùn)練好的 Inception-v3 模型中所有卷積層的參數(shù),只是替換全連接層
??
卷積層起特征提取的作用,如果一個(gè)訓(xùn)練好的系統(tǒng)可以區(qū)分很多種圖片(比如1000種)的話,有理由認(rèn)為這個(gè)系統(tǒng)的特征提取能力很強(qiáng),可以直接用于新的分類問題,只需要訓(xùn)練分類即可
??
遷移學(xué)習(xí)的效果雖然沒有重新學(xué)習(xí)的好,但所需要的訓(xùn)練樣本和訓(xùn)練時(shí)間能大大減少