【问题标题】:what does it mean when kernel depth=1 in conv3d pytorchconv3d pytorch中的内核深度=1是什么意思
【发布时间】:2020-12-02 07:26:35
【问题描述】:

我想了解 PyTorch 中 conv2d 和 conv3d 的区别。

有什么区别:

conv3d(in, out, kernel_size(1,3,3))

conv2d(in,out,kernel_size(3,3))

我查了官方documentation,但我不太明白两者之间的区别。在这种情况下,conv3d 是否应该与 conv2d 相同,因为深度为 1?任何帮助将不胜感激。

【问题讨论】:

    标签: machine-learning deep-learning computer-vision pytorch


    【解决方案1】:

    为了直观地理解内核的工作原理,我建议查看单个特征层的细胞(又名神经元)是如何获得的。

    对于 2D 卷积,您有内核层 (KL) 的高度和宽度,它从 2D 卷积层 (CL) 跨越单个特征层 (FL)。因为一个 CL 可以有多个 FL,然后并行创建多个 KL 并放置在不同的 FL 上,因此它可以并行处理它们。这种并行处理通常表示为 KL 的“堆叠”结构,通常仅命名为 Kernel。不仅这种复数结构中“内核”这个名称的奇异性会导致混淆,而且 KL 的并行处理通常被说明为 KL 的堆叠,从而产生深度维度的错觉。 记住这一点很重要:这不是三维,这只是 KLs-FL 的并行处理。

    对于 3D 卷积,您现在需要 3D KL 来处理 3D FL。现在这是一个真正的三维。将“堆叠”的 3D KL 的数量将自动调整,以便它可以并行处理来自您网络的多个 3D FL。

    关于您的问题: 实际上,深度为 1 的 3D 内核与 2D 内核相同,但是针对不同情况构建的函数不同。也就是说,二维(高、宽)的图像是 2D,而三维(高、宽、深)的图像是 3D。

    【讨论】:

      【解决方案2】:

      在某些特定情况下,它们可以产生相同的结果。

      conv1dconv2d 为例:在conv1d 中使用(1, n),当内核到达末尾时,您将通过一维输入(即w>0h=1)其结果已准备就绪。但是在 con2d 上,它是您正在处理的 2D 输入(即 w>0h>0),它将转到下一行,直到达到底线。所以它的结果也是一个二维对象。

      层增加了输入/输出的深度,您可以有多个in 层,这将决定每个内核的层数,而out 层则决定内核的数量。

      如果我的观察是正确的,我们可以说通过 conv3d (1x3x3) 内核的单层 d*h*w 张量与通过 d 分层的 h*w 张量相同conv2ddd-分层 3x3 内核。输出形状将是 (N, 1, d, h, w)(N, d, h, w)(其中 d 用作后者中的通道数)。

      在某些情况下,您可以获得相同的结果(操作)。但是,当为您的 conv3d 添加深度时(层可以作为第 4 维工作),您将无法将其与 conv2d 相匹配,顾名思义!

      【讨论】:

        【解决方案3】:

        从某种意义上说,是一样的。它们在底层 cuDNN 库中具有单独的实现,因此可能存在一些性能差异(尽管并非总是可以预期,参见 Pytorch 论坛 herehere)。

        但我还要说,它还使代码更具可读性并防止错误:您清楚地看到它是 2D 卷积,并且在定义内核形状时不会出错。

        【讨论】:

          猜你喜欢
          • 2018-11-20
          • 2015-05-16
          • 1970-01-01
          • 1970-01-01
          • 2012-03-29
          • 2010-12-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多