多输⼊通道和多输出通道

《动手学深度学习pytorch》部分学习笔记,仅用作自己复习。

 多输入通道和多输出通道

前⾯两节里我们⽤到的输入和输出都是二维数组,但真实数据的维度经常更高。例如,彩色图像在⾼和宽2个维度外还有RGB(红、绿、蓝)3个颜⾊通道。假设彩色图像的⾼和宽分别是 h和 w(像素),那么它可以表示为⼀个 的多维数组。我们将⼤小为3的这⼀维称为通道(channel)维。本节我们将介绍含多个输入通道或多个输出通道的卷积核。

多输⼊通道

当输⼊数据含多个通道时,我们需要构造⼀个输⼊通道数与输入数据的通道数相同的卷积核,从⽽能够与含多通道的输入数据做互相关运算。

图5.4展示了了含2个输⼊通道的⼆维互相关计算的例子。在每个通道上,⼆维输⼊数组与⼆维核数组做互相关运算,再按通道相加即得到输出。

接下来我们实现含多个输入通道的互相关运算。我们只需要对每个通道做互相关运算,然后通过add_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维(通道维)分别计算再相加
    res = d2l.corr2d(X[0, :, :], K[0, :, :])
    for i in range(1, X.shape[0]):
        res += d2l.corr2d(X[i, :, :], K[i, :, :])
    return res

我们可以构造图5.4中的输⼊数组 X 、核数组 K 来验证互相关运算的输出。 

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.]])

多输出通道

实现⼀个互相关运算函数来计算多个通道的输出。

def corr2d_multi_in_out(X, K):
# 对K的第0维遍历,每次同输⼊X做互相关计算。所有结果使用stack函数合并在一起
    return torch.stack([corr2d_multi_in(X, k) for k in K])

我们将核数组 K 同 K+1 ( K 中每个元素加⼀)和 K+2 连结在⼀起来构造一个输出通道数为3的卷积核。

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

下⾯面我们对输⼊入数组 X 与核数组 K 做互相关运算。此时的输出含有3个通道。其中第⼀个通道的结果与之前输⼊数组 X 与多输⼊通道、单输出通道核的计算结果一致。

corr2d_multi_in_out(X, K) 

输出:

tensor([[[ 56., 72.],
[104., 120.]],
[[ 76., 100.],
[148., 172.]],
[[ 96., 128.],
[192., 224.]]])

1X1 卷积层

最后我们讨论卷积窗口形状为 ( 1x1)的多通道卷积层。我们通常称之为 1X1卷积层,并将其中的卷积运算称为 1X1卷积。因为使⽤了最小窗口, 卷积失去了卷积层可以识别高和宽维度上相邻元素构成的模式的功能。实际上,1x1 卷积的主要计算发生在通道维上。图5.5展示了使用输⼊通道数为3、输出通道数为2的 卷积核的互相关计算。值得注意的是,输⼊和输出具有相同的⾼和宽。输出中的每个元素来⾃输入中在⾼和宽上相同位置的元素在不同通道之间的按权重累加。假设我们将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么1x1 卷积层的作⽤与全连接层等价。

下⾯我们使用全连接层中的矩阵乘法来实现1x1 卷积。这⾥需要在矩阵乘法运算前后对数据形状做⼀些调整。

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)

经验证,做1x1 卷积时,以上函数与之前实现的互相关运算函数 corr2d_multi_in_out 等价。

输出:True

在之后的模型里我们将会看到1x1 卷积层被当作保持⾼和宽维度形状不变的全连接层使用。于是,我们可以通过调整⽹络层之间的通道数来控制模型复杂度。

小结

  • 使用多通道可以拓展卷积层的模型参数。
  • 假设将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么1x1 卷积层的作用与全连接层等价。
  • 1x1卷积层通常⽤来调整⽹络层之间的通道数,并控制模型复杂度。

猜你喜欢

转载自blog.csdn.net/dujuancao11/article/details/108491029