文章目录
- 6.4. 多输入多输出通道
- 6.4.1. 多输入通道
- 6.4.2. 多输出通道
- 6.4.3. 1 X 1 卷积层
- 6.4.4. 小结
6.4. 多输入多输出通道
当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如,每个RGB输入图像具有3 x h X w的形状。我们将这个大小为3的轴称为通道(channel)维度
6.4.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和核张量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]]])
corr2d_multi_in(X, K)
# result
tensor([[ 56., 72.],
[104., 120.]])
6.4.2. 多输出通道
如下所示,我们实现一个计算多个通道的输出的互相关函数。
def corr2d_multi_in_out(X, K):
# 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
# 最后将所有结果都叠加在一起
return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
通过将核张量K与K+1(K中每个元素加)和K+2连接起来,构造了一个具有个输出通道的卷积核
K = torch.stack((K, K + 1, K + 2), 0)
K.shape
# result
torch.Size([3, 2, 2, 2])
下面,我们对输入张量X与卷积核张量K执行互相关运算。
现在的输出包含个通道,第一个通道的结果与先前输入张量X和多输入单输出通道的结果一致。
corr2d_multi_in_out(X, K)
# result
tensor([[[ 56., 72.],
[104., 120.]],
[[ 76., 100.],
[148., 172.]],
[[ 96., 128.],
[192., 224.]]])
6.4.3. 1 X 1 卷积层
为使用了最小窗口, 1 X 1卷积失去了卷积层的特有能力——在高度和宽度维度上,识别相邻元素间相互作用的能力。
其实 1 X 1卷积的唯一计算发生在通道上。
互相关计算使用了具有3个输入通道和2个输出通道的 1 X 1 卷积核。其中,输入和输出具有相同的高度和宽度。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDkZbE46-1663774165964)(https://zh.d2l.ai/_images/conv-1x1.svg)]
下面,我们使用全连接层实现1X1 卷积。 请注意,我们需要对输入和输出的数据形状进行调整。
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))
# 当执行卷积运算时,上述函数相当于先前实现的互相关函数corr2d_multi_in_out。让我们用一些样本数据来验证这一点
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
6.4.4. 小结
- 多输入多输出通道可以用来扩展卷积层的模型。
- 当以每像素为基础应用时,卷积层相当于全连接层。
- 卷积层通常用于调整网络层的通道数量和控制模型复杂性。