首页 > 编程知识 正文

卷积为什么要翻转,反卷积的目的

时间:2023-05-04 11:34:43 阅读:131291 作者:3726

我很清楚是转载这篇文章的博主写的

3359 blog.csdn.net/loseinvain/article/details/81098502

3359 blog.csdn.net/loseinvain/article/details/81098502

3359 blog.csdn.net/loseinvain/article/details/81098502

本文了解反卷积,反卷积前言正文从《Up-sampling with Transposed Convolution》开始翻译,这篇文章对反卷积和反卷积有很好的介绍。 在这里可以把这个翻译成中文,和外国人见面。

如果有错误的话,请联系我指出来。 请注明出处。

联系人:

e-mail:FesianXu@163.com

QQ:973926198

github :3359 github.com/fesianxu

卷积上采样在利用神经网络产生图像时,对于以上所采用的需要,经常需要将低分辨率图像转换成高分辨率图像。

此上采样操作目前有多种插值方法。

这些方法中的任一种都大于或等于最近邻插值双线性插值双立方插值这些方法就像人工特征工程,神经网络没有学习的余地,神经网络不能自己学习如何做好插值,这显然是不理想的。

至于为什么是反卷积,一些文献常常将其称为“反卷积”和“部分交叉卷积”。 这是因为,如果称为卷积,则容易认为是数字信号处理中的转换

如果我们的网络能学到最好的地面采样方法,我们就可以在这个时候采用倒排卷积。 此方法不使用预定义的插值方法,而是具有可学习的参数。 理解倒排卷积这个概念很重要。 因为它被应用于一些重要的文献。 例如:

DCGAN生成器将以随机值转换为完整大小的图像。 在这种情况下,必须使用倒排卷积。 在语义分割中,通过使用卷积层在编码器中进行特征提取,然后在解码层中恢复到原始大小,能够对原始图像的各个像素进行分类。 这个过程也需要倒排卷积。 在卷积操作中,您将看到以下卷积操作是如何工作的: 另外,从一个小例子中可以直观地感受到卷积操作。 假设有4444的矩阵。 将3333卷积内核应用于该矩阵,不添加任何填充,并将步长参数(stride )设定为1。 如下图所示,输出为2222的矩阵。

该卷积操作将输入矩阵和卷积内核中的各个元素的乘积相加。 我们没有将1填充到步骤中使用,所以这个操作只能进行4次。 因此,我们的输出矩阵的大小是2222。

此卷积操作在输入值和输出值之间存在位置连接关系,例如,输入矩阵的左上方值影响输出矩阵的左上方值。 更具体地,3333的卷积内核用于级联输入矩阵的九个值,并将它们转换为输出矩阵中的一个值。 “卷积”操作是“多对一”映射关系。 请记住这个。 以后可以使用了。

反过来操作吧。 假设现在我们想反过来操作。 您将要将输入矩阵中的一个值映射到输出矩阵中的九个值。 这是一对多映射关系。 这就像卷积操作的逆操作,其核心观点是倒排卷积。 例如,将2222矩阵上采样为4444矩阵。 此操作保持一对一到九的映射关系。

但是,我们如何具体操作? 为了进行以下讨论,必须定义“卷积矩阵”(convolution matrix )和相应的反卷积矩阵。

卷积矩阵可以用矩阵表示卷积操作。 这个表达很简单,就是把卷积核重新排序,让我们可以用普通的矩阵乘法进行矩阵卷积操作。 下图是原始的卷积核:

对该3333卷积核进行排序,得到以下416416的卷积矩阵。

这就是卷积矩阵。 此矩阵的每一行都定义了卷积操作。 下图更直观地说明了这种排序是如何进行的。 卷积矩阵的每一行都是通过对卷积内核的元素进行排序并添加“零填充”(zero padding )来完成的。

为了将卷积运算表示为卷积矩阵和输入矩阵的向量乘法,将输入矩阵4444乘以列向量,形成161161的形状,如下图所示。

把这个416416的卷积矩阵和116

1×16的输入列向量进行矩阵乘法,这样我们就得到了输出列向量。 

这个输出的4×14×1的矩阵可以重新塑性为一个2×22×2的矩阵,而这个矩阵正是和我们一开始通过传统的卷积操作得到的一模一样。 

简单来说,这个卷积矩阵除了重新排列卷积核的权重之外就没有啥了,然后卷积操作可以通过表示为卷积矩阵和输入矩阵的列向量形式的矩阵乘积形式进行表达。

所以各位发现了吗,关键点就在于这个卷积矩阵,你可以从16(4×44×4)到4(2×22×2)因为这个卷积矩阵尺寸正是4×164×16的,然后呢,如果你有一个16×416×4的矩阵,你就可以从4(2×22×2)到16(4×44×4)了,这不就是一个上采样的操作吗?啊哈!让我们继续吧!

转置卷积矩阵

我们想要从4(2×22×2)到16(4×44×4),因此我们使用了一个16×416×4的矩阵,但是还有一件事情需要注意,我们是想要维护一个1到9的映射关系。

假设我们转置这个卷积矩阵C  (4×16)C  (4×16)变为CT  (16×4)CT  (16×4)。我们可以对CTCT和列向量(4×1)(4×1)进行矩阵乘法,从而生成一个16×116×1的输出矩阵。这个转置矩阵正是将一个元素映射到了9个元素。 

这个输出可以塑形为(4×4)(4×4)的矩阵: 

我们只是对小矩阵(2×2)(2×2)进行上采样为一个更大尺寸的矩阵(4×4)(4×4)。这个转置卷积矩阵维护了一个1个元素到9个元素的映射关系,因为这个关系正表现在了其转置卷积元素上。

需要注意的是:这里的转置卷积矩阵的参数,不一定从原始的卷积矩阵中简单转置得到的,转置这个操作只是提供了转置卷积矩阵的形状而已。

总结

转置卷积操作构建了和普通的卷积操作一样的连接关系,只不过这个是从反向方向开始连接的。我们可以用它进行上采样。另外,这个转置卷积矩阵的参数是可以学习的,因此我们不需要一些人为预先定义的方法。即使它被称为转置卷积,它并不是意味着我们将一些现存的卷积矩阵简单转置并且使用其转置后的值。

从本质来说,转置卷积不是一个卷积,但是我们可以将其看成卷积,并且当成卷积这样去用。我们通过在输入矩阵中的元素之间插入0进行补充,从而实现尺寸上采样,然后通过普通的卷积操作就可以产生和转置卷积相同的效果了。你在一些文章中将会发现他们都是这样解释转置卷积的,但是这个因为在卷积操作之前需要通过添加0进行上采样,因此是比较低效率的。

注意:转置卷积会导致生成图像中出现棋盘效应(checkerboard artifacts),这篇文章《Deconvolution and Checkerboard Artifacts》推荐了一种上采样的操作(也就是插值操作),这个操作接在一个卷积操作后面以减少这种现象。如果你的主要目的是生成尽可能少棋盘效应的图像,那么这篇文章就值得你去阅读。

引用

A guide to convolution arithmetic for deep learning.(Vincent Dumoulin, Francesco Visin).[https://arxiv.org/abs/1603.07285]

Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks.(Alec Radford, Luke Metz, Soumith Chintala) 
[https://arxiv.org/pdf/1511.06434v2.pdf]

Fully Convolutional Networks for Semantic Segmentation.(Jonathan Long, Evan Shelhamer, Trevor Darrell) 
[https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf]

Deconvolution and Checkerboard Artifacts.(Augustus Odena, Vincent Dumoulin, Chris Olah) 
[https://distill.pub/2016/deconv-checkerboard/]

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。