首页 > 解决方案 > 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 192input - 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 33 x 192 内核与 first ->或卷积什么32 x 32

注意:我已经了解事物的 2d 方面。我在 3 个或更多中提出上述问题。

标签: pytorchconv-neural-network

解决方案


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)

要了解卷积是如何执行的,请参见卷积演示

在此处输入图像描述


推荐阅读