rentainhe / what_I_have_read

Just for self-motivation
2 stars 0 forks source link

Shift-And-Stitch理解 #7

Open rentainhe opened 3 years ago

rentainhe commented 3 years ago

参考文章:

1. Background

Shift and Stitch

假设我们的神经网络只由一层步长为2的mean pooling组成(为了简单) Shift-and-Stitch的第一步进行的是shift操作,原文中叫shift-and-pad image 对于输入的图像,进行四组移位操作,灰色表示padding的部分,可以得到四个一样大小的新的输入图像,然后我们再对这四个图像进行mean pooling操作 image 对四个图像进行mean pooling操作后,我们得到了四个输出,最后将这四个输出给stitch(缝合)起来 image 就得到了一个非常dense的结果

为什么会得到这样的结果? 首先,图3中每个像素点的感受野如图4所示: image 可以看出和图三的一个对应关系就是,左上是红色,右上是黄色,左下是绿色,右下是绿色 这个结果和步长为1的mean pooling一样

import torch
import torch.nn as nn

x = torch.range(1, 25).reshape(5, 5).unsqueeze(0)
pooling = nn.AvgPool2d(2, 1, padding=1)
print(pooling(x))

>>> tensor([[[ 0.2500,  0.7500,  1.2500,  1.7500,  2.2500,  1.2500],
         [ 1.7500,  4.0000,  5.0000,  6.0000,  7.0000,  3.7500],
         [ 4.2500,  9.0000, 10.0000, 11.0000, 12.0000,  6.2500],
         [ 6.7500, 14.0000, 15.0000, 16.0000, 17.0000,  8.7500],
         [ 9.2500, 19.0000, 20.0000, 21.0000, 22.0000, 11.2500],
         [ 5.2500, 10.7500, 11.2500, 11.7500, 12.2500,  6.2500]]])

确实一样,这证明了shift-and-stitch具有保证平移不变性的能力

如何操作才能保证结果的一致性? Shift-and-Stitch其实相当于空洞卷积 如何证明shift-and-stitch操作等价于空洞卷积,现在假设操作为一个pooling层和一个卷积层

  1. Shift-and-Stitch首先将输入shift成 s 平方个输入,这里的s是指stride,降采样系数,如第一个例子中的s为2,因为就会进行s^2=4个shift操作。对输出经过若干卷积后,得到的依旧是s^2个输出,最后将它们stitch成一个w x h的输出
  2. 现在将降采样的步长设置为1,然后将空洞卷积的膨胀系数设置为s,也可以得到同样的结果 image 第一个图是下采样步长为2,加上一个卷积后的结果,第二个图是下采样步长为1,加上一个膨胀系数为2的空洞卷积的结果,二者显然等价。
rentainhe commented 3 years ago

一句总结: