1. Lecture 9 卷積神經網路架構
首先回顧一下在數字識別領域有巨大成功的LeNet-5,該網路結構為 [CONV-POOL-CONV-POOL-FC-FC]。卷積層使用5x5的卷積核,步長為1;池化層使用2x2的區域,步長為2;後面是全連接層。如下圖所示:
而2012年的 AlexNet 是第一個在ImageNet大賽上奪冠的大型CNN網路,它的結構和LeNet-5很相似,只是層數變多了——[CONV1-MAX POOL1-NORM1-CONV2-MAX POOL2-NORM2-CONV3-CONV4-CONV5-Max POOL3-FC6-FC7-FC8],共有5個卷積層、3個池化層、2個歸一化層和三個全連接層。如下圖所示:
之所以分成上下兩個部分,是因為當時的GPU容量太小,只能用兩個來完成。還有一些細節是:
AlexNet奪得ImageNet大賽2012的冠軍時,將正確率幾乎提高了10%,2013年的冠軍是ZFNet,和AlexNet使用相同的網路架構,只是對超參數進一步調優:
這樣將錯誤率從16.4%降低到11.7%
14年的冠亞軍GoogLeNet和VGG分別有22層和19層,下面來分別介紹。
VGG 相對於AlexNet使用更小的卷積核,層數也更深。VGG有16層和19層兩種。卷積核只使用3x3,步長為1,pad為1;池化區域2x2,步長為2。
那麼為什麼使用3x3的小卷積核呢?
下面看一下VGG-16的參數和內存使用情況:
VGG網路的一些細節是:
下面來看一下分類的第一名,GoogLeNet。
先說明 GoogLeNet 的一些細節:
「Inception」模塊 是一種設計的比較好的區域網拓撲結構,然後將這些模塊堆疊在一起。
這種拓撲結構對來自前一層的輸入,並行應用多種不同的濾波操作,比如1x1卷積、3x3卷積、5x5卷積和3x3池化。然後將所有濾波器的輸出在深度上串聯在一起。如下圖所示:
但是這種結構的一個問題是計算復雜度大大增加。比如考慮下面的網路設置:
輸入為28x28x256,而串聯後的輸出為28x28x672。(假設每個濾波操作都通過零填充保持輸入尺寸)並且運算花費也非常高:
由於池化操作會保持原輸入的深度,所以網路的輸出一定會增加深度。解決辦法是在進行卷積操作前添加一個「瓶頸層」,該層使用1x1卷積,目的是保留原輸入空間尺寸的同時,減小深度,只要卷積核的數量小於原輸入的深度即可。
使用這種結構,同樣的網路參數設置下,的確會減少計算量:
最終得到的輸出為28x28x480。此時總運算量為:
Inception mole堆疊成垂直結構,這里方便描述,將模型水平放置:
所以含參數的層總計3+18+1 = 22層。此外,橙色部分的層不計入總層數,這兩塊的結構都是:AveragePool 5x5+3(V) - Conv 1x1+1(S) - FC - FC - SoftmaxActivation - Output。「該相對較淺的網路在此分類任務上的強大表現表明,網路中間層產生的特徵應該是非常有區別性的。 通過添加連接到這些中間層的輔助分類器,我們期望在分類器的較低階段中鼓勵區分,增加回傳的梯度信號,並提供額外的正則化。 這些輔助分類器採用較小的卷積核,置於第三和第六個Inception mole的輸出之上。 在訓練期間,它們的損失會加到折扣權重的網路總損失中(輔助分類的損失加權為0.3)。 在預測時,這些輔助網路被丟棄。」——引自原論文
從2015年開始,網路的層數爆發式的增長,15-17年的冠軍都是有152層,開始了「深度革命」!
ResNet 是一種非常深的網路,使用了殘差連接。細節是:
表現這么好的ResNet僅僅是因為深嗎?答案是否定的,研究表明一個56層的卷積層堆疊網路訓練誤差和測試誤差都比一個20層的網路要大,並且不是過擬合的原因,而是更深的網路優化更難。但是一個更深的模型至少能和一個較淺的模型表現一樣好,如果想把一個較淺的層變成較深的層,可以用下面的方式來構建:將原來比較淺的層拷貝到較深的層中,然後添加一些等於本身的映射層。現在較深的模型可以更好的學習。
ResNet通過使用多個有參層來學習輸入與輸入輸出之間的 殘差映射( resial mapping ) ,而非像一般CNN網路(如AlexNet/VGG等)那樣使用有參層來直接學習輸入輸出之間的 底層映射( underlying mapping) 。
若將輸入設為X,將某一有參網路層映射設為H,那麼以X為輸入的該層的輸出將為H(X)。通常的CNN網路會直接通過訓練學習出參數函數H的表達式,從而直接得到 X 到 H(X) 的映射。而 殘差學習 則是致力於使用多個有參網路層來學習輸入到輸入、輸出間的殘差(H(X) - X)的映射,即學習 X -> (H(X) - X) ,然後加上X的 自身映射(identity mapping) 。也就是說網路的輸出仍然是 H(X) - X + X = H(X),只是學習的只是 (H(X) - X),X部分直接是本身映射。
殘差學習單元通過本身映射的引入在輸入、輸出之間建立了一條直接的關聯通道,從而使得強大的有參層集中精力學習輸入、輸出之間的殘差。一般我們用 來表示殘差映射,那麼殘差學習單元的輸出即為: 。當輸入、輸出通道數相同時,自然可以直接使用 X 進行相加。而當它們之間的通道數目不同時,我們就需要考慮建立一種有效的自身映射函數從而可以使得處理後的輸入 X 與輸出 Y 的通道數目相同即 。
當X與Y通道數目不同時,有兩種自身映射方式。一種是簡單地將X相對Y缺失的通道直接補零從而使其能夠相對齊,另一種則是通過使用1x1的卷積來表示 Ws 映射從而使得最終輸入與輸出的通道一致。
實驗表明使用一般意義上的有參層來直接學習殘差比直接學習輸入、輸出間映射要容易得多(收斂速度更快),也有效得多(可通過使用更多的層來達到更高的分類精度)。比如在極端情況下,如果自身映射是最優的,那麼將殘差設為零比通過使用一堆非線性層進行自身映射更容易。
完整的網路結構如下:
對於ResNet-50+的網路,為提高計算效率,使用類似GoogLeNet的「瓶頸層」。像Inception模塊那樣通過使用1x1卷積來巧妙地縮減或擴張特徵圖維度從而使得3x3 卷積的卷積核數目不受上一層輸入的影響,它的輸出也不會影響到下一層。不過它純是為了節省計算時間進而縮小整個模型訓練所需的時間而設計的,對最終的模型精度並無影響。
ResNet的實際訓練如下:
實際的訓練效果為可以堆疊很多的層而不使准確率下降:152在ImageNet上, 1202層在CIFAR上。現在和預想中的一致,網路越深,訓練准確率越高。橫掃了2015年所有的獎項,第一次超過人類的識別率。
下面左圖通過Top1准確率來比較各種網路的准確性;右圖是不同網路的運算復雜度,橫軸為計算量,圓圈大小表示內存佔用。其中 Inception-v4是 Resnet + Inception。
圖中可以看出:
還可以比較前向傳播時間和功率消耗:
2. 34-卷積神經網路(Conv)
深度學習網路和普通神經網路的區別
全連接神經網路的缺點
卷積神經網路的錯誤率
卷積神經網路的發展歷程
卷積神經網路的結構
結構特點:
神經網路(neural networks)的基本組成包括輸入層、隱藏層、輸出層。而卷積神經網路的特點在於隱藏層分為卷積層和池化層(pooling layer,又叫下采樣層)。
卷積過程
糾正:卷積層的過濾器,就是一個矩陣,裡面的元素是對應掃描時每個像素點的權重
即:每個過濾器會產生一張feature map
0填充的兩種方式
卷積核在提取特徵映射時的動作稱之為padding(零填充),由於移動步長不一定能整出整張圖的像素寬度。其中有兩種方式,SAME和VALID
彩色圖片的卷積過程
由於彩色圖片有3個通道,即3張表,所以filter需要分3次去分別觀察,每次觀察的結果直接相加作為最後的結果
過濾器的個數
有幾個過濾器,就會生成幾張表。eg:
對於[28, 28, 1]的圖片,如果有32個過濾器,就會卷積的結果就為[28, 28, 32],相當於圖片被「拉長」了
觀察結果大小的計算
面試可能考
注意:如果計算結果出現小數,需要結合情況具體考慮,而不是說直接四捨五入
卷積的api
在卷積神經網路中,主要使用Relu函數作為激活函數
即在這里使用relu函數去掉了像素中小於0的值
神經網路中為什麼要使用激活函數
為什麼使用relu而不再使用sigmoid函數?
api
卷積就是進行特徵的提取,觀察更加仔細,然而,觀察仔細就意味著數據多,運算量增加,這就需要使用池化層以減少計算量
Pooling層主要的作用是特徵提取,通過去掉Feature Map中不重要的樣本,進一步減少參數數量。Pooling的方法很鄭扒多,最常用的是Max Pooling。
池化層也有一個窗口大小(過濾器)
即:池化過程遲叢洞讓圖片變得更「窄」
即:卷積層使得圖片變長,池化層使得圖片變窄,所以經過卷積,圖片越來越「細長」
api
池化中SAME的計算方式與卷積過程中SAME的計算方式一樣。eg:
[None, 28, 28, 32]的數據,經過2x2,步長為2,padding為SAME的池化,碼枯變成了[None, 14, 14, 32]
分析:前面的卷積和池化相當於做特徵工程,後面的全連接相當於做特徵加權。最後的全連接層在整個卷積神經網路中起到「分類器」的作用。
所以神經網路也相當於是一個特徵選擇的方式
3. 卷積神經網路的 卷積層、激活層、池化層、全連接層
數據輸入的是一張圖片(輸入層),CONV表示卷積層,RELU表示激勵層,POOL表示池化層,Fc表示全連接層
全連接神經網路需要非常多的計算資源才能支撐它來做反向傳播和前向傳播,所以說全連接神經網路可以存儲非常多的參數,如果你給它的樣本如果沒有達到它的量級的時候,它可以輕輕鬆鬆把你給他的樣本全部都記下來,這會出現過擬合的情況。
所以我們應該把神經元和神經元之間的連接的權重個數降下來,但是降下來我們又不能保證它有較強的學習能力,所以這是一個糾結的地方,所以有一個方法就是 局部連接+權值共享 ,局部連接+權值共享不僅權重參數降下來了,而且學習能力並沒有實質的降低,除此之外還有其它的好處,下來看一下,下面的這幾張圖片:
一個圖像的不同表示方式
這幾張圖片描述的都是一個東西,但是有的大有的小,有的靠左邊,有的靠右邊,有的位置不同,但是我們構建的網路識別這些東西的時候應該是同一結果。為了能夠達到這個目的,我們可以讓圖片的不同位置具有相同的權重(權值共享),也就是上面所有的圖片,我們只需要在訓練集中放一張,我們的神經網路就可以識別出上面所有的,這也是 權值共享 的好處。
而卷積神經網路就是局部連接+權值共享的神經網路。
現在我們對卷積神經網路有一個初步認識了,下面具體來講解一下卷積神經網路,卷積神經網路依舊是層級結構,但層的功能和形式做了改變,卷積神經網路常用來處理圖片數據,比如識別一輛汽車:
在圖片輸出到神經網路之前,常常先進行圖像處理,有 三種 常見的圖像的處理方式:
均值化和歸一化
去相關和白化
圖片有一個性質叫做局部關聯性質,一個圖片的像素點影響最大的是它周邊的像素點,而距離這個像素點比較遠的像素點二者之間關系不大。這個性質意味著每一個神經元我們不用處理全局的圖片了(和上一層全連接),我們的每一個神經元只需要和上一層局部連接,相當於每一個神經元掃描一小區域,然後許多神經元(這些神經元權值共享)合起來就相當於掃描了全局,這樣就構成一個特徵圖,n個特徵圖就提取了這個圖片的n維特徵,每個特徵圖是由很多神經元來完成的。
在卷積神經網路中,我們先選擇一個局部區域(filter),用這個局部區域(filter)去掃描整張圖片。 局部區域所圈起來的所有節點會被連接到下一層的 一個節點上 。我們拿灰度圖(只有一維)來舉例:
局部區域
圖片是矩陣式的,將這些以矩陣排列的節點展成了向量。就能更好的看出來卷積層和輸入層之間的連接,並不是全連接的,我們將上圖中的紅色方框稱為filter,它是2*2的,這是它的尺寸,這不是固定的,我們可以指定它的尺寸。
我們可以看出來當前filter是2*2的小窗口,這個小窗口會將圖片矩陣從左上角滑到右下角,每滑一次就會一下子圈起來四個,連接到下一層的一個神經元,然後產生四個權重,這四個權重(w1、w2、w3、w4)構成的矩陣就叫做卷積核。
卷積核是演算法自己學習得到的,它會和上一層計算,比如,第二層的0節點的數值就是局部區域的線性組合(w1 0+w2 1+w3 4+w4 5),即被圈中節點的數值乘以對應的權重後相加。
卷積核計算
卷積操作
我們前面說過圖片不用向量表示是為了保留圖片平面結構的信息。 同樣的,卷積後的輸出若用上圖的向量排列方式則丟失了平面結構信息。 所以我們依然用矩陣的方式排列它們,就得到了下圖所展示的連接,每一個藍色結點連接四個黃色的結點。
卷積層的連接方式
圖片是一個矩陣然後卷積神經網路的下一層也是一個矩陣,我們用一個卷積核從圖片矩陣左上角到右下角滑動,每滑動一次,當然被圈起來的神經元們就會連接下一層的一個神經元,形成參數矩陣這個就是卷積核,每次滑動雖然圈起來的神經元不同,連接下一層的神經元也不同,但是產生的參數矩陣確是一樣的,這就是 權值共享 。
卷積核會和掃描的圖片的那個局部矩陣作用產生一個值,比如第一次的時候,(w1 0+w2 1+w3 4+w4 5),所以,filter從左上到右下的這個過程中會得到一個矩陣(這就是下一層也是一個矩陣的原因),具體過程如下所示:
卷積計算過程
上圖中左邊是圖矩陣,我們使用的filter的大小是3 3的,第一次滑動的時候,卷積核和圖片矩陣作用(1 1+1 0+1 1+0 0+1 1+1 0+0 1+0 0+1 1)=4,會產生一個值,這個值就是右邊矩陣的第一個值,filter滑動9次之後,會產生9個值,也就是說下一層有9個神經元,這9個神經元產生的值就構成了一個矩陣,這矩陣叫做特徵圖,表示image的某一維度的特徵,當然具體哪一維度可能並不知道,可能是這個圖像的顏色,也有可能是這個圖像的輪廓等等。
單通道圖片總結 :以上就是單通道的圖片的卷積處理,圖片是一個矩陣,我們用指定大小的卷積核從左上角到右下角來滑動,每次滑動所圈起來的結點會和下一層的一個結點相連,連接之後就會形成局部連接,每一條連接都會產生權重,這些權重就是卷積核,所以每次滑動都會產生一個卷積核,因為權值共享,所以這些卷積核都是一樣的。卷積核會不斷和當時卷積核所圈起來的局部矩陣作用,每次產生的值就是下一層結點的值了,這樣多次產生的值組合起來就是一個特徵圖,表示某一維度的特徵。也就是從左上滑動到右下這一過程中會形成一個特徵圖矩陣(共享一個卷積核),再從左上滑動到右下又會形成另一個特徵圖矩陣(共享另一個卷積核),這些特徵圖都是表示特徵的某一維度。
三個通道的圖片如何進行卷積操作?
至此我們應該已經知道了單通道的灰度圖是如何處理的,實際上我們的圖片都是RGB的圖像,有三個通道,那麼此時圖像是如何卷積的呢?
彩色圖像
filter窗口滑的時候,我們只是從width和height的角度來滑動的,並沒有考慮depth,所以每滑動一次實際上是產生一個卷積核,共享這一個卷積核,而現在depth=3了,所以每滑動一次實際上產生了具有三個通道的卷積核(它們分別作用於輸入圖片的藍色、綠色、紅色通道),卷積核的一個通道核藍色的矩陣作用產生一個值,另一個和綠色的矩陣作用產生一個值,最後一個和紅色的矩陣作用產生一個值,然後這些值加起來就是下一層結點的值,結果也是一個矩陣,也就是一張特徵圖。
三通道的計算過程
要想有多張特徵圖的話,我們可以再用新的卷積核來進行左上到右下的滑動,這樣就會形成 新的特徵圖 。
三通道圖片的卷積過程
也就是說增加一個卷積核,就會產生一個特徵圖,總的來說就是輸入圖片有多少通道,我們的卷積核就需要對應多少通道,而本層中卷積核有多少個,就會產生多少個特徵圖。這樣卷積後輸出可以作為新的輸入送入另一個卷積層中處理,有幾個特徵圖那麼depth就是幾,那麼下一層的每一個特徵圖就得用相應的通道的卷積核來對應處理,這個邏輯要清楚,我們需要先了解一下 基本的概念:
卷積計算的公式
4x4的圖片在邊緣Zero padding一圈後,再用3x3的filter卷積後,得到的Feature Map尺寸依然是4x4不變。
填充
當然也可以使用5x5的filte和2的zero padding可以保持圖片的原始尺寸,3x3的filter考慮到了像素與其距離為1以內的所有其他像素的關系,而5x5則是考慮像素與其距離為2以內的所有其他像素的關系。
規律: Feature Map的尺寸等於
(input_size + 2 * padding_size − filter_size)/stride+1
我們可以把卷積層的作用 總結一點: 卷積層其實就是在提取特徵,卷積層中最重要的是卷積核(訓練出來的),不同的卷積核可以探測特定的形狀、顏色、對比度等,然後特徵圖保持了抓取後的空間結構,所以不同卷積核對應的特徵圖表示某一維度的特徵,具體什麼特徵可能我們並不知道。特徵圖作為輸入再被卷積的話,可以則可以由此探測到"更大"的形狀概念,也就是說隨著卷積神經網路層數的增加,特徵提取的越來越具體化。
激勵層的作用可以理解為把卷積層的結果做 非線性映射 。
激勵層
上圖中的f表示激勵函數,常用的激勵函數幾下幾種:
常用的激勵函數
我們先來看一下激勵函數Sigmoid導數最小為0,最大為1/4,
激勵函數Sigmoid
Tanh激活函數:和sigmoid相似,它會關於x軸上下對應,不至於朝某一方面偏向
Tanh激活函數
ReLU激活函數(修正線性單元):收斂快,求梯度快,但較脆弱,左邊的梯度為0
ReLU激活函數
Leaky ReLU激活函數:不會飽和或者掛掉,計算也很快,但是計算量比較大
Leaky ReLU激活函數
一些激勵函數的使用技巧 :一般不要用sigmoid,首先試RELU,因為快,但要小心點,如果RELU失效,請用Leaky ReLU,某些情況下tanh倒是有不錯的結果。
這就是卷積神經網路的激勵層,它就是將卷積層的線性計算的結果進行了非線性映射。可以從下面的圖中理解。它展示的是將非線性操作應用到一個特徵圖中。這里的輸出特徵圖也可以看作是"修正"過的特徵圖。如下所示:
非線性操作
池化層:降低了各個特徵圖的維度,但可以保持大分重要的信息。池化層夾在連續的卷積層中間,壓縮數據和參數的量,減小過擬合,池化層並沒有參數,它只不過是把上層給它的結果做了一個下采樣(數據壓縮)。下采樣有 兩種 常用的方式:
Max pooling :選取最大的,我們定義一個空間鄰域(比如,2x2 的窗口),並從窗口內的修正特徵圖中取出最大的元素,最大池化被證明效果更好一些。
Average pooling :平均的,我們定義一個空間鄰域(比如,2x2 的窗口),並從窗口內的修正特徵圖算出平均值
Max pooling
我們要注意一點的是:pooling在不同的depth上是分開執行的,也就是depth=5的話,pooling進行5次,產生5個池化後的矩陣,池化不需要參數控制。池化操作是分開應用到各個特徵圖的,我們可以從五個輸入圖中得到五個輸出圖。
池化操作
無論是max pool還是average pool都有分信息被舍棄,那麼部分信息被舍棄後會損壞識別結果嗎?
因為卷積後的Feature Map中有對於識別物體不必要的冗餘信息,我們下采樣就是為了去掉這些冗餘信息,所以並不會損壞識別結果。
我們來看一下卷積之後的冗餘信息是怎麼產生的?
我們知道卷積核就是為了找到特定維度的信息,比如說某個形狀,但是圖像中並不會任何地方都出現這個形狀,但卷積核在卷積過程中沒有出現特定形狀的圖片位置卷積也會產生一個值,但是這個值的意義就不是很大了,所以我們使用池化層的作用,將這個值去掉的話,自然也不會損害識別結果了。
比如下圖中,假如卷積核探測"橫折"這個形狀。 卷積後得到3x3的Feature Map中,真正有用的就是數字為3的那個節點,其餘數值對於這個任務而言都是無關的。 所以用3x3的Max pooling後,並沒有對"橫折"的探測產生影響。 試想在這里例子中如果不使用Max pooling,而讓網路自己去學習。 網路也會去學習與Max pooling近似效果的權重。因為是近似效果,增加了更多的參數的代價,卻還不如直接進行最大池化處理。
最大池化處理
在全連接層中所有神經元都有權重連接,通常全連接層在卷積神經網路尾部。當前面卷積層抓取到足以用來識別圖片的特徵後,接下來的就是如何進行分類。 通常卷積網路的最後會將末端得到的長方體平攤成一個長長的向量,並送入全連接層配合輸出層進行分類。比如,在下面圖中我們進行的圖像分類為四分類問題,所以卷積神經網路的輸出層就會有四個神經元。
四分類問題
我們從卷積神經網路的輸入層、卷積層、激活層、池化層以及全連接層來講解卷積神經網路,我們可以認為全連接層之間的在做特徵提取,而全連接層在做分類,這就是卷積神經網路的核心。
4. 卷積神經網路的輸出能夠是一個具體的值嗎
可以的。
因為卷積神經網路最後的輸出是全連接層,所以它的輸出可以是一個值也可以是一組向量。
卷積神經網路(ConvolutionalNeuralNetwork,CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋范圍內的周圍單元。