反卷积
Deconvolution/Transposed Convolution
来自文章 《A guide to convolution arithmetic for deep learning》与《Deconvolution and Checkerboard Artifacts》
反卷积是一种上采样方法,将原图像分辨率提高,deconvolution layer可以允许模型通过每一个点进行绘制高分辨率图像上的一个方块。
在进行一般的卷积时,可以看作一种矩阵运算,将一个3x3的卷积核kernel展开成如下的矩阵形式:
我们称该矩阵为C,则如果输入某图像,首先将图像展平为一个向量,之后与C进行矩阵乘法:
此时得到的便是卷积后缩小的图像,也就是进行卷积的前向传播时进行的运算。而计算梯度反向传播时,则将loss x CT(转置),即kernel定义了用于前向和后向传递的矩阵C和CT。
对于反卷积的情况,则是与卷积正好相反,其前向和后向通过分别乘以CT和(CT)T = C来计算。
图中可以看出,CT乘以2x2的输入矩阵,得到了4x4的输出,与刚才的情况恰好转置,因此拥有相同kernel的卷积和反卷积是正好相反的:
但当卷积核大小不能被步长整除的时候,会出现棋盘现象。原因是上采样过程中取样不均匀,生成图的某些点在原图中多次取样(这不是反卷积特有的情况,只是在反卷积时由于图像分辨率提升导致更为明显)
- 方法一:采取可以被stride整除的kernel size
该方案较好的应对了棋盘效应问题,但是仍不够圆满,因为一旦我们的kernel学习不均匀,仍然会产生棋盘效应,(下图为步长为2,核大小为4所产生的现象) - 方法二:插值
调整图像大小(使用最近邻插值或双线性插值),然后执行卷积图层。这似乎是一种自然的方法,大致相似的方法在图像超分辨率方面表现良好
插值是指在给定函数值的情况下,对某个空间中的非给定点进行函数值近似的问题。在深度学习中常用在修改图像尺寸的过程,由旧的图像矩阵中的点计算新图像矩阵中的点并插入,不同的计算过程就是不同的插值算法。
最近邻插值:
双线性插值:
双线性插值就是先在x方向上用Q11和Q21、Q12和Q22算R1、R2两个单线性,之后在y方向上用R1和R2算出P
方法二中的插值指的就是tensorflow中的图像大小调整函数(tf.image.resize_images)
通过tf.image.resize_images函数调整图像的大小。这个函数第一个参数为原始图像,第二个和第三个分别为调整后图像的大小,method参数给出了调整图像大小的算法
method = 0 双线性插值法
method = 1 最近邻居法
method = 2 双三次插值法
method = 3 面积插值法