首页 > 解决方案 > 在内部理解 pytorch conv2d

问题描述

我试图了解 nn.conv2d 在内部做什么。

所以假设我们将 Conv2d 应用于 32*32 RGB 图像。

torch.nn.Conv2d(3, 49, 4, bias=True)

所以 :

  1. 当我们初始化 conv 层时,它会有多少权重和形状,请告诉它是否存在偏差?
  2. 在应用它之前,图像将具有 3 * 32 * 32 形状,应用后将具有 49 * 29 * 29 那么两者之间会发生什么?

我将“滑动”操作(不知道真名)定义为首先将内核元素乘以图像形状中的框的第一个元素,直到内核的最后一个元素相应地计算出 1of29 * 1of29。并“全部滑动”水平和垂直执行此操作,直到计算出所有 29 * 29。

所以我了解内核的行为方式,但我不了解将创建多少内核,torch.nn.Conv2d(3, 49, 4, bias=True)以及其中哪些内核将应用于 R、G、B 通道。

标签: pytorchconv-neural-networkconvolution

解决方案


我了解内核的行为方式,但我不了解内核将创建多少内核,nn.Conv2d(3, 49, 4, bias=True)以及其中哪些内核将应用于 R、G 和 B 通道。

调用nn.Conv2d(3, 49, 4, bias=True)将初始化49 4x4-kernels,每个都有总共三个通道和一个偏置参数。这是参数的总数49*(4*4*3 + 1) 2,401个参数。

您可以通过以下方式检查它是否确实正确:

>>> conv2d = nn.Conv2d(3, 49, 4, bias=True)

参数列表将包含权重张量 shape(n_filters=49, n_channels=3, kernel_height=4, kernel_width=4)偏置张量 shape (49,)

>>> [p.shape for p in conv2d.parameters()]
[torch.Size([49, 3, 4, 4]), torch.Size([49])]

如果我们看一下参数的总数,我们确实会发现:

>>> nn.utils.parameters_to_vector(conv2d.parameters()).numel()
2401

关于它们的应用方式:每个49内核都将“独立地”应用于输入映射。对于每个过滤器操作,您都在将三通道张量的输入与三通道内核进行卷积。这些49卷积中的每一个都添加了各自的偏差。最后,您会得到许多49单通道贴图,这些贴图连接起来构成单通道49贴图。在实践中,一切都是使用输入的窗口视图一次性完成的。

我当然偏向于我自己的帖子:在这里你会发现卷积神经网络中形状的另一种解释。


推荐阅读