pytorch - 在内部理解 pytorch conv2d
问题描述
我试图了解 nn.conv2d 在内部做什么。
所以假设我们将 Conv2d 应用于 32*32 RGB 图像。
torch.nn.Conv2d(3, 49, 4, bias=True)
所以 :
- 当我们初始化 conv 层时,它会有多少权重和形状,请告诉它是否存在偏差?
- 在应用它之前,图像将具有 3 * 32 * 32 形状,应用后将具有 49 * 29 * 29 那么两者之间会发生什么?
我将“滑动”操作(不知道真名)定义为首先将内核元素乘以图像形状中的框的第一个元素,直到内核的最后一个元素相应地计算出 1of29 * 1of29。并“全部滑动”水平和垂直执行此操作,直到计算出所有 29 * 29。
所以我了解内核的行为方式,但我不了解将创建多少内核,torch.nn.Conv2d(3, 49, 4, bias=True)
以及其中哪些内核将应用于 R、G、B 通道。
解决方案
我了解内核的行为方式,但我不了解内核将创建多少内核,
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
贴图。在实践中,一切都是使用输入的窗口视图一次性完成的。
我当然偏向于我自己的帖子:在这里你会发现卷积神经网络中形状的另一种解释。
推荐阅读
- r - 如何比较两个可变和不同长度的数据帧以将一个数据帧的值添加到另一个数据帧,在必要时重复值
- ionic4 - Intranet 上的 Ionic 4 Web 项目
- javascript - Keycloak 内省端点
- angular - 类型'可观察的
' 不可分配给类型 'Observable ' - python - python psycopg2选择时区的current_timestamp问题
- django - NoReverseMatch 在 /property/city/city/
- python - 如何将 TF Dense 层转换为 PyTorch?
- docker - sh: curl: not found 甚至在 k8s pod 中安装 curl
- sql - 如何用这个在 SQLite 中编写 sql?
- javascript - 如何映射移动触摸事件以在 Javascript 中模拟按键向上/向下?