当前位置:   article > 正文

21 卷积层里的多输入多输出通道 [动手学深度学习v2]_手动深度学习 多输出通道

手动深度学习 多输出通道
  1. 多个输入通道:每个通道都有一个卷积核,结果是所有通道卷积结果的和

    输入 X \mathbf{X} X c i × n h × n w c_i \times n_h \times n_w ci×nh×nw

    W \mathbf{W} W c i × k h × k w c_i \times k_h \times k_w ci×kh×kw

    输出 Y \mathbf{Y} Y m h × m w m_h \times m_w mh×mw
    Y = ∑ i = 0 c i X i , : , : ∗ ⋆ W i , : , : \mathbf{Y}=\sum_{i=0}^{c_{i}} \mathbf{X}_{i,:,:}^{*} \star \mathbf{W}_{i,:,:} Y=i=0ciXi,:,:Wi,:,:

  2. 多个输出通道:我们可以有多个三维卷积核,每个核生成一个输出通道

    输入 X \mathbf{X} X c i × n h × n w c_i \times n_h \times n_w ci×nh×nw

    W \mathbf{W} W c o × c i × k h × k w c_o \times c_i \times k_h \times k_w co×ci×kh×kw

    输出 Y \mathbf{Y} Y c o × m h × m w c_o \times m_h \times m_w co×mh×mw
    Y i , : , : = X ⋆ W i , , : , :  for  i = 1 , … , c o \mathbf{Y}_{i,:,:}=\mathbf{X} \star \mathbf{W}_{i,,:,:} \quad \text { for } i=1, \ldots, c_{o} Yi,:,:=XWi,,:,: for i=1,,co
    计算复杂度(浮点计算数FLOP): O ( c i c o k h k w m h m w ) O(c_i c_o k_h k_w m_h m_w) O(cicokhkwmhmw)

  3. 多个输入通道和输出通道

    • 每个输出通道可以识别特定模式
    • 输入通道识别并组合输入中的模式
  4. 1 x 1卷积层

    k h = k w = 1 k_h = k_w = 1 kh=kw=1是一个受欢迎的选择。它不识别空间模式,只是融合通道。

    相当于输入形状为 n h n w × c i n_h n_w \times c_i nhnw×ci,权重为 c o × c i c_o \times c_i co×ci的全连接层。

  5. 输出通道数是卷积层的超参数;每个输入通道有独立的二维卷积核,所有的通道结果相加得到一个输出通道结果;每个输出通道有独立的三维卷积核。

  6. 多输入通道互相关运算

    import torch
    
    def corr2d(X, K):
        """计算二维互相关运算"""
        h, w = K.shape
        Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
        for i in range(Y.shape[0]):
            for j in range(Y.shape[1]):
                Y[i, j] = (X[i:i + h, j:j + w] * K).sum()
         return Y
    
    
    def corr2d_multi_in(X, K):
        # X[c_i, n_h, n_w], K[c_i, k_h, k_w]
        # for遍历的时候会对最外层的维度做遍历
        return sum(corr2d(x, k) for x, k in zip(X, K))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  7. 多输入多输出通道互相关运算

    import torch
    
    def corr2d_multi_in_out(X, K):
        # X[c_i, n_h, n_w], K[c_o, c_i, k_h, k_w]
        return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
  8. 1 x 1卷积

    import torch
    
    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
    • 9
  9. 假设输出的高宽没有变的话,通过不改变通道数; 假设将输出的高宽变为输入的1/2,通道数通常设为输入的2倍。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/612898
推荐阅读
相关标签
  

闽ICP备14008679号