5.3 多輸入通道和多輸出通道
前面兩節(jié)里我們用到的輸入和輸出都是二維數(shù)組割卖,但真實(shí)數(shù)據(jù)的維度經(jīng)常更高霹俺。例如,彩色圖像在高和寬2個維度外還有RGB(紅杏节、綠频轿、藍(lán))3個顏色通道。假設(shè)彩色圖像的高和寬分別是h和w(像素)余黎,那么它可以表示為一個3×h×w的多維數(shù)組颖侄。我們將大小為3的這一維稱為通道(channel)維鸟雏。本節(jié)我們將介紹含多個輸入通道或多個輸出通道的卷積核。
5.3.1 多輸入通道
接下來我們實(shí)現(xiàn)含多個輸入通道的互相關(guān)運(yùn)算览祖。我們只需要對每個通道做互相關(guān)運(yùn)算孝鹊,然后通過
add_n
函數(shù)來進(jìn)行累加。
import torch
from torch import nn
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
def corr2d_multi_in(X, K):
# 沿著X和K的第0維(通道維)分別計(jì)算再相加
res = d2l.corr2d(X[0, :, :], K[0, :, :])
for i in range(1, X.shape[0]):
res += d2l.corr2d(X[i, :, :], K[i, :, :])
return res
我們可以構(gòu)造圖5.4中的輸入數(shù)組X
展蒂、核數(shù)組K
來驗(yàn)證互相關(guān)運(yùn)算的輸出又活。
X = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]])
K = torch.tensor([[[0, 1], [2, 3]], [[1, 2], [3, 4]]])
corr2d_multi_in(X, K)
輸出:
tensor([[ 56., 72.],
[104., 120.]])
5.3.2 多輸出通道
下面我們實(shí)現(xiàn)一個互相關(guān)運(yùn)算函數(shù)來計(jì)算多個通道的輸出。
def corr2d_multi_in_out(X, K):
# 對K的第0維遍歷锰悼,每次同輸入X做互相關(guān)計(jì)算柳骄。所有結(jié)果使用stack函數(shù)合并在一起
return torch.stack([corr2d_multi_in(X, k) for k in K])
我們將核數(shù)組K同K+1(K中每個元素加一)和K+2連結(jié)在一起來構(gòu)造一個輸出通道數(shù)為3的卷積核。
K = torch.stack([K, K + 1, K + 2])
K.shape # torch.Size([3, 2, 2, 2])
下面我們對輸入數(shù)組X與核數(shù)組K做互相關(guān)運(yùn)算箕般。此時的輸出含有3個通道耐薯。其中第一個通道的結(jié)果與之前輸入數(shù)組X與多輸入通道、單輸出通道核的計(jì)算結(jié)果一致隘世。
corr2d_multi_in_out(X, K)
輸出:
tensor([[[ 56., 72.],
[104., 120.]],
[[ 76., 100.],
[148., 172.]],
[[ 96., 128.],
[192., 224.]]])
5.3.3 1×1卷積層
下面我們使用全連接層中的矩陣乘法來實(shí)現(xiàn)1×1卷積。這里需要在矩陣乘法運(yùn)算前后對數(shù)據(jù)形狀做一些調(diào)整丙者。
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)
經(jīng)驗(yàn)證复斥,做1×1卷積時,以上函數(shù)與之前實(shí)現(xiàn)的互相關(guān)運(yùn)算函數(shù)corr2d_multi_in_out
等價械媒。
X = torch.rand(3, 3, 3)
K = torch.rand(2, 3, 1, 1)
Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)
(Y1 - Y2).norm().item() < 1e-6
輸出:
True
在之后的模型里我們將會看到1×1卷積層被當(dāng)作保持高和寬維度形狀不變的全連接層使用目锭。于是,我們可以通過調(diào)整網(wǎng)絡(luò)層之間的通道數(shù)來控制模型復(fù)雜度纷捞。
小結(jié)
- 使用多通道可以拓展卷積層的模型參數(shù)痢虹。
- 假設(shè)將通道維當(dāng)作特征維,將高和寬維度上的元素當(dāng)成數(shù)據(jù)樣本主儡,那么1×1卷積層的作用與全連接層等價奖唯。
- 1×1卷積層通常用來調(diào)整網(wǎng)絡(luò)層之間的通道數(shù),并控制模型復(fù)雜度糜值。
注:除代碼外本節(jié)與原書此節(jié)基本相同丰捷,原書傳送門