c

0

c_0

c0和一个

c

1

×

f

×

f

×

c

0

c_1\times f\times f\times c_0

c1×f×f×c0的卷积核进行处理,得到一个

(

n

f

1

×

c

1

)

×

(

n

f

1

×

c

1

)

(n-f+1\times c_1)\times (n-f+1 \times c_1)

(n−f+1×c1)×(n−f+1×c1)的输出。

3.代码实现

3.1 多通道输入实现

# 导入相关库
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))

我们测试一下结果

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]]])
X.shape,K.shape
(torch.Size([2, 3, 3]), torch.Size([2, 2, 2]))

可以看出,输入是一个2通道

3
×
3
3\times3
3×3的数据,卷积核是
2
×
2
×
2
2\times2\times2
2×2×2,得到的结果为
2
×
2
2\times2
2×2。
corr2d_multi_in(X, K)
tensor([[ 56.,  72.],
        [104., 120.]])

3.2 多通道输出实现

定义多通道输出函数

def corr2d\_multi\_in\_out(X, K):
    # 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
    # 最后将所有结果都叠加在一起,注意,这里我们只对K进行遍历
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

使用stack将卷积核堆叠

K = torch.stack((K, K + 1, K + 2), 0)
K.shape
torch.Size([3, 2, 2, 2])