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

你可能感兴趣的:(跟李沐学AI,深度学习,pytorch,卷积层)