'output channel'大小在 nn.conv2d 过滤器中究竟如何工作?



我正在学习pytorch卷积滤波器Conv2d函数。我发现conv2d(3,3,3)的核(即输入通道=3,输出通道=3,核大小=3)是[3,3,3,3]的张量,如下图所示。我不明白这个大张量有什么用。我可以很容易地理解conv2d(3,1,3) ((tensor[1,3,3,3]))的核。它有一个3*3的矩阵。也许每个矩阵都应用于输入图像的rgb矩阵。它会被合并成一个矩阵进行灰度化,所以输出通道是1。简单。

但是对于[3,3,3,3]????来说什么是好的呢把3*3矩阵中的3应用到rgb矩阵中并且不合并地输出它们还不够吗?为什么我们需要额外的2个张量??

我会说明问题所在。首先,我们设conv2d(3,1,3)为3个输入通道(I1, I2, I3)和3个内核(K1, K2, K3)和一个输出通道(O1)。计算如下:

(I1*K1 + I2*K2 + I3*K3) /3 = O1.

如果我想要3个输出,计算将是这样的

I1*K1 = O1     
I2*K2 = O2
I3*K3 = O3

但现实是复杂的。因为如果我们需要3个输出通道,核数就是9。Conv2d(3,3,3)表示3个输入(I1, I2, I3)。9粒(K11、K12、K13、K21、K22、K23、K31、K32、K33)。那么计算对是什么??

下面是conv2d(3,3,3)情况下的9个核。

conv2d(3,3,3)
=>3,3,3,3  kernel
=>tensor([[[[-0.0904, -0.0924, -0.0892],
[-0.0060, -0.0389, -0.1388],
[ 0.1636, -0.0933, -0.0295]],
[[-0.0742,  0.0426, -0.0662],
[ 0.1625, -0.1485, -0.0169],
[-0.1122, -0.0875,  0.1021]],
[[ 0.1214, -0.0896,  0.1304],
[ 0.0612,  0.0367, -0.0288],
[-0.1868, -0.1356,  0.0869]]],

[[[ 0.0792, -0.1562, -0.1878],
[ 0.0373,  0.1162,  0.1224],
[-0.1138,  0.0553,  0.1449]],
[[ 0.1558, -0.1661, -0.0963],
[ 0.0603, -0.1405,  0.0995],
[-0.0644, -0.1151,  0.1422]],
[[ 0.1534,  0.0399, -0.1709],
[ 0.0765, -0.0665,  0.0119],
[ 0.0586,  0.1424, -0.1755]]],

[[[-0.0199, -0.0956, -0.0577],
[ 0.1312, -0.0273,  0.0615],
[-0.1037, -0.0247,  0.1915]],
[[-0.1297,  0.0451,  0.0360],
[-0.0462,  0.1846, -0.1615],
[-0.0642,  0.0324,  0.1428]],
[[ 0.1254, -0.0323,  0.1129],
[ 0.0482,  0.0839,  0.0227],
[ 0.0845,  0.1773, -0.1706]]]], requires_grad=True)

您可以这样考虑Conv2d操作:

你取输入张量中的(C_in, K_H, K_W)块与相同大小的过滤器之间的矩阵内积,即(C_in, K_H, K_W),以获得输出张量的一个条目。由于在输出张量中的每个空间位置都有C_out(out_channels)通道数,因此必须相应地创建C_out不同的(C_in, K_H, K_W)滤波器,这导致(C_out, C_in, K_H, K_W)的堆叠滤波器形状。

标记:

  • C_in: in_channels
  • K_H:内核高度
  • K_W:内核宽度

最新更新