多输入通道和多输出通道



真实数据的维度通常很高。例如,彩色图像在高、宽 \(2\) 个维度外还有 \(RGB\)(红、绿、蓝)\(3\) 个颜色通道。我们将大小为 \(3\) 称为通道数(\(channel\))。



1. 多输入通道

卷积核的通道数要和输入通道数一样才能进行互相关运算。

计算过程:先在每个通道上,做互相关运算;再按通道相加得到输出。

示例:\(2\) 个输入通道的二维互相关计算。

\((1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56\)

import torch
from d2l import torch as d2l

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

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
print(corr2d_multi_in(X, K))
tensor([[ 56.,  72.],
        [104., 120.]])


2. 多输出通道

当输入通道有多个时,因为对各个通道的结果做了累加,所以不论输入通道数是多少,输出通道数总是为 \(1\)

这个时候可以用多个核去做互相关运算,输出即为多通道的结果,用几个核就有几个通道。

示例:实现一个互相关运算函数来计算多个通道的输出。

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

K = torch.stack([K, K + 1, K + 2], dim=0)
# print(K.shape)      # torch.Size([3, 2, 2, 2])
print(corr2d_multi_in_out(X, K))
tensor([[[ 56.,  72.],
         [104., 120.]],

        [[ 76., 100.],
         [148., 172.]],

        [[ 96., 128.],
         [192., 224.]]])

将数组 \(K\)\(K+1\)\(K+2\) 连接在一起来构造一个输出通道数为 \(3\) 的卷积核。



3. 1x1 卷积层

\(1 \times 1\) 卷积的主要计算发生在通道维上。图 \(5.5\) 展示了使用输入通道数为 \(3\)、输出通道数为 \(2\)\(1\times1\) 卷积核的互相关计算。值得注意的是,输入和输出具有相同的高、宽。输出中的每个元素来自输入中在高和宽上相同位置的元素在不同通道之间的按权重累加。假设将通道维当作特征维,将高、宽维度上的元素当成数据样本,那么 \(1\times 1\) 卷积层的作用与全连接层等价。

示例:使用全连接层中的矩阵乘法实现 \(1 \times 1\) 卷积。这里需要在矩阵乘法运算前后对数据形状做调整。

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)

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)

print((Y1 - Y2).norm().item() < 1e-6)   

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

总结:

  • 使用多通道可以扩展卷积层的模型参数。

  • 假设将通道维当做特征维,将高、宽维度上的元素当成数据样本,那么 \(1 \times 1\) 卷积层的作用与全连接层等价。

  • \(1 \times 1\) 卷积层通常用来调整网络层之间的通道数,并控制模型复杂度。

来自:《动手学深度学习》

posted @ 2022-12-28 12:52  做梦当财神  阅读(197)  评论(0编辑  收藏  举报