动手学深度学习——转置卷积

张开发
2026/4/12 16:46:23 15 分钟阅读

分享文章

动手学深度学习——转置卷积
1. 前言在前面的内容中我们已经进入了语义分割这一部分。语义分割任务要求模型为图像中的每一个像素分配类别标签。但这里会遇到一个非常自然的问题卷积神经网络在不断提取特征时通常会通过步幅卷积、池化等操作让特征图越来越小。那最后怎么把这些较小的特征图恢复到接近原图大小得到像素级预测结果呢这就引出了本节要学习的重要内容转置卷积Transposed Convolution转置卷积不是简单地“反着做卷积”这么粗糙而是一种能够实现上采样的重要操作。它在语义分割、生成模型、图像恢复等任务中都非常常见。这一节的核心就是搞清楚什么是转置卷积它和普通卷积有什么关系它为什么能让输出变大它在分割任务里有什么作用2. 为什么需要转置卷积标准卷积在很多情况下会让特征图尺寸减小。例如卷积核大小为3 × 3没有填充步幅为 1那么输出尺寸通常会变小。如果再加上池化层步幅大于 1 的卷积特征图尺寸还会进一步缩小。这在分类任务里通常不是问题因为分类最终只需要输出一个类别。但在语义分割中我们需要输出一张和原图空间结构对应的预测图。所以就需要一种操作能够把较小的特征图重新变大。而转置卷积正是解决这个问题的重要方法之一。3. 什么是转置卷积转置卷积英文叫Transposed Convolution也常被叫作反卷积deconvolution分数步长卷积fractionally strided convolution不过严格来说“反卷积”这个说法并不总是准确在深度学习中更规范的叫法还是转置卷积。它的核心作用可以先简单理解成通过一种特殊的卷积形式把输入特征图映射成更大的输出特征图。也就是说它常被用来做上采样分辨率恢复特征图放大4. 普通卷积和转置卷积的直观区别为了理解转置卷积先回顾一下普通卷积在干什么。4.1 普通卷积普通卷积通常是输入一张较大的图卷积核在上面滑动得到一张较小或相同大小的输出图它更像是从输入中提取局部特征4.2 转置卷积转置卷积则更像是输入一张较小的特征图通过某种“展开式”的方式得到一张更大的输出图它更像是把输入中的每个位置扩散到更大的输出区域中所以从空间尺寸上看普通卷积常常让图变小转置卷积常常让图变大5. 转置卷积最直观的理解方式李沐这里讲转置卷积最关键的是不要一上来就背公式而是先看它的计算过程。普通卷积的计算可以理解为卷积核在输入上滑动并在每个位置做加权求和生成输出元素。而转置卷积可以反过来理解为输入中的每一个元素都会通过卷积核“投射”到输出中的一块区域上所有输入元素的投射结果再叠加起来形成最终输出。这就是它为什么能让输出尺寸变大的根本原因。6. 一个最简单的转置卷积例子假设输入是一个2 × 2的矩阵X [[0, 1], [2, 3]]再设卷积核是一个2 × 2的矩阵K [[0, 1], [2, 3]]在转置卷积中输入的每个元素都会和整个卷积核相乘然后放到输出对应的位置上。例如输入左上角元素0乘卷积核后加到输出左上区域输入右上角元素1乘卷积核后加到输出偏右上区域输入左下角元素2乘卷积核后加到输出偏左下区域输入右下角元素3乘卷积核后加到输出右下区域最后把这些区域重叠部分相加就得到输出。7. 为什么转置卷积会让输出变大从刚才这个过程就能看出输入中的一个元素不再只对应输出中的一个元素而是会“铺开”成输出中的一个小块区域。如果输入有多个元素这些小块区域再不断平移、叠加最终输出自然就会比输入更大。所以本质上转置卷积的“放大”并不是凭空插值而是通过卷积核把输入信息分布到更大的空间范围里。8. 转置卷积和普通卷积的填充方式不同这是这一节里一个很容易混淆但又很重要的点。8.1 普通卷积中的填充普通卷积里padding是加在输入周围的目的是控制输出尺寸。8.2 转置卷积中的填充转置卷积里padding的含义和普通卷积的直觉不完全一样。它通常可以理解为从输出边缘裁掉一些元素所以虽然名字也叫padding但在转置卷积里它对输出尺寸的影响方式和普通卷积不同。这一点一定要注意不能机械照搬普通卷积的理解。9. 转置卷积中的步幅也会影响输出大小和普通卷积类似转置卷积也有stride。但普通卷积中步幅变大通常会让输出更小而在转置卷积中步幅变大往往会让输出更大。你可以这样理解普通卷积卷积核在输入上“跳着走”所以输出点更少转置卷积输入元素投影到输出时“间隔更大”所以输出范围更大所以步幅在两种操作中的空间效果正好呈现出相反趋势。10. 李沐这里的代码示例怎么理解这一节常见的代码形式是直接用 PyTorch 的ConvTranspose2d。例如import torch from torch import nn X torch.tensor([[[[0.0, 1.0], [2.0, 3.0]]]]) K torch.tensor([[[[0.0, 1.0], [2.0, 3.0]]]]) tconv nn.ConvTranspose2d(1, 1, kernel_size2, biasFalse) tconv.weight.data K tconv(X)这段代码的含义很清楚输入通道数1输出通道数1卷积核大小2不加偏置手动把卷积核设成K这样就可以直接观察转置卷积的结果。11. 这段代码为什么有教学价值因为它没有掺杂复杂网络结构而是让我们只关注一件事一个小输入矩阵经过转置卷积后如何变成更大的输出矩阵。这能帮助我们从最底层理解转置卷积不是魔法它依然是线性运算它本质上仍然和卷积核有关只是输入输出的组织方式变了12. 转置卷积如何控制输出尺寸这一节另一个重点就是要知道转置卷积的输出大小不是随意的而是由参数共同决定的。主要相关参数包括kernel_sizestridepadding在二维情况下转置卷积的输出尺寸一般满足输出大小 (输入大小 - 1) * stride - 2 * padding kernel_size这个公式和普通卷积很不一样但它非常重要因为后面做分割模型时需要精确控制输出尺寸。13. 用公式理解一个简单例子假设输入大小是2 × 2卷积核大小是2 × 2步幅stride 1填充padding 0。那么输出大小就是(2 - 1) * 1 - 0 2 3所以输出大小为3 × 3这正好说明输入2 × 2经转置卷积后可以得到更大的输出。14. 转置卷积和上采样的区别很多人会把转置卷积和普通插值上采样混在一起但它们并不完全一样。14.1 普通上采样普通上采样如最近邻插值、双线性插值通常是按固定规则把图像放大它本身没有需要学习的参数。14.2 转置卷积转置卷积则不同它包含可学习卷积核参数因此它不是简单“放大图像”而是一边放大空间分辨率一边学习如何生成更合适的输出特征。这就是为什么它在深度学习模型中尤其常见。15. 转置卷积在语义分割中的作用到这里就可以回到最初的问题为什么分割模型里需要转置卷积原因很简单编码部分不断下采样得到小而强的语义特征但最终输出需要恢复到接近输入图像的空间分辨率因此需要一种可学习的上采样方式转置卷积正好可以承担这个任务。也就是说在分割模型里转置卷积常常负责把低分辨率特征图逐步恢复到高分辨率预测图这也是后面 FCN 中非常关键的一步。16. 转置卷积不是“真正的逆卷积”这一点也很重要。虽然它名字里有“转置”也常有人叫它“反卷积”但它并不表示普通卷积做完以后转置卷积一定能完美恢复原输入实际上它不是普通卷积的严格逆运算。之所以叫“转置卷积”是因为从线性代数角度看它和卷积操作对应矩阵的转置有关。所以它和普通卷积是密切相关的线性操作但不是简单的可逆还原。17. 这一节在李沐课程中的位置意义“转置卷积”这一节放在“语义分割数据集”后面非常合理。因为前面已经明确了分割任务要输出像素级预测图输出需要保留空间结构那么接下来最自然的问题就是如何把深层小特征图恢复成更大的输出图这时候转置卷积就顺理成章地出现了。所以这一节的作用其实是在为后面的转置卷积的代码实现FCN做技术铺垫。18. 本节总结这一节我们学习了转置卷积核心内容可以总结为以下几点。18.1 转置卷积常用于上采样它能够把较小的输入特征图变成较大的输出特征图。18.2 它的计算方式与普通卷积不同输入中的每个元素都会通过卷积核投射到输出中的一块区域。18.3 它的输出大小由多个参数共同决定包括卷积核大小步幅填充18.4 它和普通插值上采样不同转置卷积具有可学习参数因此更适合深度学习模型。18.5 它是语义分割模型的重要工具特别是在需要恢复空间分辨率时非常有用。19. 学习感悟转置卷积这一节表面上是在讲一个新算子但实际上它在视觉任务里非常重要因为它代表了一种思路不只是提取特征还要把特征重新“展开”回空间结构中。分类任务更关注“压缩信息、做判断”而分割任务则要求“既理解语义又恢复位置”。从这个角度看转置卷积就是连接“深层语义特征”和“像素级输出结果”的关键桥梁之一。

更多文章