参考链接

  1. https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter05_CNN/5.3_channels

多输入通道

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

由于输入和卷积核各有pytorch多个输入 pytorch 多输入多输出_深度学习个通道,我们可以在各个通道上对输入的二维数组和卷积核的二维核数组做互相关运算,再将这pytorch多个输入 pytorch 多输入多输出_深度学习个互相关运算的二维输出按通道相加,得到一个二维数组。这就是含多个通道的输入数据与多输入通道的卷积核做二维互相关运算的输出。

def corr2d_multi_in(X, K):
    # 沿着X和K的第0维(通道维)分别计算再相加
    res = corr2d(X[0, :, :], K[0, :, :])
    for i in range(1, X.shape[0]):
        res += d2l.corr2d(X[i, :, :], K[i, :, :])
    return res

多输出通道

设卷积核输入通道数和输出通道数分别为pytorch多个输入 pytorch 多输入多输出_深度学习pytorch多个输入 pytorch 多输入多输出_pytorch多个输入_04,高和宽分别为pytorch多个输入 pytorch 多输入多输出_卷积_05pytorch多个输入 pytorch 多输入多输出_pytorch多个输入_06如果希望得到含多个通道的输出,我们可以为每个输出通道分别创建形状为pytorch多个输入 pytorch 多输入多输出_pytorch_07的核数组,将它们在输出通道维上连结,卷积核的形状即pytorch多个输入 pytorch 多输入多输出_pytorch_08。在做互相关运算时,每个输出通道上的结果由卷积核在该输出通道上的核数组与整个输入数组计算而来。

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

pytorch多个输入 pytorch 多输入多输出_卷积_09卷积层

实际上,pytorch多个输入 pytorch 多输入多输出_卷积_09卷积的主要计算发生在通道维上。值得注意的是,输入和输出具有相同的高和宽。输出中的每个元素来自输入中在高和宽上相同位置的元素在不同通道之间的按权重累加。假设我们将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么pytorch多个输入 pytorch 多输入多输出_卷积_09卷积层的作用与全连接层等价。

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)

pytorch多个输入 pytorch 多输入多输出_卷积_09卷积层常被当作保持高和宽维度形状不变的全连接层使用。于是,我们可以通过调整网络层之间的通道数来控制模型复杂度。