文章目录

  • 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. 多输入通道

当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。

两个输入通道的互相关计算。

多通道发送消息 java 多通道输出_多通道发送消息 java

为了加深理解,我们实现一下多输入通道互相关运算。 简而言之,我们所做的就是对每个通道执行互相关操作,然后将结果相加

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. 小结

  • 多输入多输出通道可以用来扩展卷积层的模型。
  • 当以每像素为基础应用时,卷积层相当于全连接层。
  • 卷积层通常用于调整网络层的通道数量和控制模型复杂性。