美文网首页
mxnet:卷积层的多输入通道和多输出通道

mxnet:卷积层的多输入通道和多输出通道

作者: AI秘籍 | 来源:发表于2020-04-26 20:36 被阅读0次

    1.卷积层的多输入通道

    当输入数据含有多个通道时,
    我们要构造一个与输入数据的通道数相等的卷积核,
    从而能够与含多通道的输入数据做互相关运算.
    假设输入数据的通道数为ci,那么卷积核的输入通道数同样为ci.

    设卷积核窗口形状为kh × kw。
    当ci = 1时,我们知道卷积核只包含⼀个形状为kh × kw的⼆维数组。
    当ci > 1时,我们将会为每个输⼊通道各分配⼀个形状为kh × kw的核数组。把这ci个数组在输⼊通道维上连结,即得到⼀个形状为ci × kh × kw的卷积核。
    由于输⼊和卷积核各有ci个通道,我们可以在各个通道上对输⼊的⼆维数组和卷积核的⼆维核数组做互相关运算,
    再将这ci个互相关运算的⼆维输出按通道相加,得到⼀个⼆维数组。
    这就是含多个通道的输⼊数据与多输⼊通道的卷积核做⼆维互相关运算的输出。


    image.png

    程序:

    from mxnet import nd
    
    def corr2d(X, K):
        """Compute 2D cross-correlation."""
        h, w = K.shape
        Y = nd.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和K的第0维(通道维)遍历
        # 然后使用*将结果列表变成add_n函数的位置参数(positional argument)来进行相加
        return nd.add_n(*[corr2d(x,k) for x, k in zip(X, K)])
    
    if __name__ == "__main__":
        # 2通道输入数据
        X = nd.array([[[0, 1, 2],[3, 4, 5],[6, 7, 8]],
                                  [[1, 2, 3],[4, 5, 6],[7, 8, 9]]])
        
        # 2通道卷积核
        K = nd.array([[[0,1],[2,3]],[[1,2],[3,4]]])
    
        print(corr2d_multi_in(X, K))
    
    image.png

    2.卷积层的多输出通道

    如果我们希望得到多个通道的输出数据,我们应该怎么定义卷积核数组.

    设卷积核输⼊通道数和输出通道数分别为ci和co,⾼和宽分别为kh和kw。
    如果希望得到含多个通道的输出,
    我们可以为每个输出通道分别创建形状为ci × kh × kw的核数组。
    将它们在输出通道维上连结,卷积核的形状即co × ci × kh × kw。
    在做互相关运算时,
    每个输出通道上的结果由卷积核在该输出通道上的核数组与整个输⼊数组计算而来

    image.png

    程序:

    from mxnet import nd
    
    
    def corr2d(X, K):
        """Compute 2D cross-correlation."""
        h, w = K.shape
        Y = nd.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和K的第0维(通道维)遍历
        # 然后使用*将结果列表变成add_n函数的位置参数(positional argument)来进行相加
        return nd.add_n(*[corr2d(x,k) for x, k in zip(X, K)])
    
    
    def corr2d_multi_out(X, K):
        # 对K的第0维遍历,
        # 每次同输入X做互相关计算,所有结果使用stack函数合并在一起.
        return nd.stack(*[corr2d_multi_in(X, k) for k in K])
    
    
    
    
    if __name__ == "__main__":
        # 2通道输入数据
        X = nd.array([[[0, 1, 2],[3, 4, 5],[6, 7, 8]],
                                  [[1, 2, 3],[4, 5, 6],[7, 8, 9]]])
        
        
        K = nd.array([[[0,1],[2,3]],[[1,2],[3,4]]])
        K = nd.stack(K, K+1, K+2)
        # 3输出通道,2输入通道,2行2列
        print(K.shape)
    
        # 卷积层的多通道输出
        # 每个输出通道上的结果由卷积核在该输出通道上的核数组与整个输入数组计算而来
        print(corr2d_multi_out(X, K))
    
    image.png

    相关文章

      网友评论

          本文标题:mxnet:卷积层的多输入通道和多输出通道

          本文链接:https://www.haomeiwen.com/subject/ogetwhtx.html