美文网首页
非常详细的反卷积(transposed convolution)

非常详细的反卷积(transposed convolution)

作者: 幽并游侠儿_1425 | 来源:发表于2020-07-25 06:03 被阅读0次

    参考链接

    其实了解卷积之后可以直接看第4,5,6部分的。

    一、上采样(upsampling)的必要性

    上采样是把低分辨率输入转成高分辨率输出。

    上采样

    有以下几种上采样的方法:

    • Nearest neighbor interpolation
    • 双线性插值(Bi-linear interpolation
    • Bi-cubic interpolation

    二、为什么要用反卷积(Transposed Convolution)进行上采样

    如何用合适的方法进行上采样?参考文章
    反卷积不是一个预先定义好的插值方法,它有一些可学习参数(learnable parameters)。
    反卷积的应用场合如下:

    • DCGAN的生成器随机采样以产生完整尺寸的图片
    • 语义分割在编码器中用卷积层去提取图像特征,然后在解编码器中将图像恢复到原来尺寸。
      反卷积在其他文章中可能会被称为:
    • Fractionally-strided convolution
    • Deconvolution

    三、卷积操作

    下面两个图带我们复习一下普通的卷积操作:先乘再加。

    image.png image.png

    这种卷积操作的亮点是输出值和输入值之间存在位置上的关联性(positional connectivity)。举个例子,输入矩阵的左上角的元素会影响输出矩阵的左上角的元素。更具体地说,3*3的filter/kernel用于将输入矩阵中的9个元素关联于输出矩阵中的1个值。

    A convolution operation forms a many-to-one relationship

    四、 思考卷积的反方向

    如果我们需要将矩阵里的1个值和另一个矩阵里的9个值去关联起来,我们该怎么做呢?这是一个1对多的关系。这是卷积操作的逆向过程,因此被称为反卷积(Transposed convolution)

    举个例子,我们希望将一个2 * 2的矩阵上采样成一个4 * 4的矩阵。而且需要保持1对9的对应关系,具体对应关系见下图。

    image.png

    但是如何执行这样的操作呢?我们先定义卷积矩阵(convolution matrix)和反卷积矩阵(transposed convolution matrix)。

    五、卷积矩阵(convolution matrix)

    我们希望可以定义这样一个矩阵。:输入矩阵和我们所定义的矩阵进行矩阵相乘就可以完成卷积计算。这个矩阵称为卷积矩阵,它是对卷积核kernel进行重新排列之后获得的。
    举个例子:3*3的卷积核参数如下:

    image.png

    我们对这个33卷积核重新排列得到了一个416的矩阵:

    image.png

    上面就是一个卷积矩阵( convolution matrix)。每一行定义了一个卷积操作。卷积矩阵的每一行其实是重新排列的卷积核加了一些不同位置零填充(zero padding)。

    image.png

    这个卷积矩阵怎么用呢?首先我们需要去把输入矩阵(44)扁平化为一个列向量(161),如下图所示:

    image.png

    这样我们对这个416的卷积矩阵和一个161的输入矩阵进行矩阵乘法,进而把输出的41的矩阵reshape为22的矩阵,就能得到和上述直接进行卷积一样的结果了。

    image.png image.png

    从上面的过程中,我们可以进行如下思考:
    如果我们有一个4 * 16的卷积矩阵,我们就可以把16 * 1的输入矩阵变为4 * 1的输出矩阵。
    那么如果我们有一个4 * 1的输入和一个16 * 4的矩阵,我们是不是可以通过矩阵乘法得到一个16 * 1的输出呢?

    六、反卷积矩阵

    我们希望从4(2 * 2)到16(4 * 4)。因此我们需要用到16 * 4的矩阵。但是我们希望同时保持1对9 的对应关系。

    假设我们把卷积矩阵C(4 * 16)转置为C^T(16 * 4),把C^T(16 * 4)和一个列向量(4 * 1)相乘即可产生一个输出矩阵,而且这个反卷积矩阵C^T将输入向量中的每一个元素都跟输出向量中的9个元素相关联。

    这里1对9的对应关系我自己可以用线性代数的知识去理解:反卷积矩阵中的第一列都需要且只需要跟输入向量中的第一个元素进行乘法和加法运算;反卷积矩阵中的第一列有9个非零元素;反卷积矩阵的第一列的不同元素和输入向量中的第一个元素进行乘法加法,都会影响输出向量中不同位置的元素。

    以下是示意图:

    image.png

    输出可以reshape到4*4:

    image.png

    注意:实际的反卷积矩阵的权重值并不是从原始的卷积矩阵中的阿赖的。重要的是”the weight layout is transposed from that of the convolution matrix“

    七、反卷积的实际操作

    尽管叫做转置卷积/反卷积,但是这并不意味着我们去取已有的卷积矩阵来转置。叫做转置卷积的原因是:相比于标准的卷积矩阵(多对一),反卷积矩阵”转置“了输入和输出的对应关系(一对多)。

    此外,反卷积矩阵的值是可学习的,我们并不需要一个预定义的插值方法。

    其实反卷积并不是卷积,但是我们可以用卷积操作来模拟反卷积。我们在输入矩阵的值之间加零以上采样输入矩阵。加零的目的是使得直接进行卷积核进行反卷积产生一样的效果。

    We up-sample the input by adding zeros between the values in the input matrix in a way that the direct convolution produces the same effect as the transposed convolution.

    (一些文章是用这个方式去解释反卷积的。)但是这种方法效率更低,因为它在进行卷积前对输入进行了上采样加零。

    注意:在生成的图片(generated images)中,反卷积是 checkerboard artifacts的产生原因。
    这篇文章介绍了上采样结合卷积操作的一种方法去减少 上述问题的出现。
    如果你的主要目标是产生没有checkerboard artifacts的图片,建议阅读以上链接中的文章。

    相关文章

      网友评论

          本文标题:非常详细的反卷积(transposed convolution)

          本文链接:https://www.haomeiwen.com/subject/rjaulktx.html