❶ 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。
圖中可以看出:
還可以比較前向傳播時間和功率消耗:
❷ 卷積神經網路
卷積神經網路 (Convolutional Neural Networks,CNN)是一種前饋神經網路。卷積神經網路是受生物學上感受野(Receptive Field)的機制而提出的。感受野主要是指聽覺系統、本體感覺系統和視覺系統中神經元的一些性質。比如在視覺神經系統中,一個神經元的感受野是指視網膜上的特定區域,只有這個區域內的刺激才能夠激活該神經元。
卷積神經網路又是怎樣解決這個問題的呢?主要有三個思路:
在使用CNN提取特徵時,到底使用哪一層的輸出作為最後的特徵呢?
答:倒數第二個全連接層的輸出才是最後我們要提取的特徵,也就是最後一個全連接層的輸入才是我們需要的特徵。
全連接層會忽視形狀。卷積層可以保持形狀不變。當輸入數據是圖像時,卷積層會以3維數據的形式接收輸入數據,並同樣以3維數據的形式輸出至下一層。因此,在CNN中,可以(有可能)正確理解圖像等具有形狀的數據。
CNN中,有時將 卷積層的輸入輸出數據稱為特徵圖(feature map) 。其中, 卷積層的輸入數據稱為輸入特徵圖(input feature map) , 輸出數據稱為輸出特徵圖(output feature map)。
卷積層進行的處理就是 卷積運算 。卷積運算相當於圖像處理中的「濾波器運算」。
濾波器相當於權重或者參數,濾波器數值都是學習出來的。 卷積層實現的是垂直邊緣檢測 。
邊緣檢測實際就是將圖像由亮到暗進行區分,即邊緣的過渡(edge transitions)。
卷積層對應到全連接層,左上角經過濾波器,得到的3,相當於一個神經元輸出為3.然後相當於,我們把輸入矩陣拉直為36個數據,但是我們只對其中的9個數據賦予了權重。
步幅為1 ,移動一個,得到一個1,相當於另一個神經單元的輸出是1.
並且使用的是同一個濾波器,對應到全連接層,就是權值共享。
在這個例子中,輸入數據是有高長方向的形狀的數據,濾波器也一樣,有高長方向上的維度。假設用(height, width)表示數據和濾波器的形狀,則在本例中,輸入大小是(4, 4),濾波器大小是(3, 3),輸出大小是(2, 2)。另外,有的文獻中也會用「核」這個詞來表示這里所說的「濾波器」。
對於輸入數據,卷積運算以一定間隔滑動濾波器的窗口並應用。這里所說的窗口是指圖7-4中灰色的3 × 3的部分。如圖7-4所示,將各個位置上濾
波器的元素和輸入的對應元素相乘,然後再求和(有時將這個計算稱為乘積累加運算)。然後,將這個結果保存到輸出的對應位置。將這個過程在所有位置都進行一遍,就可以得到卷積運算的輸出。
CNN中,濾波器的參數就對應之前的權重。並且,CNN中也存在偏置。
在進行卷積層的處理之前,有時要向輸入數據的周圍填入固定的數據(比如0等),這稱為填充(padding),是卷積運算中經常會用到的處理。比如,在圖7-6的例子中,對大小為(4, 4)的輸入數據應用了幅度為1的填充。「幅度為1的填充」是指用幅度為1像素的0填充周圍。
應用濾波器的位置間隔稱為 步幅(stride) 。
假設輸入大小為(H, W),濾波器大小為(FH, FW),輸出大小為(OH, OW),填充為P,步幅為S。
但是所設定的值必須使式(7.1)中的 和 分別可以除盡。當輸出大小無法除盡時(結果是小數時),需要採取報錯等對策。順便說一下,根據深度學習的框架的不同,當值無法除盡時,有時會向最接近的整數四捨五入,不進行報錯而繼續運行。
之前的卷積運算的例子都是以有高、長方向的2維形狀為對象的。但是,圖像是3維數據,除了高、長方向之外,還需要處理通道方向。
在3維數據的卷積運算中,輸入數據和濾波器的通道數要設為相同的值。
因此,作為4維數據,濾波器的權重數據要按(output_channel, input_channel, height, width)的順序書寫。比如,通道數為3、大小為5 × 5的濾
波器有20個時,可以寫成(20, 3, 5, 5)。
對於每個通道,均使用自己的權值矩陣進行處理,輸出時將多個通道所輸出的值進行加和即可。
卷積運算的批處理,需要將在各層間傳遞的數據保存為4維數據。具體地講,就是按(batch_num, channel, height, width)的順序保存數據。
這里需要注意的是,網路間傳遞的是4維數據,對這N個數據進行了卷積運算。也就是說,批處理將N次的處理匯總成了1次進行。
池化是縮小高、長方向上的空間的運算。比如,如圖7-14所示,進行將2 × 2的區域集約成1個元素的處理,縮小空間大小。
圖7-14的例子是按步幅2進行2 × 2的Max池化時的處理順序。「Max池化」是獲取最大值的運算,「2 × 2」表示目標區域的大小。如圖所示,從
2 × 2的區域中取出最大的元素。此外,這個例子中將步幅設為了2,所以2 × 2的窗口的移動間隔為2個元素。另外,一般來說,池化的窗口大小會和步幅設定成相同的值。比如,3 × 3的窗口的步幅會設為3,4 × 4的窗口的步幅會設為4等。
除了Max池化之外,還有Average池化等。相對於Max池化是從目標區域中取出最大值,Average池化則是計算目標區域的平均值。 在圖像識別領域,主要使用Max池化。 因此,本書中說到「池化層」時,指的是Max池化。
池化層的特徵
池化層有以下特徵。
沒有要學習的參數
池化層和卷積層不同,沒有要學習的參數。池化只是從目標區域中取最大值(或者平均值),所以不存在要學習的參數。
通道數不發生變化
經過池化運算,輸入數據和輸出數據的通道數不會發生變化。如圖7-15所示,計算是按通道獨立進行的。
對微小的位置變化具有魯棒性(健壯)
輸入數據發生微小偏差時,池化仍會返回相同的結果。因此,池化對輸入數據的微小偏差具有魯棒性。比如,3 × 3的池化的情況下,如圖
7-16所示,池化會吸收輸入數據的偏差(根據數據的不同,結果有可能不一致)。
經過卷積層和池化層之後,進行Flatten,然後丟到全連接前向傳播神經網路。
(找到一張圖片使得某個filter響應最大。相當於filter固定,未知的是輸入的圖片。)未知的是輸入的圖片???
k是第k個filter,x是我們要找的參數。?這里我不是很明白。我得理解應該是去尋找最具有代表性的特徵。
使用im2col來實現卷積層
卷積層的參數是需要學習的,但是池化層沒有參數需要學習。全連接層的參數需要訓練得到。
池化層不需要訓練參數。全連接層的參數最多。卷積核的個數逐漸增多。激活層的size,逐漸減少。
最大池化只是計算神經網路某一層的靜態屬性,沒有什麼需要學習的,它只是一個靜態屬性 。
像這樣展開之後,只需對展開的矩陣求各行的最大值,並轉換為合適的形狀即可(圖7-22)。
參數
• input_dim ― 輸入數據的維度:( 通道,高,長 )
• conv_param ― 卷積層的超參數(字典)。字典的關鍵字如下:
filter_num ― 濾波器的數量
filter_size ― 濾波器的大小
stride ― 步幅
pad ― 填充
• hidden_size ― 隱藏層(全連接)的神經元數量
• output_size ― 輸出層(全連接)的神經元數量
• weitght_int_std ― 初始化時權重的標准差
LeNet
LeNet在1998年被提出,是進行手寫數字識別的網路。如圖7-27所示,它有連續的卷積層和池化層(正確地講,是只「抽選元素」的子采樣層),最後經全連接層輸出結果。
和「現在的CNN」相比,LeNet有幾個不同點。第一個不同點在於激活函數。LeNet中使用sigmoid函數,而現在的CNN中主要使用ReLU函數。
此外,原始的LeNet中使用子采樣(subsampling)縮小中間數據的大小,而現在的CNN中Max池化是主流。
AlexNet
在LeNet問世20多年後,AlexNet被發布出來。AlexNet是引發深度學習熱潮的導火線,不過它的網路結構和LeNet基本上沒有什麼不同,如圖7-28所示。
AlexNet疊有多個卷積層和池化層,最後經由全連接層輸出結果。雖然結構上AlexNet和LeNet沒有大的不同,但有以下幾點差異。
• 激活函數使用ReLU。
• 使用進行局部正規化的LRN(Local Response Normalization)層。
• 使用Dropout
TF2.0實現卷積神經網路
valid意味著不填充,same是填充
or the SAME padding, the output height and width are computed as:
out_height = ceil(float(in_height) / float(strides[1]))
out_width = ceil(float(in_width) / float(strides[2]))
And
For the VALID padding, the output height and width are computed as:
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
因此,我們可以設定 padding 策略。在 tf.keras.layers.Conv2D 中,當我們將 padding 參數設為 same 時,會將周圍缺少的部分使用 0 補齊,使得輸出的矩陣大小和輸入一致。
❸ 卷積神經網路(CNN)基礎
在七月初七情人節,牛郎織女相見的一天,我終於學習了CNN(來自CS231n),感覺感觸良多,所以趕快記下來,別忘了,最後祝大家情人節快樂5555555.正題開始!
CNN一共有卷積層(CONV)、ReLU層(ReLU)、池化層(Pooling)、全連接層(FC(Full Connection))下面是各個層的詳細解釋。
卷積,尤其是圖像的卷積,需要一個濾波器,用濾波器對整個圖像進行遍歷,我們假設有一個32*32*3的原始圖像A,濾波器的尺寸為5*5*3,用w表示,濾波器中的數據就是CNN的參數的一部分,那麼在使用濾波器w對A進行濾波的話,可以用下面的式子表示:
其中x為原始圖像的5*5*3的一部分,b是偏置項置為1。在對A進行濾波之後,產生的是一個28*28*1的數據。那麼假設我們存在6個濾波器,這六個濾波器之間彼此是獨立的,也就是他們內部的數據是不同的且沒有相關性的。可以理解為一個濾波器查找整幅圖像的垂直邊緣,一個查找水平邊緣,一個查找紅色,一個查找黑色這樣。那麼我就可以產生6個28*28*1的數據,將它們組合到一起就可以產生28*28*6的數據,這就是卷積層主要做的工作。
CNN可以看作一系列的卷積層和ReLU層對原始數據結構進行處理的神經網路,處理的過程可以用下面這幅圖表示
特別要注意的是濾波器的深度一定要與上一層傳來的數據的深度相同,就像上圖的第二個卷積層在處理傳來的28*28*6的數據時要使用5*5*6的濾波器.
濾波器在圖像上不斷移動對圖像濾波,自然存在步長的問題,在上面我們舉的例子都是步長為1的情況,如果步長為3的話,32*32*3的圖像經過5*5*3的濾波器卷積得到的大小是(32-5)/3+1=10, 註:步長不能為2因為(32-5)/2+1=14.5是小數。
所以當圖像大小是N,濾波器尺寸為F時,步長S,那麼卷積後大小為(N-F)/S+1
我們從上面的圖中可以看到圖像的長和寬在逐漸的減小,在經過超過5層之後極可能只剩下1*1的空間尺度,這樣是十分不好的,而且也不利於我們接下來的計算,所以我們想讓卷積層處理完之後圖像在空間尺度上大小不變,所以我們引入了pad the border的操作。pad其實就是在圖像周圍補0,擴大圖像的尺寸,使得卷積後圖像大小不變。在CNN中,主要存在4個超參數,濾波器個數K,濾波器大小F,pad大小P和步長S,其中P是整數,當P=1時,對原始數據的操作如圖所示:
那麼在pad操作後卷積後的圖像大小為:(N-F+2*P)/S+1
而要想讓卷積層處理後圖像空間尺度不變,P的值可以設為P=(F-1)/2
卷積層輸入W 1 *H 1 *D 1 大小的數據,輸出W 2 *H 2 *D 2 的數據,此時的卷積層共有4個超參數:
K:濾波器個數
P:pad屬性值
S:濾波器每次移動的步長
F:濾波器尺寸
此時輸出的大小可以用輸入和超參計算得到:
W 2 =(W 1 -F+2P)/S+1
H 2 =(H 1 -F+2P)/S+1
D 2 =D 1
1*1的濾波器也是有意義的,它在深度方向做卷積,例如1*1*64的濾波器對56*56*64的數據卷積得到56*56的數據
F通常是奇數,這樣可以綜合考慮上下左右四個方向的數據。
卷積層從神經元的角度看待可以有兩個性質: 參數共享和局域連接 。對待一個濾波器,例如5*5*3的一個濾波器,對32*32*3的數據卷積得到28*28的數據,可以看作存在28*28個神經元,每個對原圖像5*5*3的區域進行計算,這28*28個神經元由於使用同一個濾波器,所以參數相同,我們稱這一特性為 參數共享 。
針對不同的濾波器,我們可以看到他們會看到同一區域的圖像,相當於在深度方向存在多個神經元,他們看著相同區域叫做 局域連接
參數共享減少了參數的數量,防止了過擬合
局域連接為查找不同特徵更豐富的表現圖像提供了可能。
卷積就像是對原圖像的另一種表達。
激活函數,對於每一個維度經過ReLU函數輸出即可。不改變數據的空間尺度。
通過pad操作,輸出圖像在控制項上並沒有變化,但是深度發生了變化,越來越龐大的數據給計算帶來了困難,也出現了冗餘的特徵,所以需要進行池化操作,池化不改變深度,只改變長寬,主要有最大值和均值兩種方法,一般的池化濾波器大小F為2步長為2,對於最大值池化可以用下面的圖像清晰的表示:
卷積層輸入W 1 *H 1 *D 1 大小的數據,輸出W 2 *H 2 *D 2 的數據,此時的卷積層共有2個超參數:
S:濾波器每次移動的步長
F:濾波器尺寸
此時輸出的大小可以用輸入和超參計算得到:
W 2 =(W 1 -F)/S+1
H 2 =(H 1 -F)/S+1
D 2 =D 1
將最後一層(CONV、ReLU或Pool)處理後的數據輸入全連接層,對於W 2 *H 2 *D 2 數據,我們將其展成1*1*W 2 *H 2 *D 2 大小的數據,輸入層共有W 2 *H 2 *D 2 個神經元,最後根據問題確定輸出層的規模,輸出層可以用softmax表示。也就是說,全連接層就是一個常見的BP神經網路。而這個網路也是參數最多的部分,是接下來想要去掉的部分。完整的神經網路可以用下面的圖表示:
[(CONV-ReLU)*N-POOL?]*M-(FC-RELU)*K,SoftMax
1.更小的濾波器與更深的網路
2.只有CONV層而去掉池化與全鏈接
最早的CNN,用於識別郵編,結構為:
CONV-POOL-CONV-POOL-CONV-FC
濾波器大小5*5,步長為1,池化層2*2,步長為2
2012年由於GPU技術所限,原始AlexNet為兩個GPU分開計算,這里介紹合起來的結構。
輸入圖像為227*227*3
1.首次使用ReLU
2.使用Norm layers,現在已經拋棄,因為效果不大
3.數據經過預處理(例如大小變化,顏色變化等)
4.失活比率0.5
5.batch size 128
6.SGD Momentum 參數0.9(SGD和Momentum見我的其他文章)
7.學習速率 0.01,准確率不在提升時減少10倍,1-2次後達到收斂
8.L2權重減少0.0005
9.錯誤率15.4%
改進自AlexNet,主要改變:
1.CONV1的濾波器從11*11步長S=4改為7*7步長為2.
2.CONV3,4,5濾波器數量有384,384,256改為512,1024,512(濾波器數量為2的n次冪有利於計算機計算可以提高效率)
錯誤率:14.8%後繼續改進至11.2%
當前最好的最易用的CNN網路,所有卷積層濾波器的大小均為3*3,步長為1,pad=1,池化層為2*2的最大值池化,S=2。
主要參數來自全連接層,這也是想要去掉FC的原因。
具有高度的統一性和線性的組合,易於理解,十分方便有VGG-16,VGG-19等多種結構。
錯誤率7.3%
完全移除FC層,參數只有500萬,使用Inception模塊(不太理解,有時間繼續看)
准確率6.67%
准確率3.6%
擁有極深的網路結構,且越深准確率越高。是傳統CNN不具備的特點,傳統CNN並非越深越准確。需要訓練時間較長但是快於VGG
1.每個卷積層使用Batch Normalization
2.Xavier/2初始化
3.SGD+Momentum(0.9)
4.Learning rate:0.1,准確率不變減小10倍(因為Batch Normalization所以比AlexNet大)
5.mini-batch size 256
6.Weight decay of 0.00001
7.不適用失活(因為Batch Normalization)
具體的梯度過程學完ResNet再說吧。
❹ 卷積神經網路
1、二維互相關運算
二維互相關(cross-correlation)運算的輸入是一個二維輸入數組和一個二維核(kernel)數組,輸出也是一個二維數組,其中核數組通常稱為卷積核或過濾器(filter)。卷積核的尺寸通常小於輸入數組,卷積核在輸入數組上滑動,在每個位置上,卷積核與該位置處的輸入子數組按元素相乘並求和,得到輸出數組中相應位置的元素。圖1展示了一個互相關運算的例子,陰影部分分別是輸入的第一個計算區域、核數組以及對應的輸出。
2、二維卷積層
卷積層得名於卷積運算,但卷積層中用到的並非卷積運算而是互相關運算。我們將核數組上下翻轉、左右翻轉,再與輸入數組做互相關運算,這一過程就是卷積運算。由於卷積層的核數組是可學習的,所以使用互相關運算與使用卷積運算並無本質區別。
二維卷積層將輸入和卷積核做互相關運算,並加上一個標量偏置來得到輸出。卷積層的模型參數包括卷積核和標量偏置。
3、特徵圖與感受野
二維卷積層輸出的二維數組可以看作是輸入在空間維度(寬和高)上某一級的表徵,也叫特徵圖(feature map)。影響元素x的前向計算的所有可能輸入區域(可能大於輸入的實際尺寸)叫做x的感受野(receptive field)。
以圖1為例,輸入中陰影部分的四個元素是輸出中陰影部分元素的感受野。我們將圖中形狀為2×2的輸出記為Y,將Y與另一個形狀為2×2的核數組做互相關運算,輸出單個元素z。那麼,z在Y上的感受野包括Y的全部四個元素,在輸入上的感受野包括其中全部9個元素。可見,我們可以通過更深的卷積神經網路使特徵圖中單個元素的感受野變得更加廣闊,從而捕捉輸入上更大尺寸的特徵。
4、填充和步幅
我們介紹卷積層的兩個超參數,即填充和步幅,它們可以對給定形狀的輸入和卷積核改變輸出形狀。
4.1 填充(padding)
是指在輸入高和寬的兩側填充元素(通常是0元素),圖2里我們在原輸入高和寬的兩側分別添加了值為0的元素。
如果原輸入的高和寬是 和 ,卷積核的高和寬是 和 ,在高的兩側一共填充 行,在寬的兩側一共填充 列,則輸出形狀為:
)
我們在卷積神經網路中使用奇數高寬的核,比如3×3,5×5的卷積核,對於高度(或寬度)為大小為2k+1的核,令步幅為1,在高(或寬)兩側選擇大小為k的填充,便可保持輸入與輸出尺寸相同。
4.2 步幅(stride)
在互相關運算中,卷積核在輸入數組上滑動,每次滑動的行數與列數即是步幅(stride)。此前我們使用的步幅都是1,圖3展示了在高上步幅為3、在寬上步幅為2的二維互相關運算。
一般來說,當高上步幅為 ,寬上步幅為 時,輸出形狀為:
如果 ,那麼輸出形狀將簡化為:
更進一步,如果輸入的高和寬能分別被高和寬上的步幅整除,那麼輸出形狀將是:(nh/sh)×(nw/sw)
當 時,我們稱填充為p;當 時,我們稱步幅為s。
5、多輸入通道和多輸出通道
之前的輸入和輸出都是二維數組,但真實數據的維度經常更高。例如,彩色圖像在高和寬2個維度外還有RGB(紅、綠、藍)3個顏色通道。假設彩色圖像的高和寬分別是h和w(像素),那麼它可以表示為一個3×h×w的多維數組,我們將大小為3的這一維稱為通道(channel)維。
5.1 多輸入通道
卷積層的輸入可以包含多個通道,圖4展示了一個含2個輸入通道的二維互相關計算的例子。
5.2 多輸出通道
卷積層的輸出也可以包含多個通道,設卷積核輸入通道數和輸出通道數分別為ci和co,高和寬分別為kh和kw。如果希望得到含多個通道的輸出,我們可以為每個輸出通道分別創建形狀為ci×kh×kw的核數組,將它們在輸出通道維上連結,卷積核的形狀即co×ci×kh×kw。
對於輸出通道的卷積核,我們提供這樣一種理解,一個ci×kh×kw的核數組可以提取某種局部特徵,但是輸入可能具有相當豐富的特徵,我們需要有多個這樣的ci×kh×kw的核數組,不同的核數組提取的是不同的特徵。
5.3 1x1卷積層
最後討論形狀為1×1的卷積核,我們通常稱這樣的卷積運算為1×1卷積,稱包含這種卷積核的卷積層為1×1卷積層。圖5展示了使用輸入通道數為3、輸出通道數為2的1×1卷積核的互相關計算。
1×1卷積核可在不改變高寬的情況下,調整通道數。1×1卷積核不識別高和寬維度上相鄰元素構成的模式,其主要計算發生在通道維上。假設我們將通道維當作特徵維,將高和寬維度上的元素當成數據樣本,那麼1×1卷積層的作用與全連接層等價。
6、卷積層與全連接層的對比
二維卷積層經常用於處理圖像,與此前的全連接層相比,它主要有兩個優勢:
一是全連接層把圖像展平成一個向量,在輸入圖像上相鄰的元素可能因為展平操作不再相鄰,網路難以捕捉局部信息。而卷積層的設計,天然地具有提取局部信息的能力。
二是卷積層的參數量更少。不考慮偏置的情況下,一個形狀為(ci,co,h,w)的卷積核的參數量是ci×co×h×w,與輸入圖像的寬高無關。假如一個卷積層的輸入和輸出形狀分別是(c1,h1,w1)和(c2,h2,w2),如果要用全連接層進行連接,參數數量就是c1×c2×h1×w1×h2×w2。使用卷積層可以以較少的參數數量來處理更大的圖像。
X=torch.rand(4,2,3,5)
print(X.shape)
conv2d=nn.Conv2d(in_channels=2,out_channels=3,kernel_size=(3,5),stride=1,padding=(1,2))
Y=conv2d(X)
print('Y.shape: ',Y.shape)
print('weight.shape: ',conv2d.weight.shape)
print('bias.shape: ',conv2d.bias.shape)
輸出:
torch.Size([4, 2, 3, 5])
Y.shape: torch.Size([4, 3, 3, 5])
weight.shape: torch.Size([3, 2, 3, 5])
bias.shape: torch.Size([3])
7、池化
7.1 二維池化層
池化層主要用於緩解卷積層對位置的過度敏感性。同卷積層一樣,池化層每次對輸入數據的一個固定形狀窗口(又稱池化窗口)中的元素計算輸出,池化層直接計算池化窗口內元素的最大值或者平均值,該運算也分別叫做最大池化或平均池化。圖6展示了池化窗口形狀為2×2的最大池化。
二維平均池化的工作原理與二維最大池化類似,但將最大運算符替換成平均運算符。池化窗口形狀為p×q的池化層稱為p×q池化層,其中的池化運算叫作p×q池化。
池化層也可以在輸入的高和寬兩側填充並調整窗口的移動步幅來改變輸出形狀。池化層填充和步幅與卷積層填充和步幅的工作機制一樣。
在處理多通道輸入數據時,池化層對每個輸入通道分別池化,但不會像卷積層那樣將各通道的結果按通道相加。這意味著池化層的輸出通道數與輸入通道數相等。
CNN網路中另外一個不可導的環節就是Pooling池化操作,因為Pooling操作使得feature map的尺寸變化,假如做2×2的池化,假設那麼第l+1層的feature map有16個梯度,那麼第l層就會有64個梯度,這使得梯度無法對位的進行傳播下去。其實解決這個問題的思想也很簡單,就是把1個像素的梯度傳遞給4個像素,但是需要保證傳遞的loss(或者梯度)總和不變。根據這條原則,mean pooling和max pooling的反向傳播也是不同的。
7.2 mean pooling
mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那麼反向傳播的過程也就是把某個元素的梯度等分為n份分配給前一層,這樣就保證池化前後的梯度(殘差)之和保持不變,還是比較理解的,圖示如下:
mean pooling比較容易讓人理解錯的地方就是會簡單的認為直接把梯度復制N遍之後直接反向傳播回去,但是這樣會造成loss之和變為原來的N倍,網路是會產生梯度爆炸的。
7.3 max pooling
max pooling也要滿足梯度之和不變的原則,max pooling的前向傳播是把patch中最大的值傳遞給後一層,而其他像素的值直接被舍棄掉。那麼反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id。
源碼中有一個max_idx_的變數,這個變數就是記錄最大值所在位置的,因為在反向傳播中要用到,那麼假設前向傳播和反向傳播的過程就如下圖所示。
7.4 Pytorch 實現池化層
我們使用Pytorch中的nn.MaxPool2d實現最大池化層,關注以下構造函數參數:
kernel_size – the size of the window to take a max over
stride – the stride of the window. Default value is kernel_size
padding – implicit zero padding to be added on both sides
forward函數的參數為一個四維張量,形狀為 ,返回值也是一個四維張量,形狀為 ,其中N是批量大小,C,H,W分別表示通道數、高度、寬度。
X=torch.arange(32,dtype=torch.float32).view(1,2,4,4)
pool2d=nn.MaxPool2d(kernel_size=3,padding=1,stride=(2,1))
Y=pool2d(X)
print(X)
print(Y)
練習
1、假如你用全連接層處理一張256 \times 256256×256的彩色(RGB)圖像,輸出包含1000個神經元,在使用偏置的情況下,參數數量是:
答:圖像展平後長度為3×256×256,權重參數和偏置參數的數量是3× 256× 256 × 1000 + 1000 =196609000。
2、假如你用全連接層處理一張256×256的彩色(RGB)圖像,卷積核的高寬是3×3,輸出包含10個通道,在使用偏置的情況下,這個卷積層共有多少個參數:
答:輸入通道數是3,輸出通道數是10,所以參數數量是10×3×3×3+10=280。
3、conv2d = nn.Conv2d(in_channels=3, out_channels=4, kernel_size=3, padding=2),輸入一張形狀為3×100×100的圖像,輸出的形狀為:
答:輸出通道數是4,上下兩側總共填充4行,卷積核高度是3,所以輸出的高度是104 - 3 + 1=102104−3+1=102,寬度同理可得。
4、關於卷積層,以下哪種說法是錯誤的:
A.1×1卷積可以看作是通道維上的全連接
B.某個二維卷積層用於處理形狀為3×100×100的輸入,則該卷積層無法處理形狀為3×256×256的輸入
C.卷積層通過填充、步幅、輸入通道數、輸出通道數等調節輸出的形狀
D .兩個連續的3×3卷積核的感受野與一個5×5卷積核的感受野相同
答:選B,對於高寬維度,只要輸入的高寬(填充後的)大於或等於卷積核的高寬即可進行計算。
the first layer is a 3 × 3 convolution, the second is a fully connected layer on top of the 3 × 3 output grid of the first layer (see Figure 1). Sliding this small network over the input activation grid boils down to replacing the 5 × 5 convolution with two layers of 3 × 3 convolution.
我們假設圖片是5*5的
我們使用5*5的卷積核對其卷積,步長為1,得到的結果是:(5-5)/1+1=1
然後我們使用2個卷積核為3*3的,這里的兩個是指2層:
第一層3*3:
得到的結果是(5-3)/1+1=3
第二層3*3:
得到的結果是(3-3)/1+1=1
所以我們的最終得到結果感受野大小和用5*5的卷積核得到的結果大小是一樣的!!!
5、關於池化層,以下哪種說法是錯誤的:
A.池化層不參與反向傳播
B.池化層沒有模型參數
C.池化層通常會減小特徵圖的高和寬
D.池化層的輸入和輸出具有相同的通道數
答:A
選項1:錯誤,池化層有參與模型的正向計算,同樣也會參與反向傳播
選項2:正確,池化層直接對窗口內的元素求最大值或平均值,並沒有模型參數參與計算
選項3:正確
選項4:正確
參考文獻:
https://www.boyuai.com/
https://blog.csdn.net/qq_21578849/article/details/94667699
https://www.hu.com/question/265791259/answer/298610437
https://blog.csdn.net/zouxiaolv/article/details/97366681
❺ PART 4 W1 卷積神經網路介紹
一個是圖像分類:如貓臉識別等;一個是目標檢測:如無人駕駛技術中的各種交通信號檢測技術
1. 卷積操作及過濾器/卷積核的概念
如上圖所示:最左側矩陣是一個灰度圖像,中間是一個3*3的小矩陣,稱為「卷積核」或「過濾器」。
卷積:先把卷積核放到灰度圖像左上角(綠色框),蓋住灰度圖像上一個3*3的矩陣區域,然後9對對應的元素相乘,然後求和(得到0),然後把卷積核逐漸移動一行一行的「掃描」,最終得到最右側矩陣。上述操作叫做「卷積」,最右側矩陣是卷積的輸出。
2. 垂直邊緣檢測
仍以上圖為例,可以看到3*3的卷積核具體的數值構成為「左邊一列1,中間一列0,右邊一列-1」,這種卷積核在「掃描」灰度圖像時,可以檢測到灰度圖像的垂直邊緣。分析如下:
1)假設正在掃描的灰度區域沒有垂直邊緣,意味著區域內的值在左右方向上分布差不多,與卷積核做完運算後,左邊的乘1,右邊的乘-1,相加正好有一定的抵消作用,其實計算出來的結果會接近0。即:卷積結果接近0代表沒有邊緣。
2)有垂直邊緣分為兩種情況:目標區域「左邊值較大,右邊值較小」 或「左邊值較小,右邊值較大」。前一種情況在卷積操作後會得到一個較大的正值,後一種情況卷積操作後會得到一個較大的負值。
可以看出,較大的正值代表著目標區域的變化趨勢與卷積核相同,即檢測到的是與卷積核相同的邊緣,而較大的負值代表目標區域的變化趨勢與卷積核相反,即檢測到的是與卷積核相反的邊緣。
3. 卷積應用在卷積神經網路中
卷積操作如何應用於神經網路中?簡言之,卷積核本身就是網路要學習的參數。如上圖所示,我們並不是事先設定好要檢測垂直邊緣或水平邊緣或其它什麼邊緣,而是要網路去學習要檢測什麼東西。
1. padding的原因
在上節展示的卷積操作中,可以看出,假設輸入圖像的大小為n*n,而卷積核的大小為f*f,那麼卷積核從輸入圖像的左上角掃描到右下角,最終得到的結果大小為(n-f+1)*(n-f+1),意味著如果一次次進行卷積,那麼結果的尺寸會越來越小
另外,顯然輸入圖像邊緣的像素被使用的較少(最邊緣的像素僅被使用一次),這顯然會造成信息的丟失。
2. 如何進行padding
非常簡單:把輸入圖像的四周補充p = (f-1)/2 圈的0,這樣輸入的圖像尺寸變成了(n+2p)*(n+2p),因此卷積後的大小變成了(n+2p -f + 1)*(n+2p -f + 1)=n*n,即與原始的圖像有了相同的大小,且原始圖像邊緣的像素也被較多的利用到。
3. 幾點補充
(1)卷積核的尺寸設置為 奇數 :因為① 這樣(f-1)/2就恰好是整數了,方便進行padding,② 有中心像素,便於表徵卷積核的位置,等。
(2)根據是否進行padding,分為 普通卷積(valid) 和 同尺寸卷積(same)
1. 步長概念
在上文中講到卷積,即使用一個卷積核對輸入圖像進行「掃描」並進行相應計算時,提到這個「掃描」是逐個像素逐個像素的邁進的。但是,並不一定非得這樣,也可以每次跨越兩個或更多個像素,這就是「步長」的概念,一般用s表示
2. 卷積結果尺寸與步長的關系
前文提到,若輸入圖像尺寸為n*n,卷積核尺寸為f*f,則卷積結果尺寸為(n+f-1)*(n+f-1),若算上padding操作,則結果為(n+2p -f + 1)*(n+2p -f + 1)。這是在步長s=1的前提下成立。若步長不為1,則結果為floor((n+2p-f)/s+1)**2
3. 其它:數學中的卷積和神經網路中的卷積
需要說明的是,神經網路中所說的卷積和數學中說的卷積不是一回事,但數學中的卷積是啥就不追究了。
神經網路中的卷積操作,在數學的描述上,更像是一種「交叉相關性」的計算,可以看出,若目標區域與卷積核有類似的分布,則會計算出較大的正值(正相關),若有相反的分布,則會計算出較大的負值(負相關),若沒什麼關系,則會計算出接近0的值(不相關)。卷積操作的確很像一種相關性的計算。
1. RGB圖像的數學構成
灰度圖像是一個n*n的二維矩陣,彩色圖像則是n*n*3 的三維矩陣,最外圍的三個維度分別代表了RGB三原色的值,其中數字「3」在卷積神經網路中被稱為通道數或信道數
2. 對RGB圖像進行卷積
在對灰度圖像進行卷積時,使用的是f*f的二維卷積核。在對RGB圖像進行卷積時,則卷積核的維度也+1,變成了f*f*3。一次卷積的結果仍然是把所有的值加起來輸出一個值。即: 一個三維的圖像,和一個三維的卷積核,在進行完卷積操作後,輸出的是一個二維的矩陣(如上圖) 。
3. 當使用多個卷積核時的輸出
如上圖所示,可以使用多個卷積核(一個亮黃色,一個屎黃色)。根據前文描述,一個立體的卷積核在一個立體的矩陣上掃描完,結果是一個二維的。但當使用多個卷積核時,則輸出了多個二維矩陣,這些二維矩陣沿著第三個維度排列到一起,使得結果重新變成了三維。此時,第三個維度的尺寸,反應的是卷積核數,也就是說 卷積核數就是信道數 。直觀理解,每一個卷積核代表著檢測了某一種特徵,多個卷積核就是同時檢測了多種特徵,傳遞了多種信息。
1. 一個卷積層的數據的基本流
如上圖所示,由於卷積核本身就是一堆待學參數w,所以卷積操作本質還是「加權求和」,之後會加入偏置值,然後進行非線性變換,然後輸出(到下一層),可見還是那一套。
需要提一下的是,卷積的輸入不一定是原始圖像構成的矩陣,還有可能是上一個卷積的結果。原始圖像是彩色的,有多個通道。卷積時可以用多個卷積核,最終產生的結果也是立體的。因此原始的輸入與中間卷積層的輸出,在數學形式上是統一的。因此可以「輸入->卷積層->卷積層->...」這樣操作。
2. 卷積層的參數規模
一個卷積層總的參數規模(包括w,不包括b)為: ,即:卷積核的大小的平方*上層輸出的通道數)*本層所用的卷積核數。與上層輸入的大小無關(但與通道數有關)
3. 一個卷積層涉及到的超參
卷積核的大小、是否padding、步長、卷積核數。
1. 一個示例
上圖為一個簡單的卷積神經網路示例: 一層一層的卷積,最後把所有的元素展開成一個一維向量,然後加一個全連接層。
2. 注意以下幾點:
1⃣️ 實際上CNN會有卷積層、池化層、全連接層,而非僅有卷積和全連接;
2⃣️ 從數據的構成形式上看,按照網路從前往後的順序,圖片尺寸不斷減小,信道數量不斷增加。一般遵從這個趨勢。
1. 池化
如上圖所示,假設輸入是一個4*4的矩陣,現在我們把它分割成2*2四個子矩陣(或者說使用一個2*2的核以2為步長掃描矩陣),對四個子區域分別求最大值,最終得到一個值為9、2、6、3的2*2的矩陣輸出。這種操作就叫池化,具體為最大值池化。
2. 池化的作用
1⃣️ 一般來說,較大的值往往代表學到了一個重要或典型的特徵,把原始輸入以某種方式濾除掉一些不重要的值,只保留一些較大的值,相當於 強化了一些重要信息的表達 。2⃣️ 降低圖片的尺寸,可以節省空間、加速運算等。
3. 池化的特點
並沒有需要學習的參數(w、b之類的),也因此「池化層」一般並不被稱為單獨的一層。在卷積神經網路中,通常把一個卷積層+一個池化層的組合叫一層。
4. 池化的超參數及經驗值
池化層沒有要學習的參數,只有核心的兩個超參:池化核的大小、池化步長。此外還有池化所用的rece操作:最大或者平均(沒有其它選項)。
一般把池化核的大小設置為3或2,步長為2。注意:步長為2意味著把圖片減小到原來的一半。
rece操作最常用最大池化,偶爾用平均池化,不會用其它操作。
上圖為一個典型的卷積神經網路示例,描述如下:
輸入層 :彩色的手寫數字圖片,數學構成為32*32*3的矩陣,其中3為通道數。
Layer 1-卷積層 :1)使用6個5*5*3的卷積核,以步長為1對輸入層進行卷積,輸出28*28*6的矩陣,2)然後使用2*2的最大池化,步長為2,最終輸出14*14*6的矩陣。其中14為圖片尺寸,6為信道數。
Layer2-卷積層 :1)使用16個5*5*3的卷積核以步長1對上層輸出進行卷積,輸出10*10*16的矩陣,2)然後使用2*2的最大池化,步長為2,最終輸出5*5*16的矩陣。
Layer3-全連接層: 把上層輸出的5*5*16矩陣展開成1*400的一維向量,以120*400的權重矩陣送入本層120個神經元,激活後輸出。
Layer4-全連接層: 120->84,激活後輸出
輸出層 :84 -> 10,然後softmax後輸出。
1. 參數少
假如原始圖片尺寸為100*100*3,假設使用全連接,即使第二層僅用100個神經元,那也已經產生了100*100*3*100 = 300w個參數,難以想像。
假設使用卷積層,使用10個10*10*3的卷積核,那就是只有3000個參數,而能輸出的矩陣規模是91*91*10=81000
2. 參數少的原因
1)稀疏連接:卷積核掃描矩陣產生輸出,這個過程就從「神經元連接」的角度看,輸入的左上角只連著輸出的左上角,右上角只連右上角,而非「全連接」,參數就會少很多。2)參數共享:這么稀疏的連接,還是使用了同一套參數,進一步減少了參數的量。
3. 參數共享的其它好處
如果圖片上有一隻貓,那麼不管這個貓在圖片的什麼位置,都不改變「這是一張貓的照片」。使用參數共享時,相當於用同樣的特徵提取作用到整個圖片的各個區域,適應平移不變性,增強魯棒性。
❻ 卷積神經網路CNN(Convolutional Neural Network)
上圖計算過程為,首先我們可以將右邊進行卷積的可以稱為過濾器也可以叫做核,覆蓋到左邊第一個區域,然後分別按照對應位置相乘再相加,3*1+1*1+2*1+0*0+0*0+0*0+1*(-1)+8*(-1)+2*(-1)=-5;
按照上述的計算方法逐步按右移一個步長(步長可以設定為1,2,...等),然後按往下移,逐漸計算相應的值,得出最終的值。
如上圖顯示,對於第一個圖像矩陣對應的圖,一邊是白色,一邊是黑色,那麼中間就會存在一個垂直的邊緣,我們可以選擇一個垂直邊緣檢測過濾器,如乘法右邊的矩陣,那麼兩者做卷積後得出的圖會顯示如等號右邊的結果矩陣對應的灰度圖中間會有一個白色的中間帶,也就是檢測出來的邊緣,那為什麼感覺中間邊緣帶會比較寬呢?而不是很細的一個局域呢?原因是我們輸入的圖像只有6*6,過於小了,如果我們選擇輸出更大的尺寸的圖,那麼結果來說就是相對的一個細的邊緣檢測帶,也就將我們的垂直邊緣特徵提取出來了。
上述都是人工選擇過濾器的參數,隨著神經網路的發展我們可以利用反向傳播演算法來學習過濾器的參數
我們可以將卷積的顧慮器的數值變成一個參數,通過反向傳播演算法去學習,這樣學到的過濾器或者說卷積核就能夠識別到很多的特徵,而不是依靠手工選擇過濾器。
- padding 操作,卷積經常會出現兩個問題:
1.每經過一次卷積圖像都會縮小,如果卷積層很多的話,後面的圖像就縮的很小了;
2.邊緣像素利用次數只有一次,很明顯少於位於中間的像素,因此會損失邊緣圖像信息。
為了解決上述的問題,我們可以在圖像邊緣填充像素,也就是 padding 操作了。
如果我們設置在圖像邊緣填充的像素數為p,那麼經過卷積後的圖像是:(n+2p-f+1)x(n+2p-f+1).
如何去選擇p呢
通常有兩種選擇:
-Valid:也就是說不填充操作(no padding),因此如果我們有nxn的圖像,fxf的過濾器,那麼我們進行卷積nxn fxf=(n-f+1)x(n-f+1)的輸出圖像;
-Same:也就是填充後是輸出圖像的大小的與輸入相同,同樣就有(n+2p)x(n+2p) fxf=nxn,那麼可以算,n+2p-f+1=n,得到p=(f-1)/2。
通常對於過濾器的選擇有一個默認的准則就是選擇過濾器的尺寸是奇數的過濾器。
- 卷積步長設置(Strided COnvolution)
卷積步長也就是我們進行卷積操作時,過濾器每次移動的步長,上面我們介紹的卷積操作步長默認都是1,也就是說每次移動過濾器時我們是向右移動一格,或者向下移動一格。
但是我們可以對卷積進行步長的設置,也就是我們能夠對卷積移動的格數進行設置。同樣假如我們的圖像是nxn,過濾器是fxf,padding設置是p,步長strided設置為s,那麼我們進行卷積操作後輸出的圖像為((n+2p-f)/s+1)x((n+2p-f)/s+1),那麼這樣就會出現一個問題,如果計算結果不是整數怎麼辦?
一般是選擇向下取整,也就是說明,只有當我們的過濾器完全在圖像上能夠覆蓋時才對它進行計算,這是一個慣例。
實際上上述所述的操作在嚴格數學角度來說不是卷積的定義,卷積的定義上我們計算的時候在移動步長之前也就是對應元素相乘之前是需要對卷積核或者說我們的過濾器進行鏡像操作的,經過鏡像操作後再把對應元素進行相乘這才是嚴格意義上的卷積操作,在數學角度上來說這個操作不算嚴格的卷積操作應該是屬於互相關操作,但是在深度學習領域中,大家按照慣例都省略了反轉操作,也把這個操作叫做卷積操作
我們知道彩色圖像有RGB三個通道,因此對於輸入來說是一個三維的輸入,那麼對三維輸入的圖像如何進行卷積操作呢?
例子,如上圖我們輸入圖像假設為6×6×3,3代表有RGB三個通道channel,或者可以叫depth深度,過濾器的選擇為3×3×3,其中需要規定的是,顧慮器的channel必須與輸入圖像的channel相同,長寬沒有限制,那麼計算過程是,我們將過濾器的立體覆蓋在輸入,這樣對應的27個數對應相乘後相加得到一個數,對應到我們的輸出,因此這樣的方式進行卷積後我們得出的輸出層為4×4×1。如果我們有多個過濾器,比如我們分別用兩個過濾器一個提取垂直特徵,一個提取水平特徵,那麼輸出圖4×4×2 。也就是代表我們輸出的深度或者說通道與過濾器的個數是相等的。
第l層的卷積標記如下:
加入我們的過濾器是3×3×3規格的,如果我們設定10個過濾器,那麼需要學習的參數總數為每個過濾器為27個參數然後加上一個偏差bias那麼每個過濾器的參數為28個,所以十個過濾器的參數為280個。從這里也就可以看出,不管我們輸入的圖片大小是多大,我們都只需要計算這些參數,因此參數共享也就很容易理解了。
為了縮減模型的大小,提高計算速度,同時提高所提取特徵的魯棒性,我們經常會使用池化層。池化層的計算方式與卷積類似,只是我們需要對每一個通道都進行池化操作。
池化的方式一般有兩種:Max Pooling和Average Pooling。
上面為Max Pooling,那麼計算方法與卷積類似,首先設定超參數比如過濾器的大小與步長,然後覆蓋到對應格子上面,用最大值取代其值作為輸出的結果,例如上圖為過濾器選擇2×2,步長選擇為2,因此輸出就是2×2的維度,每個輸出格子都是過濾器對應維度上輸入的最大值。如果為平均池化,那麼就是選擇其間的平均值作為輸出的值。
因此從上面的過程我們看到,通過池化操作能夠縮小模型,同時能讓特徵值更加明顯,也就提高了提取特徵的魯棒性。
❼ 卷積神經網路
關於花書中卷積網路的筆記記錄於 https://www.jianshu.com/p/5a3c90ea0807 。
卷積神經網路(Convolutional Neural Network,CNN或ConvNet)是一種具有 局部連接、權重共享 等特性的深層前饋神經網路。卷積神經網路是受生物學上感受野的機制而提出。 感受野(Receptive Field) 主要是指聽覺、視覺等神經系統中一些神經元的特性,即 神經元只接受其所支配的刺激區域內的信號 。
卷積神經網路最早是主要用來處理圖像信息。如果用全連接前饋網路來處理圖像時,會存在以下兩個問題:
目前的卷積神經網路一般是由卷積層、匯聚層和全連接層交叉堆疊而成的前饋神經網路,使用反向傳播演算法進行訓練。 卷積神經網路有三個結構上的特性:局部連接,權重共享以及匯聚 。這些特性使卷積神經網路具有一定程度上的平移、縮放和旋轉不變性。
卷積(Convolution)是分析數學中一種重要的運算。在信號處理或圖像處理中,經常使用一維或二維卷積。
一維卷積經常用在信號處理中,用於計算信號的延遲累積。假設一個信號發生器每個時刻t 產生一個信號 ,其信息的衰減率為 ,即在 個時間步長後,信息為原來的 倍。假設 ,那麼在時刻t收到的信號 為當前時刻產生的信息和以前時刻延遲信息的疊加:
我們把 稱為 濾波器(Filter)或卷積核(Convolution Kernel) 。假設濾波器長度為 ,它和一個信號序列 的卷積為:
信號序列 和濾波器 的卷積定義為:
一般情況下濾波器的長度 遠小於信號序列長度 ,下圖給出一個一維卷積示例,濾波器為 :
二維卷積經常用在圖像處理中。因為圖像為一個兩維結構,所以需要將一維卷積進行擴展。給定一個圖像 和濾波器 ,其卷積為:
下圖給出一個二維卷積示例:
注意這里的卷積運算並不是在圖像中框定卷積核大小的方框並將各像素值與卷積核各個元素相乘並加和,而是先把卷積核旋轉180度,再做上述運算。
在圖像處理中,卷積經常作為特徵提取的有效方法。一幅圖像在經過卷積操作後得到結果稱為 特徵映射(Feature Map) 。
最上面的濾波器是常用的高斯濾波器,可以用來對圖像進行 平滑去噪 ;中間和最下面的過濾器可以用來 提取邊緣特徵 。
在機器學習和圖像處理領域,卷積的主要功能是在一個圖像(或某種特徵)上滑動一個卷積核(即濾波器),通過卷積操作得到一組新的特徵。在計算卷積的過程中,需要進行卷積核翻轉(即上文提到的旋轉180度)。 在具體實現上,一般會以互相關操作來代替卷積,從而會減少一些不必要的操作或開銷。
互相關(Cross-Correlation)是一個衡量兩個序列相關性的函數,通常是用滑動窗口的點積計算來實現 。給定一個圖像 和卷積核 ,它們的互相關為:
互相關和卷積的區別僅在於卷積核是否進行翻轉。因此互相關也可以稱為不翻轉卷積 。當卷積核是可學習的參數時,卷積和互相關是等價的。因此,為了實現上(或描述上)的方便起見,我們用互相關來代替卷積。事實上,很多深度學習工具中卷積操作其實都是互相關操作。
在卷積的標準定義基礎上,還可以引入濾波器的 滑動步長 和 零填充 來增加卷積多樣性,更靈活地進行特徵抽取。
濾波器的步長(Stride)是指濾波器在滑動時的時間間隔。
零填充(Zero Padding)是在輸入向量兩端進行補零。
假設卷積層的輸入神經元個數為 ,卷積大小為 ,步長為 ,神經元兩端各填補 個零,那麼該卷積層的神經元數量為 。
一般常用的卷積有以下三類:
因為卷積網路的訓練也是基於反向傳播演算法,因此我們重點關注卷積的導數性質:
假設 。
, , 。函數 為一個標量函數。
則由 有:
可以看出, 關於 的偏導數為 和 的卷積 :
同理得到:
當 或 時, ,即相當於對 進行 的零填充。從而 關於 的偏導數為 和 的寬卷積 。
用互相關的「卷積」表示,即為(注意 寬卷積運算具有交換性性質 ):
在全連接前饋神經網路中,如果第 層有 個神經元,第 層有 個神經元,連接邊有 個,也就是權重矩陣有 個參數。當 和 都很大時,權重矩陣的參數非常多,訓練的效率會非常低。
如果採用卷積來代替全連接,第 層的凈輸入 為第 層活性值 和濾波器 的卷積,即:
根據卷積的定義,卷積層有兩個很重要的性質:
由於局部連接和權重共享,卷積層的參數只有一個m維的權重 和1維的偏置 ,共 個參數。參數個數和神經元的數量無關。此外,第 層的神經元個數不是任意選擇的,而是滿足 。
卷積層的作用是提取一個局部區域的特徵,不同的卷積核相當於不同的特徵提取器。
特徵映射(Feature Map)為一幅圖像(或其它特徵映射)在經過卷積提取到的特徵,每個特徵映射可以作為一類抽取的圖像特徵。 為了提高卷積網路的表示能力,可以在每一層使用多個不同的特徵映射,以更好地表示圖像的特徵。
在輸入層,特徵映射就是圖像本身。如果是灰度圖像,就是有一個特徵映射,深度 ;如果是彩色圖像,分別有RGB三個顏色通道的特徵映射,深度 。
不失一般性,假設一個卷積層的結構如下:
為了計算輸出特徵映射 ,用卷積核 分別對輸入特徵映射 進行卷積,然後將卷積結果相加,並加上一個標量偏置 得到卷積層的凈輸入 再經過非線性激活函數後得到輸出特徵映射 。
在輸入為 ,輸出為 的卷積層中,每個輸出特徵映射都需要 個濾波器以及一個偏置。假設每個濾波器的大小為 ,那麼共需要 個參數。
匯聚層(Pooling Layer)也叫子采樣層(Subsampling Layer),其作用是進行特徵選擇,降低特徵數量,並從而減少參數數量。
常用的匯聚函數有兩種:
其中 為區域 內每個神經元的激活值。
可以看出,匯聚層不但可以有效地減少神經元的數量,還可以使得網路對一些小的局部形態改變保持不變性,並擁有更大的感受野。
典型的匯聚層是將每個特徵映射劃分為 大小的不重疊區域,然後使用最大匯聚的方式進行下采樣。匯聚層也可以看做是一個特殊的卷積層,卷積核大小為 ,步長為 ,卷積核為 函數或 函數。過大的采樣區域會急劇減少神經元的數量,會造成過多的信息損失。
一個典型的卷積網路是由卷積層、匯聚層、全連接層交叉堆疊而成。
目前常用卷積網路結構如圖所示,一個卷積塊為連續 個卷積層和 個匯聚層( 通常設置為 , 為 或 )。一個卷積網路中可以堆疊 個連續的卷積塊,然後在後面接著 個全連接層( 的取值區間比較大,比如 或者更大; 一般為 )。
目前,整個網路結構 趨向於使用更小的卷積核(比如 和 )以及更深的結構(比如層數大於50) 。此外,由於卷積的操作性越來越靈活(比如不同的步長),匯聚層的作用變得也越來越小,因此目前比較流行的卷積網路中, 匯聚層的比例也逐漸降低,趨向於全卷積網路 。
在全連接前饋神經網路中,梯度主要通過每一層的誤差項 進行反向傳播,並進一步計算每層參數的梯度。在卷積神經網路中,主要有兩種不同功能的神經層:卷積層和匯聚層。而參數為卷積核以及偏置,因此 只需要計算卷積層中參數的梯度。
不失一般性,第 層為卷積層,第 層的輸入特徵映射為 ,通過卷積計算得到第 層的特徵映射凈輸入 ,第 層的第 個特徵映射凈輸入
由 得:
同理可得,損失函數關於第 層的第 個偏置 的偏導數為:
在卷積網路中,每層參數的梯度依賴其所在層的誤差項 。
卷積層和匯聚層中,誤差項的計算有所不同,因此我們分別計算其誤差項。
第 層的第 個特徵映射的誤差項 的具體推導過程如下:
其中 為第 層使用的激活函數導數, 為上采樣函數(upsampling),與匯聚層中使用的下采樣操作剛好相反。如果下采樣是最大匯聚(max pooling),誤差項 中每個值會直接傳遞到上一層對應區域中的最大值所對應的神經元,該區域中其它神經元的誤差項的都設為0。如果下采樣是平均匯聚(meanpooling),誤差項 中每個值會被平均分配到上一層對應區域中的所有神經元上。
第 層的第 個特徵映射的誤差項 的具體推導過程如下:
其中 為寬卷積。
LeNet-5雖然提出的時間比較早,但是是一個非常成功的神經網路模型。基於LeNet-5 的手寫數字識別系統在90年代被美國很多銀行使用,用來識別支票上面的手寫數字。LeNet-5 的網路結構如圖:
不計輸入層,LeNet-5共有7層,每一層的結構為:
AlexNet是第一個現代深度卷積網路模型,其首次使用了很多現代深度卷積網路的一些技術方法,比如採用了ReLU作為非線性激活函數,使用Dropout防止過擬合,使用數據增強來提高模型准確率等。AlexNet 贏得了2012 年ImageNet 圖像分類競賽的冠軍。
AlexNet的結構如圖,包括5個卷積層、3個全連接層和1個softmax層。因為網路規模超出了當時的單個GPU的內存限制,AlexNet 將網路拆為兩半,分別放在兩個GPU上,GPU間只在某些層(比如第3層)進行通訊。
AlexNet的具體結構如下:
在卷積網路中,如何設置卷積層的卷積核大小是一個十分關鍵的問題。 在Inception網路中,一個卷積層包含多個不同大小的卷積操作,稱為Inception模塊。Inception網路是由有多個inception模塊和少量的匯聚層堆疊而成 。
v1版本的Inception模塊,採用了4組平行的特徵抽取方式,分別為1×1、3× 3、5×5的卷積和3×3的最大匯聚。同時,為了提高計算效率,減少參數數量,Inception模塊在進行3×3、5×5的卷積之前、3×3的最大匯聚之後,進行一次1×1的卷積來減少特徵映射的深度。如果輸入特徵映射之間存在冗餘信息, 1×1的卷積相當於先進行一次特徵抽取 。