PyTorch 多通道卷積

2021-10-25 17:12:03 字數 1651 閱讀 5879

當輸入資料含多個通道時,我們需要構造乙個輸入通道數與輸入資料的通道數相同的卷積核,從而能夠與含多通道的輸入資料做互相關運算。

由於輸入和卷積核各有cic_

ci​個通道,我們可以在各個通道上對輸入的二維陣列和卷積核的二維核陣列做互相關運算,再將這cic_

ci​個互相關運算的二維輸出按通道相加,得到乙個二維陣列。這就是含多個通道的輸入資料與多輸入通道的卷積核做二維互相關運算的輸出。

def

corr2d_multi_in

(x, k)

:# 沿著x和k的第0維(通道維)分別計算再相加

res = corr2d(x[0,

:,:]

, k[0,

:,:]

)for i in

range(1

, x.shape[0]

):res += d2l.corr2d(x[i,:,

:], k[i,:,

:])return res

設卷積核輸入通道數和輸出通道數分別為cic_

ci​和coc_

co​,高和寬分別為khk_

kh​和kwk_

kw​如果希望得到含多個通道的輸出,我們可以為每個輸出通道分別建立形狀為ci×

kh×k

wc_\times k_\times k_

ci​×kh

​×kw

​的核陣列,將它們在輸出通道維上鏈結,卷積核的形狀即co×

ci×k

h×kw

c_\times c_\times k_\times k_

co​×ci

​×kh

​×kw

​。在做互相關運算時,每個輸出通道上的結果由卷積核在該輸出通道上的核陣列與整個輸入陣列計算而來。

def

corr2d_multi_in_out

(x, k)

:# 對k的第0維遍歷,每次同輸入x做互相關計算。所有結果使用stack函式合併在一起

return torch.stack(

[corr2d_multi_in(x, k)

for k in k]

)

實際上,1×1

1\times 1

1×1卷積的主要計算發生在通道維上。值得注意的是,輸入和輸出具有相同的高和寬。輸出中的每個元素來自輸入中在高和寬上相同位置的元素在不同通道之間的按權重累加。假設我們將通道維當作特徵維,將高和寬維度上的元素當成資料樣本,那麼1×1

1\times 1

1×1卷積層的作用與全連線層等價。

def

corr2d_multi_in_out_1x1

(x, k)

: c_i, h, w = x.shape

c_o = k.shape[0]

x = x.view(c_i, h * w)

k = k.view(c_o, c_i)

y = torch.mm(k, x)

# 全連線層的矩陣乘法

return y.view(c_o, h, w)

1×1

1\times 1

1×1卷積層常被當作保持高和寬維度形狀不變的全連線層使用。於是,我們可以通過調整網路層之間的通道數來控制模型複雜度。

多通道卷積計算

對於單通道影象,若利用10個卷積核進行卷積計算,可以得到10個特徵圖 若輸入為多通道影象,則輸出特徵圖的個數依然是卷積核的個數 10個 1.單通道多個卷積核卷積計算 乙個卷積核得到的特徵提取是不充分的,我們可以新增多個卷積核,比如32個卷積核,從而可以學習32種特徵。2.多通道多個卷積核卷積計算 假...

單通道和多通道卷積

卷積之後的通道數只是取決於卷積核的數目,和卷積核的channel無關,卷積核的channel是和輸入的channel保持一致的。對於單通道影象,若利用10個卷積核進行卷積計算,可以得到10個特徵圖 若輸入為多通道影象,則輸出特徵圖的個數依然是卷積核的個數 10個 1.單通道多個卷積核卷積計算 乙個卷...

多通道卷積引數的計算

input 3,32,32 3通道,大小為32 32的影象 output 32,30,30 32通道,大小為30 30的影象 卷積過程說明 kernel size 3,3 stride 1,1 padding 0 最終的卷積引數計算結果是 3 3 3 32 32 896 這個值是怎麼計算得出的?輸入...