卷積神經網絡(CNN)
本篇博客參考自大佬的開源書籍,幫助大家從頭開始學習卷積神經網絡,謝謝各位的支持了,在此期待各位能與我共同進步
? 卷積神經網絡(CNN)是一種特殊的深度學習網絡結構,主要用于處理具有局部和整體相關性的數據。它在圖像識別領域取得了巨大的成功,因為圖像數據本身就具有顯著的局部和整體相關性。CNN通過卷積層、池化層等結構,能夠有效地提取圖像中的局部特征,并逐步組合成更高層次的特征表示。
除了圖像識別,CNN還在自然語言處理和語音識別等領域得到了應用。例如,在自然語言處理中,CNN可以用于文本分類、情感分析等任務,通過卷積操作捕捉文本中的局部特征,如詞匯和短語的組合模式。在語音識別中,CNN可以處理語音信號的局部特征,從而識別出語音中的詞匯和語義信息。
CNN的成功在于其能夠自動學習數據中的特征層次結構,而無需手動設計特征提取器。這種能力使得CNN在處理具有復雜結構的數據時表現出色,能夠有效地捕捉到數據中的局部和整體信息。
原書鏈接:鏈接
卷積神經網絡的組成層
? 以圖像分類任務為例,在表5.1所示卷積神經網絡中,一般包含5種類型的網絡層次結構:
? 表5.1 卷積神經網絡的組成
CNN層次結構 | 輸出尺寸 | 作用 |
---|---|---|
輸入層 | W 1 × H 1 × 3 W_1\times H_1\times 3 W1?×H1?×3 | 卷積網絡的原始輸入,可以是原始或預處理后的像素矩陣 |
卷積層 | W 1 × H 1 × K W_1\times H_1\times K W1?×H1?×K | 參數共享、局部連接,利用平移不變性從全局特征圖提取局部特征 |
激活層 | W 1 × H 1 × K W_1\times H_1\times K W1?×H1?×K | 將卷積層的輸出結果進行非線性映射 |
池化層 | W 2 × H 2 × K W_2\times H_2\times K W2?×H2?×K | 進一步篩選特征,可以有效減少后續網絡層次所需的參數量 |
全連接層 | ( W 2 ? H 2 ? K ) × C (W_2 \cdot H_2 \cdot K)\times C (W2??H2??K)×C | 將多維特征展平為2維特征,通常低維度特征對應任務的學習目標(類別或回歸值) |
W 1 × H 1 × 3 W_1\times H_1\times 3 W1?×H1?×3對應原始圖像或經過預處理的像素值矩陣,3對應RGB圖像的通道; K K K表示卷積層中卷積核(濾波器)的個數; W 2 × H 2 W_2\times H_2 W2?×H2? 為池化后特征圖的尺度,在全局池化中尺度對應 1 × 1 1\times 1 1×1; ( W 2 ? H 2 ? K ) (W_2 \cdot H_2 \cdot K) (W2??H2??K)是將多維特征壓縮到1維之后的大小, C C C對應的則是圖像類別個數。
輸入層
? 輸入層(Input Layer)通常是輸入卷積神經網絡的原始數據或經過預處理的數據,可以是圖像識別領域中原始三維的多彩圖像,也可以是音頻識別領域中經過傅利葉變換的二維波形數據,甚至是自然語言處理中一維表示的句子向量。以圖像分類任務為例,輸入層輸入的圖像一般包含RGB三個通道,是一個由長寬分別為 H H H和 W W W組成的3維像素值矩陣 H × W × 3 H\times W \times 3 H×W×3,卷積網絡會將輸入層的數據傳遞到一系列卷積、池化等操作進行特征提取和轉化,最終由全連接層對特征進行匯總和結果輸出。根據計算能力、存儲大小和模型結構的不同,卷積神經網絡每次可以批量處理的圖像個數不盡相同,若指定輸入層接收到的圖像個數為 N N N,則輸入層的輸出數據為 N × H × W × 3 N\times H\times W\times 3 N×H×W×3。
卷積層
? 卷積層(Convolution Layer)通常用作對輸入層輸入數據進行特征提取,通過卷積核矩陣對原始數據中隱含關聯性的一種抽象。卷積操作原理上其實是對兩張像素矩陣進行點乘求和的數學操作,其中一個矩陣為輸入的數據矩陣,另一個矩陣則為卷積核(濾波器或特征矩陣),求得的結果表示為原始圖像中提取的特定局部特征。圖5.1表示卷積操作過程中的不同填充策略,上半部分采用零填充,下半部分采用有效卷積(舍棄不能完整運算的邊緣部分)。
?
激活層
? 激活層(Activation Layer)負責對卷積層抽取的特征進行激活,由于卷積操作是由輸入矩陣與卷積核矩陣進行相差的線性變化關系,需要激活層對其進行非線性的映射。激活層主要由激活函數組成,即在卷積層輸出結果的基礎上嵌套一個非線性函數,讓輸出的特征圖具有非線性關系。卷積網絡中通常采用ReLU來充當激活函數(還包括tanh和sigmoid等)ReLU的函數形式如公式(5-1)所示,能夠限制小于0的值為0,同時大于等于0的值保持不變。
f ( x ) = { 0 if? x < 0 x if? x ≥ 0 (公式) f(x)=\begin{cases} 0 &\text{if } x<0 \\ x &\text{if } x\ge 0 \end{cases} \tag{公式} f(x)={0x?if?x<0if?x≥0?(公式)
池化層
? 池化層又稱為降采樣層(Downsampling Layer),作用是對感受域內的特征進行篩選,提取區域內最具代表性的特征,能夠有效地降低輸出特征尺度,進而減少模型所需要的參數量。按操作類型通常分為最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling),它們分別提取感受域內最大、平均與總和的特征值作為輸出,最常用的是最大池化。
全連接層
? 全連接層(Full Connected Layer)負責對卷積神經網絡學習提取到的特征進行匯總,將多維的特征輸入映射為二維的特征輸出,高維表示樣本批次,低位常常對應任務目標。
卷積在圖像中有什么直觀作用
? 在卷積神經網絡中,卷積常用來提取圖像的特征,但不同層次的卷積操作提取到的特征類型是不相同的,特征類型粗分如表5.2所示。
? 表5.2 卷積提取的特征類型
卷積層次 | 特征類型 |
---|---|
淺層卷積 | 邊緣特征 |
中層卷積 | 局部特征 |
深層卷積 | 全局特征 |
圖像與不同卷積核的卷積可以用來執行邊緣檢測、銳化和模糊等操作。表5.3顯示了應用不同類型的卷積核(濾波器)后的各種卷積圖像。
? 表5.3 一些常見卷積核的作用
卷積作用 | 卷積核 | 卷積后圖像 |
---|---|---|
輸出原圖 | [ 0 0 0 0 1 0 0 0 0 ] \begin{bmatrix} 0 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix} ?000?010?000? ? | |
邊緣檢測(突出邊緣差異) | [ 1 0 ? 1 0 0 0 ? 1 0 1 ] \begin{bmatrix} 1 & 0 & -1 \\ 0 & 0 & 0 \\ -1 & 0 & 1 \end{bmatrix} ?10?1?000??101? ? | |
邊緣檢測(突出中間值) | [ ? 1 ? 1 ? 1 ? 1 8 ? 1 ? 1 ? 1 ? 1 ] \begin{bmatrix} -1 & -1 & -1 \\ -1 & 8 & -1 \\ -1 & -1 & -1 \end{bmatrix} ??1?1?1??18?1??1?1?1? ? | |
圖像銳化 | [ 0 ? 1 0 ? 1 5 ? 1 0 ? 1 0 ] \begin{bmatrix} 0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0 \end{bmatrix} ?0?10??15?1?0?10? ? | |
方塊模糊 | [ 1 1 1 1 1 1 1 1 1 ] × 1 9 \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} \times \frac{1}{9} ?111?111?111? ?×91? | |
高斯模糊 | [ 1 2 1 2 4 2 1 2 1 ] × 1 16 \begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{bmatrix} \times \frac{1}{16} ?121?242?121? ?×161? |
卷積層有哪些基本參數?
? 卷積層中需要用到卷積核(濾波器或特征檢測器)與圖像特征矩陣進行點乘運算,利用卷積核與對應的特征感受域進行劃窗式運算時,需要設定卷積核對應的大小、步長、個數以及填充的方式,如表5.4所示。
? 表5.4 卷積層的基本參數
參數名 | 作用 | 常見設置 |
---|---|---|
卷積核大小 (Kernel Size) | 卷積核的大小定義了卷積的感受野 | 在過去常設為5,如LeNet-5;現在多設為3,通過堆疊 3 × 3 3\times3 3×3的卷積核來達到更大的感受域 |
卷積核步長 (Stride) | 定義了卷積核在卷積過程中的步長 | 常見設置為1,表示滑窗距離為1,可以覆蓋所有相鄰位置特征的組合;當設置為更大值時相當于對特征組合降采樣 |
填充方式 (Padding) | 在卷積核尺寸不能完美匹配輸入的圖像矩陣時需要進行一定的填充策略 | 設置為’SAME’表示對不足卷積核大小的邊界位置進行某種填充(通常零填充)以保證卷積輸出維度與與輸入維度一致;當設置為’VALID’時則對不足卷積尺寸的部分進行舍棄,輸出維度就無法保證與輸入維度一致 |
輸入通道數 (In Channels) | 指定卷積操作時卷積核的深度 | 默認與輸入的特征矩陣通道數(深度)一致;在某些壓縮模型中會采用通道分離的卷積方式 |
輸出通道數 (Out Channels) | 指定卷積核的個數 | 若設置為與輸入通道數一樣的大小,可以保持輸入輸出維度的一致性;若采用比輸入通道數更小的值,則可以減少整體網絡的參數量 |
卷積操作維度變換公式:
O d = { ? ( I d ? k s i z e ) + 1 ) s ? , padding=VALID ? I d s ? , padding=SAME O_d =\begin{cases} \lceil \frac{(I_d - k_{size})+ 1)}{s}\rceil ,& \text{padding=VALID}\\ \lceil \frac{I_d}{s}\rceil,&\text{padding=SAME} \end{cases} Od?={?s(Id??ksize?)+1)??,?sId???,?padding=VALIDpadding=SAME?
其中, I d I_d Id?為輸入維度, O d O_d Od?為輸出維度, k s i z e k_{size} ksize?為卷積核大小, s s s為步長
卷積核有什么類型?
? 常見的卷積主要是由連續緊密的卷積核對輸入的圖像特征進行滑窗式點乘求和操作,除此之外還有其他類型的卷積核在不同的任務中會用到,具體分類如表5.5所示。
? 表5.5 卷積核分類
卷積類別 | 示意圖 | 作用 |
---|---|---|
標準卷積 | 最常用的卷積核,連續緊密的矩陣形式可以提取圖像區域中的相鄰像素之間的關聯關系, 3 × 3 3\times3 3×3的卷積核可以獲得 3 × 3 3\times3 3×3像素范圍的感受視野 | |
擴張卷積(帶孔卷積或空洞卷積) | 引入一個稱作擴張率(Dilation Rate)的參數,使同樣尺寸的卷積核可以獲得更大的感受視野,相應的在相同感受視野的前提下比普通卷積采用更少的參數。同樣是 3 × 3 3\times3 3×3的卷積核尺寸,擴張卷積可以提取 5 × 5 5\times5 5×5范圍的區域特征,在實時圖像分割領域廣泛應用 | |
轉置卷積 | 先對原始特征矩陣進行填充使其維度擴大到適配卷積目標輸出維度,然后進行普通的卷積操作的一個過程,其輸入到輸出的維度變換關系恰好與普通卷積的變換關系相反,但這個變換并不是真正的逆變換操作,通常稱為轉置卷積(Transpose Convolution)而不是反卷積(Deconvolution)。轉置卷積常見于目標檢測領域中對小目標的檢測和圖像分割領域還原輸入圖像尺度。 | |
可分離卷積 | 標準的卷積操作是同時對原始圖像 H × W × C H\times W\times C H×W×C三個方向的卷積運算,假設有 K K K個相同尺寸的卷積核,這樣的卷積操作需要用到的參數為 H × W × C × K H\times W\times C\times K H×W×C×K個;若將長寬與深度方向的卷積操作分離出變為 H × W H\times W H×W與 C C C的兩步卷積操作,則同樣的卷積核個數 K K K,只需要 ( H × W + C ) × K (H\times W + C)\times K (H×W+C)×K個參數,便可得到同樣的輸出尺度。可分離卷積(Seperable Convolution)通常應用在模型壓縮或一些輕量的卷積神經網絡中,如MobileNet [ 1 ] ^{[1]} [1]、Xception [ 2 ] ^{[2]} [2]等 |
二維卷積與三維卷積有什么區別?
-
二維卷積
二維卷積操作如圖5.3所示,為了更直觀的說明,分別展示在單通道和多通道輸入中,對單個通道輸出的卷積操作。在單通道輸入的情況下,若輸入卷積核尺寸為 ( k h , k w , 1 ) ? (k_h, k_w, 1)? (kh?,kw?,1)?,卷積核在輸入圖像的空間維度上進行滑窗操作,每次滑窗和 ( k h , k w ) ? (k_h, k_w)? (kh?,kw?)?窗口內的值進行卷積操作,得到輸出圖像中的一個值。在多通道輸入的情況下,假定輸入圖像特征通道數為3,卷積核尺寸則為 ( k h , k w , 3 ) ? (k_h, k_w, 3)? (kh?,kw?,3)?,每次滑窗與3個通道上的 ( k h , k w ) ? (k_h, k_w)? (kh?,kw?)?窗口內的所有值進行卷積操作,得到輸出圖像中的一個值。 -
三維卷積
3D卷積操作如圖所示,同樣分為單通道和多通道,且假定只使用1個卷積核,即輸出圖像僅有一個通道。對于單通道輸入,與2D卷積不同之處在于,輸入圖像多了一個深度(depth)維度,卷積核也多了一個 k d ? k_d? kd??維度,因此3D卷積核的尺寸為 ( k h , k w , k d ) ? (k_h, k_w, k_d)? (kh?,kw?,kd?)?,每次滑窗與 ( k h , k w , k d ) ? (k_h, k_w, k_d)? (kh?,kw?,kd?)?窗口內的值進行相關操作,得到輸出3D圖像中的一個值。對于多通道輸入,則與2D卷積的操作一樣,每次滑窗與3個channels上的 ( k h , k w , k d ) ? (k_h, k_w, k_d)? (kh?,kw?,kd?)?窗口內的所有值進行相關操作,得到輸出3D圖像中的一個值。
有哪些池化方法?
? 池化操作通常也叫做子采樣(Subsampling)或降采樣(Downsampling),在構建卷積神經網絡時,往往會用在卷積層之后,通過池化來降低卷積層輸出的特征維度,有效減少網絡參數的同時還可以防止過擬合現象。池化操作可以降低圖像維度的原因,本質上是因為圖像具有一種“靜態性”的屬性,這個意思是說在一個圖像區域有用的特征極有可能在另一個區域同樣有用。因此,為了描述一個大的圖像,很直觀的想法就是對不同位置的特征進行聚合統計。例如,可以計算圖像在固定區域上特征的平均值 (或最大值)來代表這個區域的特征。
? 表5.6 池化分類
池化類型 | 示意圖 | 作用 |
---|---|---|
一般池化(General Pooling) | =img%2Fch5%2Fgeneral_pooling.png&pos_id=img-he8OF3eY-1748160509223) | 通常包括最大池化(Max Pooling)和平均池化(Mean Pooling)。以最大池化為例,池化范圍 ( 2 × 2 ) (2\times2) (2×2)和滑窗步長 ( s t r i d e = 2 ) (stride=2) (stride=2) 相同,僅提取一次相同區域的范化特征。 |
重疊池化(Overlapping Pooling) | 與一般池化操作相同,但是池化范圍 P s i z e P_{size} Psize?與滑窗步長 s t r i d e stride stride關系為 P s i z e > s t r i d e P_{size}>stride Psize?>stride,同一區域內的像素特征可以參與多次滑窗提取,得到的特征表達能力更強,但計算量更大。 | |
空間金字塔池化 ? ^* ?(Spatial Pyramid Pooling) | 在進行多尺度目標的訓練時,卷積層允許輸入的圖像特征尺度是可變的,緊接的池化層若采用一般的池化方法會使得不同的輸入特征輸出相應變化尺度的特征,而卷積神經網絡中最后的全連接層則無法對可變尺度進行運算,因此需要對不同尺度的輸出特征采樣到相同輸出尺度。 |
SPPNet [ 3 ] ^{[3]} [3]就引入了空間池化的組合,對不同輸出尺度采用不同的滑窗大小和步長以確保輸出尺度相同 ( w i n s i z e = ? i n o u t ? ; s t r i d e = ? i n o u t ? ; ) (win_{size}=\lceil \frac{in}{out}\rceil; stride=\lfloor \frac{in}{out}\rfloor; ) (winsize?=?outin??;stride=?outin??;),同時用如金字塔式疊加的多種池化尺度組合,以提取更加豐富的圖像特征。常用于多尺度訓練和目標檢測中的區域提議網絡(Region Proposal Network)的興趣區域(Region of Interest)提取
1 × 1 1\times1 1×1卷積作用?
? NIN(Network in Network) [ 4 ] ? ^{[4]}? [4]?是第一篇探索 1 × 1 ? 1\times1? 1×1?卷積核的論文,這篇論文通過在卷積層中使用MLP替代傳統線性的卷積核,使單層卷積層內具有非線性映射的能力,也因其網絡結構中嵌套MLP子網絡而得名NIN。NIN對不同通道的特征整合到MLP自網絡中,讓不同通道的特征能夠交互整合,使通道之間的信息得以流通,其中的MLP子網絡恰恰可以用 1 × 1 ? 1\times1? 1×1?的卷積進行代替。
綜上所述, 1 × 1 ? 1\times 1? 1×1?卷積的作用主要為以下兩點:
- 實現信息的跨通道交互和整合。
- 對卷積核通道數進行降維和升維,減小參數量。
卷積層和池化層有什么區別?
? 卷積層核池化層在結構上具有一定的相似性,都是對感受域內的特征進行提取,并且根據步長設置獲取到不同維度的輸出,但是其內在操作是有本質區別的,如表5.7所示。
卷積層 | 池化層 | |
---|---|---|
結構 | 零填充時輸出維度不變,而通道數改變 | 通常特征維度會降低,通道數不變 |
穩定性 | 輸入特征發生細微改變時,輸出結果會改變 | 感受域內的細微變化不影響輸出結果 |
作用 | 感受域內提取局部關聯特征 | 感受域內提取泛化特征,降低維度 |
參數量 | 與卷積核尺寸、卷積核個數相關 | 不引入額外參數 |
卷積核是否一定越大越好?
經典卷積神經網絡(如LeNet-5和AlexNet)常使用較大卷積核(如11×11和5×5)。當時計算能力有限,模型結構較淺,需用大卷積核擴大感受野。但大卷積核計算量大,不利于深層模型訓練和性能提升。后續網絡(如VGG和GoogLeNet)發現,堆疊兩個3×3卷積核可獲與5×5卷積核相同感受野,且參數量更少(3×3×2+1<5×5×1+1),因此3×3卷積核被廣泛應用。
然而,大卷積核在特定領域仍有用武之地。如自然語言處理領域,文本特征提取通常只需較淺層網絡,但需較廣感受野以組合更多特征(如詞組和字符)。此時,直接采用較大卷積核可能是更好的選擇。
但是,這并不是表示更大的卷積核就沒有作用,在某些領域應用卷積神經網絡時仍然可以采用較大的卷積核。譬如在自然語言處理領域,由于文本內容不像圖像數據可以對特征進行很深層的抽象,往往在該領域的特征提取只需要較淺層的神經網絡即可。在將卷積神經網絡應用在自然語言處理領域時,通常都是較為淺層的卷積層組成,但是文本特征有時又需要有較廣的感受域讓模型能夠組合更多的特征(如詞組和字符),此時直接采用較大的卷積核將是更好的選擇。
每層卷積是否只能用一種尺寸的卷積核?
?
經典神經網絡通常是層疊式結構,每層僅使用一種尺寸的卷積核。例如,VGG網絡中大量使用了 3×3 卷積層。然而,像 GoogLeNet 和 Inception 系列網絡則采用了不同的策略,它們在每一層網絡中同時使用多種尺寸的卷積核,如 1×1、3×3 和 5×5。這些不同尺寸的卷積核分別對輸入特征進行卷積,得到不同尺度的特征圖。之后,這些特征圖被整合在一起,形成新的特征。這種整合后的特征可以看作是從不同大小的感受域提取的特征組合,能夠捕捉到圖像中的不同層次信息,從而獲得比單一卷積核更強大的特征表達能力。
怎樣才能減少卷積層參數量?
減少卷積層參數量的方法可以簡要地歸為以下幾點:
- 使用堆疊小卷積核代替大卷積核:VGG網絡中2個 3 × 3 3\times 3 3×3的卷積核可以代替1個 5 × 5 5\times 5 5×5的卷積核
- 使用分離卷積操作:將原本 K × K × C K\times K\times C K×K×C的卷積操作分離為 K × K × 1 K\times K\times 1 K×K×1和 1 × 1 × C 1\times1\times C 1×1×C的兩部分操作
- 添加 1 × 1 1\times 1 1×1的卷積操作:與分離卷積類似,但是通道數可變,在 K × K × C 1 K\times K\times C_1 K×K×C1?卷積前添加 1 × 1 × C 2 1\times1\times C_2 1×1×C2?的卷積核(滿足 C 2 < C 1 C_2 <C_1 C2?<C1?)
- 在卷積層前使用池化操作:池化可以降低卷積層的輸入特征維度
在進行卷積操作時,必須同時考慮通道和區域嗎?
? 標準卷積中,采用區域與通道同時處理的操作,如下圖所示:
img%2Fch5%2F5.13-1.png&pos_id=img-G5bdzbjx-1748160508865)
? 這樣做可以簡化卷積層內部的結構,每一個輸出的特征像素都由所有通道的同一個區域提取而來。
? 但是這種方式缺乏靈活性,并且在深層的網絡結構中使得運算變得相對低效,更為靈活的方式是使區域和通道的卷積分離開來,通道分離(深度分離)卷積網絡由此誕生。如下圖所示,Xception網絡可解決上述問題。
? 我們首先對每一個通道進行各自的卷積操作,有多少個通道就有多少個過濾器。得到新的通道特征矩陣之后,再對這批新通道特征進行標準的 1 × 1 ? 1×1? 1×1?跨通道卷積操作。
采用寬卷積的好處有什么?
?
寬卷積('SAME’填充):通常使用零填充來補全輸入特征,使其維度與卷積核不滿足整除條件時能夠完整進行卷積操作,從而使得卷積層的輸出維度與輸入特征維度保持一致。這種填充方式能夠有效地保留原始輸入特征的完整性,不會因尺寸不匹配而丟失信息。
窄卷積('VALID’填充):則不進行任何填充。當輸入特征的邊緣不足以進行卷積操作時,邊緣信息會被舍棄。在步長為1的情況下,這種填充方式會導致卷積層的輸出特征維度略小于輸入特征的維度。
寬卷積的優勢在于,通過補零可以進行完整的卷積操作,從而有效地保留原始輸入特征的信息。例如在下圖中,左部分展示了窄卷積,可以注意到越靠近邊緣的位置被卷積的次數越少。而寬卷積則可以在卷積前在邊緣用0進行補充,常見有兩種情況:一種是全補充,如右部分所示,這樣輸出的維度會大于輸入的維度;另一種是補充一部分0值,使得輸出和輸入的維度保持一致。
簡單來說,寬卷積通過零填充確保卷積操作可以完整進行,并保留輸入特征的維度和信息;而窄卷積不填充,可能導致輸出維度減小,且邊緣信息可能被舍棄。這兩種方法的選擇取決于具體應用場景和對特征保留的需求。
理解轉置卷積與棋盤效應
標準卷積
在理解轉置卷積之前,需要先理解標準卷積的運算方式。
首先給出一個輸入輸出結果
那是怎樣計算的呢?
卷積的時候需要對卷積核進行180的旋轉,同時卷積核中心與需計算的圖像像素對齊,輸出結構為中心對齊像素的一個新的像素值,計算例子如下:
這樣計算出左上角(即第一行第一列)像素的卷積后像素值。
給出一個更直觀的例子,從左到右看,原像素經過卷積由1變成-8。
通過滑動卷積核,就可以得到整張圖片的卷積結果。
轉置卷積
圖像的deconvolution過程如下:
輸入:2x2, 卷積核:4x4, 滑動步長:3, 輸出:7x7
過程如下:
-
輸入圖片每個像素進行一次full卷積,根據full卷積大小計算可以知道每個像素的卷積后大小為 1+4-1=4, 即4x4大小的特征圖,輸入有4個像素所以4個4x4的特征圖
-
將4個特征圖進行步長為3的相加; 輸出的位置和輸入的位置相同。步長為3是指每隔3個像素進行相加,重疊部分進行相加,即輸出的第1行第4列是由紅色特陣圖的第一行第四列與綠色特征圖的第一行第一列相加得到,其他如此類推。
可以看出翻卷積的大小是由卷積核大小與滑動步長決定, in是輸入大小, k是卷積核大小, s是滑動步長, out是輸出大小 得到 out = (in - 1) * s + k 上圖過程就是, (2 - 1) * 3 + 4 = 7。
棋盤效應
5.16 卷積神經網絡的參數設置
? 卷積神經網絡中常見的參數在其他類型的神經網絡中也是類似的,但是參數的設置還得結合具體的任務才能設置在合理的范圍,具體的參數列表如表XX所示。
? 表XX 卷積神經網絡常見參數
參數名 | 常見設置 | 參數說明 |
---|---|---|
學習率(Learning Rate) | 0 ? 1 0-1 0?1 | 反向傳播網絡中更新權值矩陣的步長,在一些常見的網絡中會在固定迭代次數或模型不再收斂后對學習率進行指數下降(如 l r = l r × 0.1 lr=lr\times 0.1 lr=lr×0.1)。當學習率越大計算誤差對權值矩陣的影響越大,容易在某個局部最優解附近震蕩;越小的學習率對網絡權值的更新越精細,但是需要花費更多的時間去迭代 |
批次大小(Batch Size) | 1 ? N 1-N 1?N | 批次大小指定一次性流入模型的數據樣本個數,根據任務和計算性能限制判斷實際取值,在一些圖像任務中往往由于計算性能和存儲容量限制只能選取較小的值。在相同迭代次數的前提下,數值越大模型越穩定,泛化能力越強,損失值曲線越平滑,模型也更快地收斂,但是每次迭代需要花費更多的時間 |
數據輪次(Epoch) | 1 ? N 1-N 1?N | 數據輪次指定所有訓練數據在模型中訓練的次數,根據數據集規模和分布情況會設置為不同的值。當模型較為簡單或訓練數據規模較小時,通常輪次不宜過高,否則模型容易過擬合;模型較為復雜或訓練數據規模足夠大時,可適當提高數據的訓練輪次。 |
權重衰減系數(Weight Decay) | 0 ? 0.001 0-0.001 0?0.001 | 模型訓練過程中反向傳播權值更新的權重衰減值 |
提高卷積神經網絡的泛化能力
? 卷積神經網絡與其他類型的神經網絡類似,在采用反向傳播進行訓練的過程中比較依賴輸入的數據分布,當數據分布較為極端的情況下容易導致模型欠擬合或過擬合,表XX記錄了提高卷積網絡泛化能力的方法。
? 表XX 提高卷積網絡化能力的方法
方法 | 說明 |
---|---|
使用更多數據 | 在有條件的前提下,盡可能多地獲取訓練數據是最理想的方法,更多的數據可以讓模型得到充分的學習,也更容易提高泛化能力 |
使用更大批次 | 在相同迭代次數和學習率的條件下,每批次采用更多的數據將有助于模型更好的學習到正確的模式,模型輸出結果也會更加穩定 |
調整數據分布 | 大多數場景下的數據分布是不均勻的,模型過多地學習某類數據容易導致其輸出結果偏向于該類型的數據,此時通過調整輸入的數據分布可以一定程度提高泛化能力 |
調整目標函數 | 在某些情況下,目標函數的選擇會影響模型的泛化能力,如目標函數$f(y,y’)= |
調整網絡結構 | 在淺層卷積神經網絡中,參數量較少往往使模型的泛化能力不足而導致欠擬合,此時通過疊加卷積層可以有效地增加網絡參數,提高模型表達能力;在深層卷積網絡中,若沒有充足的訓練數據則容易導致模型過擬合,此時通過簡化網絡結構減少卷積層數可以起到提高模型泛化能力的作用 |
數據增強 | 數據增強又叫數據增廣,在有限數據的前提下通過平移、旋轉、加噪聲等一些列變換來增加訓練數據,同類數據的表現形式也變得更多樣,有助于模型提高泛化能力,需要注意的是數據變化應盡可能不破壞元數數據的主體特征(如在圖像分類任務中對圖像進行裁剪時不能將分類主體目標裁出邊界)。 |
權值正則化 | 權值正則化就是通常意義上的正則化,一般是在損失函數中添加一項權重矩陣的正則項作為懲罰項,用來懲罰損失值較小時網絡權重過大的情況,此時往往是網絡權值過擬合了數據樣本(如$Loss=f(WX+b,y’)+\frac{\lambda}{\eta}\sum{ |
屏蔽網絡節點 | 該方法可以認為是網絡結構上的正則化,通過隨機性地屏蔽某些神經元的輸出讓剩余激活的神經元作用,可以使模型的容錯性更強。 |
對大多數神經網絡模型同樣通用
卷積神經網絡在不同領域的應用
? 卷積神經網絡中的卷積操作是其關鍵組成,而卷積操作只是一種數學運算方式,實際上對不同類型的數值表示數據都是通用的,盡管這些數值可能表示的是圖像像素值、文本序列中單個字符或是語音片段中單字的音頻。只要使原始數據能夠得到有效地數值化表示,卷積神經網絡能夠在不同的領域中得到應用,要關注的是如何將卷積的特性更好地在不同領域中應用,如表XX所示。
? 表XX 卷積神經網絡不同領域的應用
應用領域 | 輸入數據圖示 | 說明 |
---|---|---|
圖像處理 | 卷積神經網絡在圖像處理領域有非常廣泛的應用,這是因為圖像數據本身具有的局部完整性非常 | |
自然語言處理 | ||
語音處理 |
聯系
? 自然語言處理是對一維信號(詞序列)做操作。
? 計算機視覺是對二維(圖像)或三維(視頻流)信號做操作。
區別
?
自然語言處理的輸入數據通常是離散取值(例如,一個單詞或字母常表示為詞典中的 one hot 向量),而計算機視覺的輸入數據通常是連續取值(比如歸一化到 0 到 1 之間的灰度值)。CNN 有兩個主要特點:區域不變性和組合性。
區域不變性
濾波器在圖像上滑動,檢測局部信息,然后通過 pooling(取最大值或均值)綜合局部特征,池化操作整合了局部信息,丟失了每個特征的位置信息。這很適合圖像任務,如判斷圖像中是否有貓,我們通常不關心貓出現在哪個區域。但在 NLP 中,詞語的位置和順序至關重要。
局部組合性
CNN 中,每個濾波器將較低層的局部特征組合生成較高層的更全局特征。在 CV 中,這很直觀:像素組合成邊緣,邊緣生成形狀,形狀組合成復雜物體。在語言中,組合關系存在,但不如圖像直觀。在圖像中,相鄰像素通常是相關的,而相鄰詞語未必相關。
卷積神經網絡凸顯共性的方法?
局部連接
? 我們首先了解一個概念,感受野,即每個神經元僅與輸入神經元相連接的一塊區域。
在圖像卷積操作中,神經元在空間維度上是局部連接,但在深度上是全連接。局部連接的思想,是受啟發于生物學里的視覺系統結構,視覺皮層的神經元就是僅用局部接受信息。對于二維圖像,局部像素關聯性較強。這種局部連接保證了訓練后的濾波器能夠對局部特征有最強的響應,使神經網絡可以提取數據的局部特征;
下圖是一個很經典的圖示,左邊是全連接,右邊是局部連接。
對于一個1000 × 1000的輸入圖像而言,如果下一個隱藏層的神經元數目為10^6個,采用全連接則有1000 × 1000 × 10^6 = 10^12個權值參數,如此巨大的參數量幾乎難以訓練;而采用局部連接,隱藏層的每個神經元僅與圖像中10 × 10的局部圖像相連接,那么此時的權值參數數量為10 × 10 × 10^6 = 10^8,將直接減少4個數量級。
權值共享
? 權值共享指的是在計算同一深度的神經元時,使用相同的卷積核參數。這種共享機制有其積極意義,因為在神經網絡中,底層邊緣特征的提取通常不受其在圖像中的具體位置的影響。然而,在某些特定場景,如人臉識別任務中,我們可能希望網絡能夠在不同的位置學習到不同的特征,此時權值共享可能就不太適用了。
需要明確的是,權重共享僅適用于同一深度切片的神經元。在卷積層中,我們通常會使用多組卷積核來提取多種不同的特征,這些特征對應于不同深度切片的特征。對于不同深度切片的神經元,其權重是不共享的。另一方面,偏置這一權值則對于同一深度切片的所有神經元都是共享的。
權值共享的一個主要優勢是顯著降低了網絡的訓練難度。例如,假設在局部連接中,隱藏層的每個神經元連接的是一個10×10大小的局部圖像區域,這意味著有10×10個權重參數。如果我們將這些10×10個權值參數共享給隱藏層中的所有神經元,那么無論隱藏層有多少個神經元(比如10^6個),需要訓練的參數仍然是這10×10個權值參數(即卷積核的大小)。
這里就體現了卷積神經網絡的奇妙之處,使用少量的參數,卻依然能有非常出色的性能。上述僅僅是提取圖像一種特征的過程。如果要多提取出一些特征,可以增加多個卷積核,不同的卷積核能夠得到圖像不同尺度下的特征,稱之為特征圖(feature map)。
池化操作
池化操作與多層次結構一起,實現了數據的降維,將低層次的局部特征組合成為較高層次的特征,從而對整個圖片進行表示。如下圖:
全連接、局部連接、全卷積與局部卷積
? 大多數神經網絡中高層網絡通常會采用全連接層(Global Connected Layer),通過多對多的連接方式對特征進行全局匯總,可以有效地提取全局信息。但是全連接的方式需要大量的參數,是神經網絡中最占資源的部分之一,因此就需要由局部連接(Local Connected Layer),僅在局部區域范圍內產生神經元連接,能夠有效地減少參數量。根據卷積操作的作用范圍可以分為全卷積(Global Convolution)和局部卷積(Local Convolution)。實際上這里所說的全卷積就是標準卷積,即在整個輸入特征維度范圍內采用相同的卷積核參數進行運算,全局共享參數的連接方式可以使神經元之間的連接參數大大減少;局部卷積又叫平鋪卷積(Tiled Convolution)或非共享卷積(Unshared Convolution),是局部連接與全卷積的折衷。四者的比較如表XX所示。
? 表XX 卷積網絡中連接方式的對比
連接方式 | 示意圖 | 說明 |
---|---|---|
全連接 | 層間神經元完全連接,每個輸出神經元可以獲取到所有輸入神經元的信息,有利于信息匯總,常置于網絡末層;連接與連接之間獨立參數,大量的連接大大增加模型的參數規模。 | |
局部連接 | 層間神經元只有局部范圍內的連接,在這個范圍內采用全連接的方式,超過這個范圍的神經元則沒有連接;連接與連接之間獨立參數,相比于全連接減少了感受域外的連接,有效減少參數規模 | |
全卷積 | 層間神經元只有局部范圍內的連接,在這個范圍內采用全連接的方式,連接所采用的參數在不同感受域之間共享,有利于提取特定模式的特征;相比于局部連接,共用感受域之間的參數可以進一步減少參數量。 | |
局部卷積 | 層間神經元只有局部范圍內的連接,感受域內采用全連接的方式,而感受域之間間隔采用局部連接與全卷積的連接方式;相比與全卷積成倍引入額外參數,但有更強的靈活性和表達能力;相比于局部連接,可以有效控制參數量 |
局部卷積的應用
并不是所有的卷積都會進行權重共享,在某些特定任務中,會使用不權重共享的卷積。下面通過人臉這一任務來進行講解。在讀人臉方向的一些paper時,會發現很多都會在最后加入一個Local Connected Conv,也就是不進行權重共享的卷積層。總的來說,這一步的作用就是使用3D模型來將人臉對齊,從而使CNN發揮最大的效果。
截取論文中的一部分圖,經過3D對齊以后,形成的圖像均是152×152,輸入到上述的網絡結構中。該結構的參數如下:
Conv:32個11×11×3的卷積核,
Max-pooling: 3×3,stride=2,
Conv: 16個9×9的卷積核,
Local-Conv: 16個9×9的卷積核,
Local-Conv: 16個7×7的卷積核,
Local-Conv: 16個5×5的卷積核,
Fully-connected: 4096維,
Softmax: 4030維。
前三層的目的在于提取低層次的特征,比如簡單的邊和紋理。其中Max-pooling層使得卷積的輸出對微小的偏移情況更加魯棒。但不能使用更多的Max-pooling層,因為太多的Max-pooling層會使得網絡損失圖像信息。全連接層將上一層的每個單元和本層的所有單元相連,用來捕捉人臉圖像不同位置特征之間的相關性。最后使用softmax層用于人臉分類。
中間三層都是使用參數不共享的卷積核,之所以使用參數不共享,有如下原因:
(1)對齊的人臉圖片中,不同的區域會有不同的統計特征,因此并不存在特征的局部穩定性,所以使用相同的卷積核會導致信息的丟失。
(2)不共享的卷積核并不增加inference時特征的計算量,僅會增加訓練時的計算量。
使用不共享的卷積核,由于需要訓練的參數量大大增加,因此往往需要通過其他方法增加數據量。
NetVLAD池化 (貢獻者:熊楚原-中國人民大學)
NetVLAD是論文[15]提出的一個局部特征聚合的方法。
在傳統的網絡里面,例如VGG啊,最后一層卷積層輸出的特征都是類似于Batchsize x 3 x 3 x 512的這種東西,然后會經過FC聚合,或者進行一個Global Average Pooling(NIN里的做法),或者怎么樣,變成一個向量型的特征,然后進行Softmax or 其他的Loss。
這種方法說簡單點也就是輸入一個圖片或者什么的結構性數據,然后經過特征提取得到一個長度固定的向量,之后可以用度量的方法去進行后續的操作,比如分類啊,檢索啊,相似度對比等等。
那么NetVLAD考慮的主要是最后一層卷積層輸出的特征這里,我們不想直接進行欠采樣或者全局映射得到特征,對于最后一層輸出的W x H x D,設計一個新的池化,去聚合一個“局部特征“,這即是NetVLAD的作用。
NetVLAD的一個輸入是一個W x H x D的圖像特征,例如VGG-Net最后的3 x 3 x 512這樣的矩陣,在網絡中還需加一個維度為Batchsize。
NetVLAD還需要另輸入一個標量K即表示VLAD的聚類中心數量,它主要是來構成一個矩陣C,是通過原數據算出來的每一個 W × H W \times H W×H特征的聚類中心,C的shape即 C : K × D C: K \times D C:K×D,然后根據三個輸入,VLAD是計算下式的V:
V ( j , k ) = ∑ i = 1 N a k ( x i ) ( x i ( j ) ? c k ( j ) ) V(j, k) = \sum_{i=1}^{N}{a_k(x_i)(x_i(j) - c_k(j))} V(j,k)=i=1∑N?ak?(xi?)(xi?(j)?ck?(j))
其中j表示維度,從1到D,可以看到V的j是和輸入與c對應的,對每個類別k,都對所有的x進行了計算,如果 x i x_i xi?屬于當前類別k, a k = 1 a_k=1 ak?=1,否則 a k = 0 a_k=0 ak?=0,計算每一個x和它聚類中心的殘差,然后把殘差加起來,即是每個類別k的結果,最后分別L2正則后拉成一個長向量后再做L2正則,正則非常的重要,因為這樣才能統一所有聚類算出來的值,而殘差和的目的主要是消減不同聚類上的分布不均,兩者共同作用才能得到最后正常的輸出。
輸入與輸出如下圖所示:
中間得到的K個D維向量即是對D個x都進行了與聚類中心計算殘差和的過程,最終把K個D維向量合起來后進行即得到最終輸出的 K × D K \times D K×D長度的一維向量。
而VLAD本身是不可微的,因為上面的a要么是0要么是1,表示要么當前描述x是當前聚類,要么不是,是個離散的,NetVLAD為了能夠在深度卷積網絡里使用反向傳播進行訓練,對a進行了修正。
那么問題就是如何重構一個a,使其能夠評估當前的這個x和各個聚類的關聯程度?用softmax來得到:
a k = e W k T x i + b k e W k ′ T x i + b k ′ a_k = \frac{e^{W_k^T x_i + b_k}}{e^{W_{k'}^T x_i + b_{k'}}} ak?=eWk′T?xi?+bk′?eWkT?xi?+bk??
將這個把上面的a替換后,即是NetVLAD的公式,可以進行反向傳播更新參數。
所以一共有三個可訓練參數,上式a中的 W : K × D W: K \times D W:K×D,上式a中的 b : K × 1 b: K \times 1 b:K×1,聚類中心 c : K × D c: K \times D c:K×D,而原始VLAD只有一個參數c。
最終池化得到的輸出是一個恒定的K x D的一維向量(經過了L2正則),如果帶Batchsize,輸出即為Batchsize x (K x D)的二維矩陣。
NetVLAD作為池化層嵌入CNN網絡即如下圖所示,
原論文中采用將傳統圖像檢索方法VLAD進行改進后應用在CNN的池化部分作為一種另類的局部特征池化,在場景檢索上取得了很好的效果。
后續相繼又提出了ActionVLAD、ghostVLAD等改進。
結語
謝謝大家能夠耐心閱讀本篇文章,后續會給出更多優質博客,關于對本篇文章的細節更深的闡述,大家敬請期待~~~
**注:**本篇文章圖片摘自各種論文