反卷积/转置卷积 (Deconvolution/Transposed Convolution) 原理与计算方法

反卷积

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的卷积和反卷积是正好相反的:

但当卷积核大小不能被步长整除的时候,会出现棋盘现象。原因是上采样过程中取样不均匀,生成图的某些点在原图中多次取样(这不是反卷积特有的情况,只是在反卷积时由于图像分辨率提升导致更为明显)

  1. 方法一:采取可以被stride整除的kernel size
    该方案较好的应对了棋盘效应问题,但是仍不够圆满,因为一旦我们的kernel学习不均匀,仍然会产生棋盘效应,(下图为步长为2,核大小为4所产生的现象)
  2. 方法二:插值
    调整图像大小(使用最近邻插值或双线性插值),然后执行卷积图层。这似乎是一种自然的方法,大致相似的方法在图像超分辨率方面表现良好

插值是指在给定函数值的情况下,对某个空间中的非给定点进行函数值近似的问题。在深度学习中常用在修改图像尺寸的过程,由旧的图像矩阵中的点计算新图像矩阵中的点并插入,不同的计算过程就是不同的插值算法。

最近邻插值:

双线性插值:

双线性插值就是先在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 面积插值法
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值