理論
- 卷積神經網路
- 卷積操作、池化操作、全連線操作
- 深度可分離卷積
- 資料增強
- 遷移學習
卷積神經網路
「卷積神經網路」主要用於影像方向的深度學習神經網路。
結構
卷積神經網路:
(卷積層 + (可選)池化層) * N + 全連線層 * M
(C_{onvolutionalLayer} + (可選)S_{ubsamplingLayer})*N + D_{enseLayer} * M\\{}\\ N\geqslant1,M\geqslant0
卷積層的輸入和輸出都是矩陣,全連線層的輸入和輸出都是向量,所以最後一層卷積層後要做展平。
「卷積神經網路」適用於分類任務或迴歸任務,一般用於分類任務。
全卷積神經網路:
(卷積層 + (可選)池化層) * N + 反摺積層 * K
(C_{onvolutionalLayer} + (可選)S_{ubsamplingLayer})*N + De_{convolutionLayer} * K\\{}\\ N\geqslant1,M\geqslant0
「全卷積神經網路」適用於物體分割任務,因為輸入和輸出的尺寸是一樣的。
卷積解決的問題
神經網路遇到的問題:
- 引數過多
- 計算資源不足
- 例:影像大小 1000*1000
- 下一層神經元為 10^6
- 全連線引數為 1000 * 1000 * 10^6=10^12
- 一層全連線層就有一萬億個引數,這是現代計算機無法承受的。
- 容易過擬合,需要更多訓練資料
- 計算資源不足
解決方案之「區域性連線」:
上圖中,右側是「區域性連線」:
- 影像大小 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 三通道,對於多通道的卷積處理方式:
上圖可以看出一個卷積核可以提取一組特徵,從多通道輸入變成了單通道輸出,但是專案一般都需要多通道輸出:
還有一種操作,輸入通道數為 4,輸出通道數為 2,對每個通道分別做操作,加和到輸出W^1。
池化操作
最大值池化
輸入影像
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 協議》,轉載必須註明作者和本文連結