反卷积的棋盘格效应

参考链接: https://www.zhihu.com/question/43609045/answer/130868981

反卷积只能恢复出原信号的shape,而并不能恢复value,若想要恢复出value还需要learn的过程


例如在tensorflow中反卷积的实现:

参考链接: https://www.jianshu.com/p/f0674e48894c

从3*3 -> 6*6

对于stride = 2, 先将小分辨率的feature map每一个像素中间插入stride-1个0值.然后进行正常的卷积操作(默认的卷积stride为1),得到卷积后的结果,再裁剪到想要的大分辨率的feature map

反卷积的棋盘格效应

 

什么是棋盘格现象?

假设反卷积生成的图像中,包含1只黑猫,黑猫身体部分的像素颜色应该是平滑过渡的。或者极端的说,身体部分应该全部都是黑色的。而在实际生成的图像中,该部分却是由深深浅浅的近黑方块组成的,很像棋盘的网络。这就是所谓的棋盘效应。

反卷积为什么会出现棋盘格效应?

详见: https://distill.pub/2016/deconv-checkerboard

(1)卷积过程中只能用到一个像素(只有一个像素值不为0)

反卷积的棋盘格效应

(2)卷积过程中能用到两个像素(只有两个像素值不为0)

反卷积的棋盘格效应

(3)卷积过程中能用到四个像素(有四个像素值不为0)

反卷积的棋盘格效应

因为插入的值为0,使得卷积的input feature map本身就是棋盘状,所以得到的大分辨率feature map也会产生棋盘格

反卷积产生的棋盘格,在stride和卷积核size是整数倍的时候能够有所缓解,但是依然不能完全消除

 

为什么会有所缓解呢?
因为二者整除关系使得卷积核每次滑动能用到的非零像素的个数是一样的(或者中间区域向两边逐渐减少(而不是随着滑动反复变化产生棋盘格形状))

如:stride = 2, kernel size = 2

反卷积的棋盘格效应

棋盘格效应的解决办法?

不是将小分辨率的feature map的像素之间插0,而是采用插值的方法

也就是现在常用的插值+conv