首页 > 编程知识 正文

什么叫理解,盲反卷积

时间:2023-05-04 19:04:04 阅读:131304 作者:2814

这篇译文大大保留了原文的样子,增加了细节使之容易理解。

在CNN上,倒排卷积是上采样(up-sampling )的常用方法。如果你不知道倒排卷积是如何操作的,请阅读这篇文章。

正文的notebook代码在Github上

上采样的必要性是在我们使用神经网络的过程中,我们需要经常上采样(up-sampling )以提高低分辨率图像的分辨率

上采样有很多方法,例子如下。

虽然存在最近邻插值双线性插值(Bi-linear interpolation双立方插值),但所有上述方法都需要插值操作,这些插值操作是人为设计的

如果网络想学习为什么需要倒排卷积的最佳上采样方法,可以使用倒排卷积。与基于插值的方法不同,有可以学习的参数。

如果你想知道倒排卷积有什么用,你可以看到它在著名的论文和项目中是如何使用的。

DCGAN的生成器使用随机采样值作为输入产生完整的图像。 其语义分割)中,使用卷积层提取编码器(encoder )内的特征,接着将原图像存储在解码器)中来决定原图像

FII。

反卷积也称为:分数阶长卷积(fractionally-stridedconvolution )“和反卷积(Deconvolution )”。

我们在这篇文章中只使用倒排卷积这个名字.其他文章可能会使用其他名字,但要知道这些名字都是指倒排卷积.

让我们来看看卷积是如何操作的,一个简单的例子看看卷积是如何操作的。

假设您有一个4 x 44 (时间4 x4)的输入矩阵,但使用了“内核”(kernel )为3x3、“无嵌入”(padding )和“步数”(stride )为1的卷积操作。 结果是22 ) times2) 2的矩阵

译者注: stride、kernel、padding等词以下记为英语。

卷积运算的本质,实际上是在input矩阵和kernel矩阵之间按要素进行乘法运算并相加.我们的stride为1,不使用padding,所以只能在4个位置进行操作.

要点:卷积操作其实就是input值和output值的位置性关系(positional connectivity).

例如,input矩阵左上角的值会影响output矩阵左上角的值。

进而,333(times33的kernel确立了输入矩阵中的9个值和输出矩阵中的1个值之间的关系。

阅读"卷积操作建立了多对一的关系".以下内容时,请始终牢记这一概念。

卷积的逆操作在这里,让我们来考虑一下如何改变计算的方向.也就是说,想建立一个矩阵中的一个值和另一个矩阵中的九个值的关系.这就像是在进行卷积的逆操作,这是卷积的中心思想.

(译者注:从信息论的角度看,卷积是不可逆的.所以这里说的并不是从output矩阵和kernel矩阵计算出原始的input矩阵.而是计算出一个保持了位置性关系的矩阵.)

但是,如何进行这个逆操作呢?

为了讨论这个操作,首先定义卷积矩阵和卷积矩阵的转置。

卷积矩阵可以把卷积运算作为矩阵来写.实际上,它是将核矩阵重新排列,用一次矩阵乘法计算卷积运算后的矩阵.

333(times33的kernel重新排序如下

4 × 16 4times16 4×16的矩阵,如下:

这就是卷积矩阵. 每一行都定义了一次卷积操作. 如果你还看不透这一点, 可以看看下面的图. 卷积矩阵的每一行都相当于经过了重排的kernel矩阵,只是在不同的位置上有zero padding罢了.

为了实现矩阵乘法,我们需要将尺寸为 4 × 4 4times4 4×4的input矩阵压扁(flatten)成一个尺寸为 16 × 1 16times1 16×1的列向量.

然后,我们对 4 × 16 4times16 4×16的卷积矩阵和 16 × 1 16times1 16×1的input矩阵(就是16维的列向量,只是看成一个矩阵)进行矩阵乘法.

尺寸为 4 × 1 4times1 4×1的output矩阵可以重排为 2 × 2 2times2 2×2的矩阵.这和我们之前通过滑动窗口计算得到的结果一致.

译者注:太棒辣!好神奇!

一句话,一个卷积矩阵其实就是kernel权重的重排,一个卷积操作可以被写成一个卷积矩阵.

即便这样又如何呢?

我想说的是: 使用这个卷积矩阵,你可以把16( 4 × 4 4times4 4×4的矩阵)个值映射为4( 2 × 2 2times2 2×2的矩阵)个值. 反过来做这个操作,你就可以把4( 2 × 2 2times2 2×2的矩阵)个值映射为16( 4 × 4 4times4 4×4的矩阵)辣.

蒙了?

继续读.

转置过后的卷积矩阵

我们的目的是把4 ( 2 × 2 2times2 2×2的矩阵)个值映射为16 ( 4 × 4 4times4 4×4的矩阵)个值. 但是,还要注意:我们需要维护1对9的关系.

假设我们转置一下卷积矩阵 C C C ( 4 × 16 4times16 4×16),得到 C T C^T CT( 16 × 4 16times4 16×4). 我们可以将 C T C^T CT ( 16 × 4 16times4 16×4)和一个列向量( 4 × 1 4times1 4×1)以矩阵乘法相乘,得到 16 × 1 16times1 16×1的output矩阵.

转置之后的卷积矩阵就建立了1个值对9个值的关系.

output矩阵可以被重排为 4 × 4 4times4 4×4的.

我们已经上采样了一个小矩阵( 2 × 2 2times2 2×2),得到了一个大矩阵( 4 × 4 4times4 4×4). 转置卷积依然维护着1对9的关系: 因为权重就是这么排的.

注意:用来进行转置卷积的权重矩阵不一定来自于原卷积矩阵. 重点是权重矩阵的形状和转置后的卷积矩阵相同.

总结

转置卷积和普通卷积有相同的本质: 建立了一些值之间的关系. 只不过,转置卷积所建立的这个关系与普通卷积所建立的关系,方向相反.

我们可以使用转置卷积来进行上采样. 并且,转置卷积中的权重是可以被学习的. 因此,我们没有必要搞什么插值方法来做上采样.

尽管它被称作转置卷积, 但是这并不意味着我们是拿一个已有的卷积矩阵的转置来作为权重矩阵的来进行转置卷积操作的. 和普通卷积相比,intput和output的关系被反向处理(转置卷积是1对多,而不是普通的多对1),才是转置卷积的本质.

正因如此,严格来说转置卷积其实并不算卷积.但是我们可以把input矩阵中的某些位置填上0并进行普通卷积来获得和转置卷积相同的output矩阵. 你可以发现有一大把文章说明如何使用这种方法实现转置卷积. 然而, 因为需要在卷积操作之前,往input中填上许多的0,这种方法其实有点效率问题.

警告:转置卷积会在生成的图像中造成棋盘效应(checkerboard artifacts).本文推荐在使用转置卷积进行上采样操作之后再过一个普通的卷积来减轻此类问题.如果你主要关心如何生成没有棋盘效应的图像,需要读一读paper.

References

[1] A guide to convolution arithmetic for deep learning
Vincent Dumoulin, Francesco Visin

https://arxiv.org/abs/1603.07285

[2] Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks
Alec Radford, Luke Metz, Soumith Chintala

https://arxiv.org/pdf/1511.06434v2.pdf

[3] Fully Convolutional Networks for Semantic Segmentation
Jonathan Long, Evan Shelhamer, Trevor Darrell

https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf

[4] Deconvolution and Checkerboard Artifacts
Augustus Odena, Vincent Dumoulin, Chris Olah

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

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