21 卷積層里的多輸入多輸出通道【動手學深度學習v2】

多輸入通道:
多通道用于提取圖片內的不同特征信息,是比較重要的超參數(shù)

對于不同的通道,使用不同的卷積核進行處理

c:channel,通道數(shù)
卷積核數(shù)等于輸入通道數(shù),輸出通道為1

多輸出通道:使用多個三維卷積核

多通道卷積輸入和輸出的意義:
不同的輸出通道可以識別特定的圖形模式(比如不同的顏色、不同方向的紋理等)

特殊卷積核:1*1卷積核,不識別矩陣的空間信息,相當于將每個通道輸入的矩陣拉成一個向量進行處理。



代碼實現(xiàn):
import torch from d2l import torch as d2l def corr2d_multi_in(X, K): # 先遍歷“X”和“K”的第0個維度(通道維度),再把它們加在一起 return sum(d2l.corr2d(x, k) for x, k in zip(X, K))
zip(X, K)函數(shù)可以將X和K的每個通道配對,返回一個可迭代對象,其中每個元素是一個(x, k)的元組,表示一個輸入通道和一個卷積核。
驗證函數(shù)功能(單通道輸出)
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]], [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]]) K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]]) corr2d_multi_in(X, K)
tensor([[ 56., 72.], [104., 120.]])
計算多個通道輸出的互相關函數(shù)(互相關運算即為卷積運算)
def corr2d_multi_in_out(X, K): # 迭代“K”的第0個維度,每次都對輸入“X”執(zhí)行互相關運算。 # 最后將所有結果都疊加在一起 return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
通過將核張量K
與K+1
(K
中每個元素加1)和K+2
連接起來,構造了一個具有3個輸出通道的卷積核。
K = torch.stack((K, K + 1, K + 2), 0) K.shape
torch.Size([3, 2, 2, 2])
下面,我們對輸入張量X
與卷積核張量K
執(zhí)行互相關運算。現(xiàn)在的輸出包含3個通道,第一個通道的結果與先前輸入張量X
和多輸入單輸出通道的結果一致。
corr2d_multi_in_out(X, K)
tensor([[[ 56., 72.], [104., 120.]], [[ 76., 100.], [148., 172.]], [[ 96., 128.], [192., 224.]]])
1*1卷積核的情況
下面,我們使用全連接層實現(xiàn)1×1
卷積。 請注意,我們需要對輸入和輸出的數(shù)據(jù)形狀進行調整。
def corr2d_multi_in_out_1x1(X, K): c_i, h, w = X.shape c_o = K.shape[0] X = X.reshape((c_i, h * w)) K = K.reshape((c_o, c_i)) # 全連接層中的矩陣乘法 Y = torch.matmul(K, X) return Y.reshape((c_o, h, w))
當執(zhí)行1×1
卷積運算時,上述函數(shù)相當于先前實現(xiàn)的互相關函數(shù)corr2d_multi_in_out
。讓我們用一些樣本數(shù)據(jù)來驗證這一點。
X = torch.normal(0, 1, (3, 3, 3)) K = torch.normal(0, 1, (2, 3, 1, 1)) Y1 = corr2d_multi_in_out_1x1(X, K) Y2 = corr2d_multi_in_out(X, K) assert float(torch.abs(Y1 - Y2).sum()) < 1e-6
Pytorch簡潔調用版

知識補充:
padding 0過多不會影響模型性能
標簽: