現(xiàn)在我們了解了卷積層在理論上是如何工作的,我們準(zhǔn)備看看它們?cè)趯?shí)踐中是如何工作的。基于我們將卷積神經(jīng)網(wǎng)絡(luò)作為探索圖像數(shù)據(jù)結(jié)構(gòu)的有效架構(gòu)的動(dòng)機(jī),我們堅(jiān)持使用圖像作為我們的運(yùn)行示例。
7.2.1. 互相關(guān)運(yùn)算
回想一下,嚴(yán)格來(lái)說(shuō),卷積層是用詞不當(dāng),因?yàn)樗鼈儽磉_(dá)的操作更準(zhǔn)確地描述為互相關(guān)。根據(jù)我們?cè)?7.1 節(jié)中對(duì)卷積層的描述,在這樣的層中,輸入張量和核張量通過(guò)互相關(guān)運(yùn)算組合以產(chǎn)生輸出張量。
讓我們暫時(shí)忽略通道,看看它如何處理二維數(shù)據(jù)和隱藏表示。在 圖 7.2.1中,輸入是一個(gè)二維張量,高為 3,寬為 3。我們將張量的形狀標(biāo)記為 3×3或者 (3,3). kernel的高和寬都是2,kernel window(或者卷積窗口)的形狀由kernel的高和寬給定(這里是 2×2).
在二維互相關(guān)操作中,我們從位于輸入張量左上角的卷積窗口開(kāi)始,將其從左到右和從上到下滑動(dòng)到輸入張量上。當(dāng)卷積窗口滑動(dòng)到某個(gè)位置時(shí),包含在該窗口中的輸入子張量和核張量逐元素相乘,所得張量相加產(chǎn)生單個(gè)標(biāo)量值。這個(gè)結(jié)果給出了相應(yīng)位置的輸出張量的值。這里,輸出張量的高度為 2,寬度為 2,四個(gè)元素由二維互相關(guān)運(yùn)算得出:
請(qǐng)注意,沿每個(gè)軸,輸出大小略小于輸入大小。因?yàn)閮?nèi)核的寬度和高度大于一,我們只能正確計(jì)算內(nèi)核完全適合圖像的位置的互相關(guān),輸出大小由輸入大小給出nh×nw減去卷積核的大小kh×kw通過(guò)
之所以如此,是因?yàn)槲覀冃枰銐虻目臻g來(lái)“移動(dòng)”圖像上的卷積核。稍后我們將看到如何通過(guò)在圖像邊界周?chē)畛淞銇?lái)保持大小不變??,以便有足夠的空間來(lái)移動(dòng)內(nèi)核。接下來(lái),我們?cè)诤瘮?shù)中實(shí)現(xiàn)這個(gè)過(guò)程corr2d
,它接受一個(gè)輸入張量X
和一個(gè)內(nèi)核張量K
并返回一個(gè)輸出張量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構(gòu)造輸入張量X
和核張量來(lái)驗(yàn)證上述二維互相關(guān)運(yùn)算的實(shí)現(xiàn)的輸出。
評(píng)論
查看更多