主要介紹二維卷積層的工作原理
卷積神經網路是含有卷積層的神經網路
在二維卷積層中,乙個二維輸入陣列和乙個二維核陣列通過互相關運算輸出乙個二維陣列。
例如:輸入陣列:3x3的二維陣列
核陣列:2x2的二維陣列 (該陣列在卷積計算中又稱卷積核或過濾器)
在二維互相關運算中,卷積視窗從輸入陣列的最左上方開始,按從左往右、從上往下的順序,依次在輸入陣列上滑動。當卷積視窗滑動到某一位置時,視窗中的輸入子陣列與核陣列按元素相乘並求和,得到輸出陣列中相應位置的元素。
將上述過程實現在corr2d函式裡,它接受輸入陣列x 與核陣列k,並輸出陣列y。
import torch
from torch import nn
defcorr2d
(x, k)
:# 本函式已儲存在d2lzh_pytorch包中方便以後使用
h, w = k.shape
y = torch.zeros(
(x.shape[0]
- h +
1, x.shape[1]
- w +1)
)for i in
range
(y.shape[0]
):for j in
range
(y.shape[1]
):y[i, j]
=(x[i: i + h, j: j + w]
* k)
.sum()
return y
驗證:
x = torch.tensor([[
0,1,
2],[
3,4,
5],[
6,7,
8]])
k = torch.tensor([[
0,1]
,[2,
3]])
corr2d(x, k)
輸出
tensor([[
19.,25
.],[
37.,43
.]])
基於corr2d函式來實現乙個自定義的二維卷積層。在建構函式__init__裡我們宣告weight和bias這兩個模型引數。前向計算函式forward則是直接呼叫corr2d函式再加上偏差。
class
conv2d
(nn.module)
:def
__init__
(self,kernel_size)
:super
(conv2d, self)
.__init__(
) self.weight = nn.parameter(torch.randn(kernel_size)
) self.bias = nn.parameter(torch.randn(1)
)def
forward
(self,x)
:return corr2d(x,self.weight)
+self.bias
卷積視窗形狀為p×q的卷積層成為p×q卷積層。同樣,p×q卷積或p×q卷積核說明卷積核的高和寬分別為p和q。
實際上,卷積運算與互相關運算類似。為了得到卷積運算的輸出,我們只需將核陣列左右翻轉並上下翻轉,再與輸入陣列做互相關運算。可見,卷積運算和互相關運算雖然類似,但如果它們使用相同的核陣列,對於同乙個輸入,輸出往往並不相同。
那麼,你也許會好奇卷積層為何能使用互相關運算替代卷積運算。其實,在深度學習中核陣列都是學出來的:卷積層無論使用互相關運算或卷積運算都不影響模型**時的輸出。
為了與大多數深度學習文獻一致,如無特別說明,本書中提到的卷積運算均指互相關運算。
二維卷積層輸出的二維陣列可以看作是輸入在空間維度(寬和高)上某一級的表徵,也叫特徵圖(feature map)。影響元素x的前向計算的所有可能輸入區域(可能大於輸入的實際尺寸)叫作x的感受野(receptive field)。以上圖為例,輸入中陰影部分的四個元素是輸出中陰影部分元素的感受野。我們將圖5.1中形狀為2×2的輸出記為y,並考慮乙個更深的卷積神經網路:將y與另乙個形狀為2×2的核陣列做互相關運算,輸出單個元素z。那麼,z在y上的感受野包括y的全部四個元素,在輸入上的感受野包括其中全部9個元素。可見,我們可以通過更深的卷積神經網路使特徵圖中單個元素的感受野變得更加廣闊,從而捕捉輸入上更大尺寸的特徵。
5 1 二維卷積層
卷積神經網路 convolutional neural network 是含有卷積層 convolutional layer 的神經網路 二維互相關運算 通常在卷積層中使用更加直觀的互相關 cross correlation 運算,在二維卷積層中,乙個二維輸入陣列和乙個二維核 kernel 陣列通過...
二維矩陣與二維矩陣之間的卷積
最近在學習數字影象處理 digital image processing,dip 這門課,感覺有些吃力。由於在數字訊號處理 digital singal processing,dsp 這門課中只學了一維矩陣之間的卷積運算。假設我們的卷積核h為kernel矩陣 33 待處理矩陣f x,y 為 55 h...
二維卷積詳細解釋
其中,矩陣a和b的尺寸分別為ma na即mb nb 對矩陣a補零,第一行之前和最後一行之後都補mb 1行,第一列之前和最後一列之後都補nb 1列 注意conv2不支援其他的邊界補充選項,函式內部對輸入總是補零 之所以都是 1是因為卷積核要在影象a上面移動,移動的時候需要滿足兩者至少有一列或者一行是重...