我正在学习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:内核宽度