現在我們了解了卷積層在理論上是如何工作的,我們準備看看它們在實踐中是如何工作的。基于我們將卷積神經網絡作為探索圖像數據結構的有效架構的動機,我們堅持使用圖像作為我們的運行示例。
7.2.1. 互相關運算
回想一下,嚴格來說,卷積層是用詞不當,因為它們表達的操作更準確地描述為互相關。根據我們在 7.1 節中對卷積層的描述,在這樣的層中,輸入張量和核張量通過互相關運算組合以產生輸出張量。
讓我們暫時忽略通道,看看它如何處理二維數據和隱藏表示。在 圖 7.2.1中,輸入是一個二維張量,高為 3,寬為 3。我們將張量的形狀標記為 3×3或者 (3,3). kernel的高和寬都是2,kernel window(或者卷積窗口)的形狀由kernel的高和寬給定(這里是 2×2).
在二維互相關操作中,我們從位于輸入張量左上角的卷積窗口開始,將其從左到右和從上到下滑動到輸入張量上。當卷積窗口滑動到某個位置時,包含在該窗口中的輸入子張量和核張量逐元素相乘,所得張量相加產生單個標量值。這個結果給出了相應位置的輸出張量的值。這里,輸出張量的高度為 2,寬度為 2,四個元素由二維互相關運算得出:
請注意,沿每個軸,輸出大小略小于輸入大小。因為內核的寬度和高度大于一,我們只能正確計算內核完全適合圖像的位置的互相關,輸出大小由輸入大小給出nh×nw減去卷積核的大小kh×kw通過
之所以如此,是因為我們需要足夠的空間來“移動”圖像上的卷積核。稍后我們將看到如何通過在圖像邊界周圍填充零來保持大小不變??,以便有足夠的空間來移動內核。接下來,我們在函數中實現這個過程corr2d
,它接受一個輸入張量X
和一個內核張量K
并返回一個輸出張量Y
。
def corr2d(X, K): #@save
"""Compute 2D cross-correlation."""
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
我們可以從 圖 7.2.1構造輸入張量X
和核張量來驗證上述二維互相關運算的實現的輸出。
評論
查看更多