首页 > 解决方案 > 转置卷积层如何将其内核应用于输入?

问题描述

我知道卷积层如何将其内核应用于输入,但我不明白转置卷积层如何将其内核应用于输入。我的主要问题如下。

问题:如果一个卷积层接受一个三通道输入并输出一个两通道输出,并且每个内核的形状是 2x2,我肯定知道它将有 6 个内核分为两组,因为它要给出一个 2 通道输出因此,下面显示了两组。

>>> from torch import nn
>>> conv1 = nn.Conv2d(3,2,2,1,0)
>>> conv1.weight.data.numpy()


    array([[[[-0.09294177,  0.19253497],
         [-0.27820718, -0.07189114]],

        [[-0.27682984, -0.05606458],           <---- one group
         [ 0.01134909, -0.21749675]],

        [[-0.2351923 ,  0.2374857 ],
         [-0.0346033 , -0.26447   ]]],


       [[[ 0.2467276 ,  0.06628369],
         [ 0.26501465,  0.11644475]],
                                               <----- one group making two 
                                                      groups of three
        [[-0.09835644, -0.06396657],
         [-0.05590855,  0.06890304]],

        [[ 0.22788118,  0.22287966],
         [-0.20899878, -0.03188486]]]], dtype=float32)

您可以看到它有六个内核,分为两组,每组 3 个,这是有道理的,但是如果转置卷积层要接受三通道输入并输出两通道输出,并且每个内核的形状为 2x2,为什么会这样它不是将 6 个内核分成两组,每组三个,而是将 6 个内核分成 3 组,每组两个,如下所示?

>>> conv2 = nn.ConvTranspose2d(3,2,2,1,0)
>>> conv2.weight.data.numpy()

    array([[[[ 0.28577724, -0.29587495],
         [-0.24003945, -0.3524448 ]],
                                        <---- one group
        [[-0.15984103,  0.22188954],
         [-0.10990701, -0.20565327]]],


       [[[ 0.17101079, -0.17623127],
         [-0.12097928, -0.0211492 ]],
                                         <----- one group
        [[-0.21161021, -0.33530322],
         [-0.16497111,  0.19984488]]],


       [[[-0.05084743, -0.2563213 ],
         [-0.28287342, -0.30839682]],
                                         <----- one group making three groups 
                                                two
        [[-0.330719  ,  0.07809895],
         [-0.16823643, -0.34404978]]]], dtype=float32)

上面可以看到,它有6个内核分成3组,每组2个。不是说要分成2组,每组3个,因为它要给出两个通道,所以它应该像卷积层一样分成两组? 为什么会这样排列?6 个内核如何分成 3 组,每组 2 个,如何将一个 3 通道输入变为两个?

标签: python-3.xneural-networkpytorchconv-neural-network

解决方案


推荐阅读