卷積神經網路

Galois發表於2020-03-10

理論

  • 卷積神經網路
    • 卷積操作、池化操作、全連線操作
  • 深度可分離卷積
  • 資料增強
  • 遷移學習

卷積神經網路

「卷積神經網路」主要用於影像方向的深度學習神經網路。

結構

卷積神經網路:
(卷積層 + (可選)池化層) * N + 全連線層 * M

(C_{onvolutionalLayer} + (可選)S_{ubsamplingLayer})*N + D_{enseLayer} * M\\{}\\ N\geqslant1,M\geqslant0

卷積層的輸入和輸出都是矩陣,全連線層的輸入和輸出都是向量,所以最後一層卷積層後要做展平。
「卷積神經網路」適用於分類任務或迴歸任務,一般用於分類任務。

LcWreBYjed.png!large

全卷積神經網路:

(卷積層 + (可選)池化層) * N + 反摺積層 * K

(C_{onvolutionalLayer} + (可選)S_{ubsamplingLayer})*N + De_{convolutionLayer} * K\\{}\\ N\geqslant1,M\geqslant0

「全卷積神經網路」適用於物體分割任務,因為輸入和輸出的尺寸是一樣的。

zRFTwlYqkY.png!large

卷積解決的問題

神經網路遇到的問題:

  • 引數過多
    • 計算資源不足
      • 例:影像大小 1000*1000
      • 下一層神經元為 10^6
      • 全連線引數為 1000 * 1000 * 10^6=10^12
      • 一層全連線層就有一萬億個引數,這是現代計算機無法承受的。
    • 容易過擬合,需要更多訓練資料

解決方案之「區域性連線」:

8wlGPQ720H.png!large

上圖中,右側是「區域性連線」:

  • 影像大小 1000*1000
  • 下一層神經元為 10^6
  • 區域性連線範圍為 10*10
  • 全連線引數為 10 * 10 * 10^6 = 10^8

解決方案之「引數共享」:
引數共享指的是不同的區域性連線之間的引數是一樣的,比如上圖的紅色連線中有 100 個引數,藍色連線中也有 100 個引數,這個紅色連線的引數和藍色連線的引數是同一組 100 個引數。
經過引數共享之後:

  • 影像大小 1000*1000
  • 下一層神經元為 10^6
  • 區域性連線範圍為 10*10
  • 全連線引數為 10 * 10 = 10^2

因為做了引數共享,所以區域性範圍和下一層神經元就沒有關係了。
我們從 1000000000000 個引數變成了 100 個引數,為區域性連線有效呢?這是影像問題本身所決定的。
對於影像問題來說,影像具備很強的區域性。比如愛因斯坦的肖像那張圖中相近的畫素的值很相近,對於額頭、臉頰或者對於嘴部區域,相近的畫素的值都很接近。對於愛因斯坦肖像圖,無論構圖時是把愛因斯坦的臉放在影像中間還是左上左下右上右下,仍然是一張臉。對於臉部特徵來說,構圖位置無論在影像中的哪裡,都是臉部資訊。引數共享提供了這種可能性,使得無論如何構圖,都能用同一組引數進行處理,得到影像是一張臉的事實。如果不用引數共享,很有可能只能得到中間位置的臉,臉部挪到影像邊上去可能就檢測不出來了。

  • 區域性連線
    • 影像的區域性
  • 引數共享
    • 影像特徵與位置無關

小知識點補充:神經網路容量是指可以學習到的資訊量。

卷積操作

卷積 —— 每個位置進行計算

輸入影像:

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

卷積核:

1 0 1
0 1 0
1 0 1

輸出:

? ? ?
? ? ?
? ? ?

卷積核圍繞輸入資料滑動方向為從左往右從上往下滑動

輸出size = 輸入size - 卷積核size + 1
輸出size = 輸入size - (卷積核size - 1)

O_{size}=I_{size}-Convolutionkernel_{size}+1

左上角卷積計算「點積乘法」:

result=1\times1+1\times3+1\times7+1\times11+1\times13=35

得出輸出矩陣的左上角結果:

35 ? ?
? ? ?
? ? ?

第二步卷積計算「點積乘法」:

result=1\times2+1\times4+1\times8+1\times12+1\times14=40

得出輸出矩陣的第二步結果:

35 40 ?
? ? ?
? ? ?

以上卷積核滑動步長預設為 1,如果步長為 2,意味著第一步卷積核對輸入影像的紅色部分進行計算:

1
2
3
4 5
6
7
8
9 10
11
12
13
14 15
16 17 18 19 20
21 22 23 24 25

第一步卷積核對輸入影像的紅色部分進行計算:

1 2
3
4
5
6 7
8
9
10
11 12
13
14
15
16 17 18 19 20
21 22 23 24 25

步長越長,輸出矩陣越小,比如以上輸入影像矩陣經過 3*3 卷積核計算,輸出矩陣大小為 2*2:

result_{step2}=1\cdot3+1\cdot5+1\cdot9+1\cdot13+1\cdot15=45

輸出:

35 45
? ?

步長太大會引發一個問題: 如果是一個深度卷積神經網路,每一層矩陣規格的減小,會使得影像最後消沒了。 這樣的問題有一個解決方法 —— 「Padding」 將輸入影像矩陣外圈補 0。比如以上的輸入資料補成:

0
0
0
0
0
0
0
0
1 2 3 4 5
0
0
6 7 8 9 10
0
0
11 12 13 14 15
0
0
16 17 18 19 20
0
0
21 22 23 24 25
0
0
0
0
0
0
0
0

經過卷積核計算後輸出:

? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?

這樣卷積核的中間點的位活動的位置就變大了,使得輸出可以變得和輸入影像一樣大,甚至可以變得更大,一般情況下,只需要補 0 補到一樣就可以了。

以上輸入的的都單通道的,現實場景中影像是多通道的,比如 RGB 三通道,對於多通道的卷積處理方式:

HzLvsLKbcA.png!large

上圖可以看出一個卷積核可以提取一組特徵,從多通道輸入變成了單通道輸出,但是專案一般都需要多通道輸出:

XIVhWRZaeL.png!large

還有一種操作,輸入通道數為 4,輸出通道數為 2,對每個通道分別做操作,加和到輸出W^1
7wAUW1qicC.png!large

池化操作

最大值池化

輸入影像

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

最大池化核:
Max-pool 操作
Stride = 2
Kernel_size = 2*2

- -
- -

輸出:

7 9
17 19

平均池化核:
Avg-pool 操作
Stride = 2
Kernel_size = 2*2

輸出:

4 6
14 16

池化操作特點:

  • 常使用不重疊、不補零
  • 沒有用於求導的引數
  • 池化層引數為步長和池化核大小
  • 用於減少影像尺寸,從而減少計算量
  • 一定程度平移魯棒
  • 損失了空間位置精度
本作品採用《CC 協議》,轉載必須註明作者和本文連結
不要試圖用百米衝刺的方法完成馬拉松比賽。

相關文章