• 卷积神经网络 -多输入多输出通道


    多输入多输出通道

    每个RGB输入图像具有 3 ∗ h ∗ w 3 * h * w 3hw的形状。我们将这个大小为3的轴称为通道(channel)维度。在本节中,我们将更深入地研究具有多输入和多输出通道的卷积核

    1 - 多输入通道

    import torch
    from d2l import torch as d2l
    
    • 1
    • 2
    def corr2d_multi_in(X,K):
        # 先遍历"X"和"K"的第0个维度(通道维度),再把它们加在一起
        return sum(d2l.corr2d(x,k) for x,k in zip(X,K))
    
    • 1
    • 2
    • 3

    我们可以构造与图6.4.1中的值相对应的输入张量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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    tensor([[ 56.,  72.],
            [104., 120.]])
    
    • 1
    • 2

    2 - 多输出通道

    到目前为止,不论有多少输入通道,我们还只有一个输出通道。然而,正如我们在6.1.4节中所讨论的,每一层有多个输出通道时至关重要的。在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分别率以获得更大的通道深度。直观地说,我们可以将每个通道看作是对不同特征的响应。而现实可能更为复杂一些,因为每个通道不是独立学习的,而是为了共同使用而优化的。因此,多输出通道并不仅是学习多个单通道的检测器

    def corr2d_multi_in_out(X,K):
        # 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算
        # 最后将所有结果都叠加在一起
        return torch.stack([corr2d_multi_in(X,k) for k in K],0)
    
    • 1
    • 2
    • 3
    • 4

    通过将核张量K与K+1(K中每个元素+1)和K+2连接起来,构造了一个具有3个输出通道的卷积核

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

    下面,我们对输入张量X与卷积核张量K执行互相关运算。现在的输出包含3个通道,第一个通道的结果与先前输入张量X和多输入单输出通道的结果一致

    corr2d_multi_in_out(X,K)
    
    • 1
    tensor([[[ 56.,  72.],
             [104., 120.]],
    
            [[ 76., 100.],
             [148., 172.]],
    
            [[ 96., 128.],
             [192., 224.]]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3 - 1 * 1卷积层

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    当 1 * 1 卷积运算时,上述函数相当于先前实现的互相关函数corr2d_multi_in_out。让我们用一些样本数据来验证这一点

    X = torch.normal(0,1,(3,3,3))
    K = torch.normal(0,1,(2,3,1,1))
    
    • 1
    • 2
    Y1 = corr2d_multi_in_out_1x1(X, K)
    Y2 = corr2d_multi_in_out(X, K)
    assert float(torch.abs(Y1 - Y2).sum()) < 1e-6
    
    • 1
    • 2
    • 3

    4 - 小结

    • 多输入多输出通道可以用来扩展卷积层的模型
    • 当以每像素为基础应用时,1 * 1卷积层相当于全连接层
    • 1 * 1卷积层通常用于调整网络层的通道数量和控制模型复杂性
  • 相关阅读:
    vue3(h5适配)做个记录,避免自己以后忘了哈哈
    小分子CDK9抑制剂 | MedChemExpress
    减轻压力保护脊椎,上学路上更轻松,Deuter多特护脊减负双肩背包体验
    springboot+实验课程辅助管理系统 毕业设计-附源码191113
    SkipList(跳表)
    Vue2 Vue3对比
    梁建章:旅行重回全球时代主题 构建“创新与传承”大场景
    MyBatisPlus中使用@TableField完成字段自动填充
    Leecode刷题 Day7----------哈希表
    双指针算法_移动零_
  • 原文地址:https://blog.csdn.net/mynameisgt/article/details/126908981