pytorch - PyTorch 中如何实现 Conv2d 的算法
问题描述
我正在研究 pytorch onnx 模型的推理模型,这就是提出这个问题的原因。
假设,我有一张带有尺寸的图像32 x 32 x 3
(CIFAR-10 数据集)。我通过一个带有尺寸的 Conv2d : 3 x 192 x 5 x 5
。我使用的命令是:Conv2d(3, 192, kernel_size=5, stride=1, padding=2)
使用公式(此处说明以供参考 pg12 https://arxiv.org/pdf/1603.07285.pdf)我应该得到一个尺寸为28 x 28 x 192
(input - kernel + 1 = 32 - 5 + 1
)的输出图像。
问题是 PyTorch 是如何实现这个 4d 张量3 x 192 x 5 x 5
来让我输出的28 x 28 x 192
?该层是一个 4d 张量,输入图像是一个 2d 张量。
内核 ( 5x5
) 在图像矩阵中是如何分布的32 x 32 x 3
?3 x 192
内核与 first ->或卷积什么32 x 32
?
注意:我已经了解事物的 2d 方面。我在 3 个或更多中提出上述问题。
解决方案
Conv2d的输入是一个形状张量,(N, C_in, H_in, W_in)
输出是一个形状(N, C_out, H_out, W_out)
,其中N
是批量大小(图像数量),C
是通道数,H
是高度,W
是宽度。输出的 height 和 widthH_out
计算W_out
如下(忽略膨胀):
H_out = (H_in + 2*padding[0] - kernel_size[0]) / stride[0] + 1
W_out = (W_in + 2*padding[1] - kernel_size[1]) / stride[1] + 1
有关如何获得此公式的说明,请参见cs231n。
在您的示例N=1, H_in = 32, W_in = 32, C_in = 3, kernel_size = (5, 5), strides = (1, 1), padding = (0, 0)
中,给予H_out = 28, W_out = 28
.
这C_out=192
意味着有 192 个不同的过滤器,每个形状为(C_in, kernel_size[0], kernel_size[1]) = (3, 5, 5)
。每个滤波器独立地与输入图像进行卷积,得到一个形状为 的 2D 张量(H_out, W_out) = (28, 28)
,并且由于有C_out = 192
滤波器和N = 1
图像,最终输出为形状(N, C_out, H_out, W_out) = (1, 192, 28, 28)
。
要了解卷积是如何执行的,请参见卷积演示。