我试图理解空洞卷积。我已经熟悉通过用零填充间隙来增加内核的大小。它有助于覆盖更大的区域并更好地了解更大的物体。但是请有人能解释一下扩张卷积层如何保持感受野的原始分辨率。它用于deeplabV3+结构中,atrous rate从2到16。如何在没有零填充的情况下使用具有明显更大内核的扩张卷积并且输出大小将保持一致。
deeplabV3+ 结构:
我很困惑,因为当我在这里查看这些解释时:
空洞卷积层的输出尺寸(3x3)更小?
非常感谢你的帮助!
卢卡斯
我试图理解空洞卷积。我已经熟悉通过用零填充间隙来增加内核的大小。它有助于覆盖更大的区域并更好地了解更大的物体。但是请有人能解释一下扩张卷积层如何保持感受野的原始分辨率。它用于deeplabV3+结构中,atrous rate从2到16。如何在没有零填充的情况下使用具有明显更大内核的扩张卷积并且输出大小将保持一致。
deeplabV3+ 结构:
我很困惑,因为当我在这里查看这些解释时:
空洞卷积层的输出尺寸(3x3)更小?
非常感谢你的帮助!
卢卡斯
也许这里的跨步卷积和空洞卷积之间存在一个小的混淆。跨步卷积是一种通用的卷积操作,其作用类似于滑动窗口,但不是每次跳跃单个像素,而是在计算当前像素和下一个像素的卷积结果时使用跨步允许跳跃多个像素. 扩张卷积是在更大的窗口上“寻找”——而不是采用相邻像素,而是采用“孔”。膨胀因子定义了这些“洞”的大小。
好吧,如果没有填充,输出会变得小于输入。该效果与普通卷积的减少效果相当。
想象一下,您有一个具有 1000 个元素的一维张量和一个膨胀因子为 3 的膨胀 1x3 卷积核。这对应于 1+2free+1+2free+1 = 7 的“总内核长度”。考虑步幅为 1输出将是具有 1000+1-7= 994 个元素的一维张量。在具有 1x3 内核和步幅因子为 1 的正常卷积的情况下,输出将具有 1000+1-3= 998 个元素。如您所见,可以计算出类似于普通卷积的效果:)
在这两种情况下,如果没有填充,输出就会变小。但是,正如您所看到的,膨胀因子对输出的大小没有缩放影响,就像步幅因子一样。
为什么你认为在 deeplab 框架内没有进行填充?我认为在官方的 tensorflow 实现中使用了填充。
最好的弗兰克
我的理解是,作者说在应用 3x3 卷积之前不需要对图像(或任何中间特征图)进行下采样,这在 DCNN(例如,VGG16 或 ResNet)中是典型的特征提取,然后进行上采样语义分割。在典型的编码器-解码器网络(例如 UNet 或 SegNet)中,首先将特征图下采样一半,然后进行卷积操作,再将特征图上采样 2 倍。
所有这些效果(下采样、特征提取和上采样)都可以在单个空洞卷积中捕获(当然,stride=1)。此外,与相同的“下采样、特征提取和上采样”相比,atrous 卷积的输出是密集的特征图,这会产生备用特征图。有关详细信息,请参见下图。它来自DeepLabV1 论文。因此,您可以通过在中间层用空洞卷积替换任何正常卷积来控制特征图的大小。
这也是为什么在您上面发布的图片(级联模型)中的所有空洞卷积中都有一个恒定的“output_stride(输入分辨率/特征图分辨率)”为 16。