【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」【机器学习】详解转置卷积(TransposeConvolution)

大家好,又见面了,我是你们的朋友全栈君。

目录

一、转置卷积的背景

二、转置卷积的应用

三、转置卷积的区别

四、转置卷积的推导

五、转置卷积的输出

5.1 stride = 1

5.2 stride > 1 ☆

六、小结 


一、转置卷积的背景

        通常,对图像进行多次卷积运算后,特征图的尺寸会不断缩小。而对于某些特定任务 (如 图像分割 和 图像生成 等),需将图像恢复到原尺寸再操作。这个将图像由小分辨率映射到大分辨率的尺寸恢复操作,叫做 上采样 (Upsample),如下图所示:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」
图1 上采样示例

        上采样方法有很多,详见《【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值_闻韶-CSDN博客》。然而,这些上采样方法都是基于人们的先验经验来设计的,在很多场景中效果并不理想 (如 规则固定、不可学习)。因此,我们希望神经网络自己学习如何更好地插值,即接下来要介绍的 转置卷积


二、转置卷积的应用

        曾经,转置卷积也被称为 反卷积 (Deconvolution)。与传统的上采样方法相比,转置卷积的上采样方式并非预设的插值方法,而是同标准卷积一样,具有可学习的参数,可通过网络学习来获取最优的上采样方式

        转置卷积在某些特定领域具有广泛应用,比如:  

  • 在 DCGAN[1],生成器将随机值转变为一个全尺寸图片,此时需用到转置卷积。
  • 在语义分割中,会在编码器中用卷积层提取特征,然后在解码器中恢复原先尺寸,从而对原图中的每个像素分类。该过程同样需用转置卷积。经典方法有 FCN[2] 和 U-net[3]。
  • CNN 可视化[4]:通过转置卷积将 CNN 的特征图还原到像素空间,以观察特定特征图对哪些模式的图像敏感。

三、转置卷积的区别

        标准卷积的运算操作 其实是对卷积核中的元素 与输入矩阵上对应位置的元素 进行逐像素的乘积并求和。然后,卷积核在输入矩阵上以步长为单位进行滑动,直到遍历完输入矩阵的所有位置。    

        假设,输入是一个 4×4 矩阵,使用 3×3 的标准卷积进行计算,同时令 padding=0,stride=1。最终输出结果应是一个 2×2 矩阵,如图 2 所示:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」
图2 标准卷积示例

        在上例中,输入矩阵右上角 3×3 范围的值 (黄色 2 3 4) 会影响 输出矩阵右上角的值 (黄色 27),这其实也对应了标准卷积中感受野的概念。所以,可以说 3×3 标准卷积核 建立了 输入矩阵中 9 个值输出矩阵中 1 个值 的映射关系。    

        综上所述,我们也就可以认为标准卷积操作实际上就是建立了一个 多对一的映射关系。    

        对转置卷积而言,我们实际上是想建立一个逆向操作,即 一对多的映射关系。对于上例,我们想要建立的其实是输出矩阵中的 1 个值与输入矩阵中的 9 个值的关系,如图 3 所示:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」
图3 卷积逆向运算示例

         当然,从信息论的角度上看,常规卷积操作是不可逆的,所以转置卷积并不是通过输出矩阵和卷积核计算原始输入矩阵,而是计算得到保持了相对位置关系的矩阵


四、转置卷积的推导

        定义一个 4×4 输入矩阵 input

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        再定义一个 3×3 标准卷积核 kernel

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        设 步长 stride=1、填充 padding=0,则按 “valid” 卷积模式,可得 2×2 输出矩阵 output

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        这里,换一个表达方式,将输入矩阵 input 和输出矩阵 output 展开成 16×1 列向量 X 4×1 列向量 Y,可分别表示为:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        接着,再用矩阵运算来描述标准卷积运算,设有 新卷积核矩阵 C

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        经推导 (卷积运算关系),可得 4×16 稀疏矩阵 C

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

         以下,用图 4 展示矩阵运算过程:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」
图4 标准卷积矩阵运算示例

        而转置卷积其实就是要对这个过程进行逆运算,即 通过 C 和 Y 得到 X

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        此时,C^T即为新的 16×4 稀疏矩阵。以下通过图 5 展示转置后的卷积矩阵运算。此处,用于转置卷积的权重矩阵 C^T 不一定来自于原卷积矩阵 C (通常不会如此恰巧),但其形状和原卷积矩阵 C 的转置相同。

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」
图5 转置后卷积矩阵运算示例

        最后,将 16×1 的输出结果重新排序,即可通过 2×2 输入矩阵得到 4×4 输出矩阵。


五、转置卷积的输出

5.1 stride = 1

        同样,使用上文中的 3×3 卷积核矩阵 C

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        输出矩阵 output 仍为:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        将输出矩阵展开为 列向量 Y

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        带入到上文中的转置卷积计算公式,则转置卷积的计算结果为:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        这其实等价于 先填充 padding=2 的输入矩阵 input

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        然后,转置标准卷积核 kernel

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        最后,在 填零的输入矩阵 input 上使用 经转置的标准卷积核 kernel 执行 标准卷积运算,如图 6 所示:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」
图6  s=1 的转置卷积运算示例 (步长 s’=1)

        更一般地,对于卷积核尺寸 kernel size = k,步长 stride = s = 1,填充 padding = p = 0 的转置卷积,其 等价的标准卷积 在原尺寸为 i' 的输入矩阵上进行运算,输出特征图的尺寸 o' 为: 

o' = (i' - 1) + k

        同时,等价的标准卷积的的输入矩阵 input 在卷积运算前,需先进行 padding’ = k-1 的填充,得到尺寸 i'' = i' + 2(k-1)

        因此,实际上原计算公式为 (等价的标准卷积的步长 s' = 1):

o' = \frac{i'' - k + 2p} {s'} + 1 = i' + 2(k-1) - k + 1 = (i'-1) + k


5.2 stride > 1 ☆

        在实际中,我们大多数时候会使用 stride>1 的转置卷积,从而获得较大的上采样倍率。

        以下,令输入尺寸为 5×5,标准卷积核同上  kernel size = k= 3,步长  stride = s = 2,填充  padding = p = 0,标准卷积运算后,输出矩阵尺寸为 2×2

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        此处,转换后的稀疏矩阵尺寸变为 25×4,由于矩阵太大这里不展开进行罗列。最终转置卷积的结果为:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」

        此时,等价于 输入矩阵同时添加了 空洞 和 填充,再由仅转置的标准卷积核进行运算,过程如图 7 所示:

【机器学习】详解 转置卷积 (Transpose Convolution)「建议收藏」
图7 s=2 时,转置卷积运算示例 (步长 s’=1)

        更一般地,对于卷积核尺寸 kernel size = k,步长 stride = s > 1,填充 padding = p = 0 的转置卷积,其 等价的标准卷积 在原尺寸为 i' 的输入矩阵上进行运算,输出特征图的尺寸 o' 为: 

o' = s(i' - 1) + k

        同时,等价的标准卷积的输入矩阵 input 在卷积运算前,需先进行 padding’ = k-1 的填充;然后,相邻元素间的空洞数为 s-1,共有 i' - 1 组空洞需插入;从而,实际尺寸为 i'' = i' + 2(k-1) + (i' -1) \times (s-1) = s \times (i' - 1) + 2k - 1

        因此,实际上原计算公式为 (等价的标准卷积的步长 s' = 1):

o' = \frac{i'' - k + 2p} {s'} + 1 = s(i' - 1) + 2k - 1 - k + 1 = s(i' - 1) + k

        可见,通过控制步长 stride = s 的大小可以控制上采样的倍率,而该参数类比于膨胀/空洞卷积的 膨胀率/空洞数


六、小结 

        注意:矩阵中的实际权值不一定来自原始卷积矩阵。重要的是权重的排布是由卷积矩阵的转置得来的。转置卷积运算与普通卷积形成相同的连通性,但方向是反向的。

        我们可以用转置卷积来上采样,而 转置卷积的权值是可学习的,所以无需一个预定义的插值方法。

        尽管它被称为转置卷积,但这并不意味着我们取某个已有的卷积矩阵并使用转置后的版本。重点是,与标准卷积矩阵 (一对多关联而不是多对一关联) 相比,输入和输出之间的关联是以反向的方式处理的

        因此,转置卷积不是卷积,但可以用卷积来模拟转置卷积通过在输入矩阵的值间插入零值 (以及周围填零) 上采样输入矩阵,然后进行常规卷积 就会产生 与转置卷积相同的效果。你可能会发现一些文章用这种方式解释了转置卷积。但是,由于需要在常规卷积前对输入进行上采样,所以效率较低。 

        注意:转置卷积会导致生成图像中出现 网格/棋盘效应 (checkerboard artifacts),因此后续也存在许多针对该问题的改进工作。


参考资料:

听六小桨讲AI | 第5期:卷积的变体之转置卷积

https://towardsdatascience.com/up-sampling-with-transposed-convolution-9ae4f2df52d0

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151925.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国内一些服务器网站不用备案教程[通俗易懂]

    关于免备案这个问题,我首先说明一下,我不是在提倡大家域名不要备案,这只是一项技术并不是用来给大家滥用的,希望大家能够明白!众所周知,要想使用国内服务器或者主机是是必须要通过工信局的ICP备案的,但是也有的伙伴怕麻烦或者通过不了,这里我教下大家这个使用CDN做到免备案,其实要做到绕过国内服务器域名备案的方法目前小编知道的有两种,一种是利用反向代理、一种就是利用CDN,当然了,你有更多方法愿意分享出来的,可以在评论下方提出。今天,我们就着重讲利用CDN绕备案吧首先,我们要准备好工具,网站、服务器

    2022年4月8日
    295
  • 下载和安装MySQL(傻瓜)教程[通俗易懂]

    下载和安装MySQL(傻瓜)教程[通俗易懂]1.下载MySQL打开MySQL官网:MYSQL官网2.安装安装mysql时一直卡在startingtheserver这一位置,解决办法3.检查是否安装成功4.安装成功后进行登录

    2022年5月6日
    67
  • sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法[通俗易懂]

    sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法[通俗易懂]原文链接:http://www.cnblogs.com/huangfr/archive/2012/08/09/2629687.html1.因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了:一、右击系统数据库master,新建查询执行以下SQL代码:RESTOREDATABASExxxFROMDI

    2022年6月6日
    38
  • linux内核移植步骤「建议收藏」

    linux内核移植步骤「建议收藏」2016.6.8经过一个多星期的内核折磨,今天终于可以写下自己移植内核的一些心得,网上有很多博客论坛都有谈到,但是这些又说的方式有些模糊,这里我综合的几个博客在重新说下内核替换编译的步骤、以及如何更新启动项grub。替换linux的内核一共有两种方式,第一种方式是下载官方kernel提供的源码包,进行编译替换;第二种直接下载内核安装包deb,进行升级替换。下面分别从这两种方式进行一个说明:…

    2022年7月23日
    8
  • origin作图图例老是消失_origin画的图不见了

    origin作图图例老是消失_origin画的图不见了记录origin画图遇到的问题及其软件bug解决画图问题如何快速绘制框架画图问题如何快速绘制框架本例子以origin2021版本问题的提出:导入数据之后没有上框和右框(如图)目的:入Excel数据之后直接有上框和右框(也就是能不能设置这么一个模板),如图:解决方法方法一点击图片,找到我红色框的地方,点击即可(据说这种方法在2020版本及其以上即可支持)效果图:方法二:点击查看–显示–框架效果图:PS:美中不足的是,该方法不可以撤销…

    2022年9月21日
    3
  • Linux pstack命令[通俗易懂]

    Linux pstack命令[通俗易懂]概要打印运行进程的栈信息(快照),包括一个进程下的所有线程的栈信息。语法pstackpid解释pstack是封装了gdb功能的shell脚本,通过”threadapplyallbt”的命令获得输出所有的线程堆栈信息,再用sed进行替换和过滤#RunGDB,stripoutunwantednoise.$GDB–quiet$readnever-nx/proc/$1/exe$1<<EOF2>&1|

    2025年11月16日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号