1. 程式人生 > 實用技巧 >神經網路基本組成 - 卷積層 11

神經網路基本組成 - 卷積層 11

  當前的物體檢測演算法雖然各不相同, 但第一步通常是利用卷積神經網路處理輸入影象, 生成深層的特徵圖, 然後再利用各種演算法完成區域生成與損失計算, 這部分卷積神經網路是整個檢測演算法的骨架, 也被稱為Backbone

  Backbone是物體檢測技術的基礎, 其中也湧現出了多種經典的結構, 如VGGNetResNetDenseNet等, 如圖3.1所示。

本章首先介紹網路骨架的基本組成單元, 然後依次講解各種經典的網路Backbone, 為後續的物體檢測演算法奠定基礎。

1. 神經網路基本組成
物體檢測演算法使用的通常是包含卷積計算且具有深度結構的前饋神經網路, 如卷積層、 池化層、 全連線層等不同的基本層, 這些層有著不同的作用, 如圖3.2所示。 本節將針對物體檢測演算法中常用的網路層進行一一介紹。

1) 卷積層

卷積本是分析數學中的一種運算, 在深度學習中使用的卷積運算通常是離散的。 作為卷積神經網路中最基礎的組成部分, 卷積的本質是用卷積核的引數來提取資料的特徵, 通過矩陣點乘運算與求和運算來得到結果。

如圖3.3所示為一個基本二維卷積的運算過程, 公式為y=ωx+b。 這裡的特徵圖(x) 大小為1×5×5, 即輸入通道數為1, 卷積核(ω) 的大小為3×3, 偏置(b) 為1, 為保證輸出維度和輸入特徵維度一致, 還需要有填充(padding) , 這裡使用zero-padding, 即用0來填充。

卷積核引數與對應位置畫素逐位相乘後累加作為一次計算結果。 以圖3.3左上角為例, 其計算過程為1×0+0×0+1×0+0×0+1×1+0×8+1×0+0×6+1×7+1=9, 然後在特徵圖上進行滑動, 即可得到所有的計算結果。

PyTorch中使用卷積非常簡單, 接下來從程式碼角度介紹如何完成卷積操作。

 1 import torch 
 2 from torch import nn
 3 
 4 # 檢視卷積核的基本資訊, 本質上是一個Module
 5 conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, stride=1,
 6             padding=1, dilation=1, groups=1, bias=True)
 7 print(conv)
 8 # >> Conv2d(1, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
9 10 # 通過.weight與.bias檢視卷積核的權重與偏置 11 print(conv.weight.shape) 12 # >> torch.Size([1]) 13 print(conv.bias.shape) 14 15 16 # 輸入特徵圖, 需要注意特徵必須是四維, 第一維作為batch數, 即使是1也要保留 17 # batch*channels*W*H 18 input = torch.ones(1, 1, 5, 5) 19 output = conv(input) 20 21 # 當前配置的卷積核可以使輸入和輸出的大小一致 22 print(input.shape) 23 >> torch.Size([1, 1, 5, 5]) 24 print(output.shape) 25 >> torch.Size([1, 1, 5, 5])
View Code

對於torch.nn.Conv2d()來說, 傳入的引數含義如下:
·in_channels: 輸入特徵圖的通道數, 如果是RGB影象, 則通道數為3。 卷積中的特徵圖通道數一般是2的整數次冪。
·out_channels: 輸出特徵圖的通道數。
·kernel_size: 卷積核的尺寸, 常見的有1357
·stride: 步長, 即卷積核在特徵圖上滑動的步長, 一般為1。 如果大於1, 則輸出特徵圖的尺寸會小於輸入特徵圖的尺寸。
·padding: 填充, 常見的有零填充、 邊緣填充等, PyTorch預設為零填充。

·dilation: 空洞卷積, 當大於1時可以增大感受野的同時保持特徵圖的尺寸( 後面會細講) , 預設為1
·groups: 可實現組卷積, 即在卷積操作時不是逐點卷積, 而是將輸入通道分為多個組, 稀疏連線達到降低計算量的目的( 後續會細講) ,預設為1
·bias: 是否需要偏置, 預設為True。在實際使用中, 特徵圖的維度通常都不是1, 假設輸入特徵圖維度為m×win×hin, 輸出特徵圖維度為n×wout×hout, 則卷積核的維度為
n×m×k×k, 在此產生的乘法操作次數為n×wout×hout×m×k×k

2.