【神经网络结构的组成】深入理解 转置卷积与转置卷积核

news2025/4/19 8:52:07

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 

目录

1. 前言

2. 转置卷积

2.1 上采样的必要性

2.2 为什么要使用转置卷积

2.3 卷积运算

2.4 卷积运算多对一关系的思考

2.5 卷积核的本质(从矩阵卷积转为行卷积)

2.7 对转置卷积核的思考

3. 总结


1. 前言

        之前有机会看过这篇文章:【深度学习基础】深入理解 卷积与卷积核-CSDN博客的友友一定对卷积并不陌生,这也算是各种网络结构(RNN、LSTM等)的构成基础之一。因为网络结构研究的就是各种层(卷积、池化、全连接等)的组合方式。然后模型就是研究如何使用这些网络结构用来解决特定的问题。本篇文章的内容——转置卷积 就属于网络结构的组成部分,各种层结构

深度学习的三层次:

  • 卷积、池化、全连接等层是深度学习中最基础的东西。他们的不同组合方式产生了不同的网络结构。
  • 不同的网络结构对特征的提取是完全不同的。例如RNN结构能够提取上下文的信息适用于语言、时间等;CNN结构能够提取同一个图片从局部到整体的信息适用于计算机视觉上的使用;U-Net结构能够在提取特征的同时输出一个高分辨率的图片,因此适用于语义切割。
  • 在对问题充分理解后,对该问题进行数学建模。在这个模型中,我们需要定义数据来源、完整架构(包括一个或多个网络结构)、训练方式、损失函数等。例如:生成对抗网络模型、扩散模型等。

使用说明:三层次的内容层层递进:前者是后者的基础,后者是前者的递进。因此猫猫也将其分到两个专栏中,第一部分(深度学习中的层结构)作为【神经网络结构的组成】安排在《AI认知筑基三十讲》专栏中,用于初学者的学习;第二部分(网络结构、模型)分为【深度学习的骨架与脉搏】和【深度学习的灵魂】安排在《深度学习理论直觉三十讲》专栏中,用于深度学习爱好者学习。

2. 转置卷积

        明确一个点:转置卷积用于上采样

2.1 上采样的必要性

        使用神经网络生成图像通常涉及从低分辨率到高分辨率的上采样。因为神经网络理解一个图片的过程中就会用池化层、卷积层等下采样层将图片不断压缩,由此来获得更上层的信息(更抽象的图片信息)。理解之后想要再输出原本的图片+其他信息就需要用到上采样去处理了。下图就是一个上采样:

进行上采样操作的方法有多种:

  • 最近邻插值
  • 双线性插值
  • 双三次插值

        所有这些方法都涉及一些插值方法,我们必须在决定网络架构时选择它们。这就像手动特征工程,网络无法学习任何东西。

当然,最近大家都是用扩散模型或者对抗模型去完成超分辨率的工作(也就是把一个图片变更清晰)。使用生成模型去做上采样和使用插值或者转置卷积的方法是不同的,可以说生成模型

2.2 为什么要使用转置卷积

        如果我们希望网络学习如何以最佳方式进行上采样,可以使用转置卷积。它不使用预定义的插值方法。它具有可学习的参数。理解转置卷积概念很有帮助,因为重要的论文和项目都使用它,例如:

  • DCGAN 中的生成器采用随机采样值来生成全尺寸图像。
  • 语义分割在编码器中使用卷积层提取特征,然后在解码器中恢复原始图像大小,从而对原始图像中的每个像素进行分类。

转置卷积也称为:

  • 分数步长卷积
  • 反卷积

我将在本文中仅使用转置卷积这个词,但您可能会在其他文章中注意到其他名称。

2.3 卷积运算

        让我们用一个简单的例子来解释卷积运算的工作原理。假设我们有一个 4x4 矩阵,并应用一个 3 x 3 核的卷积运算,该核没有填充,步长为 1。如下所示,输出是一个 2x2 矩阵。

        卷积运算计算输入矩阵与核矩阵之间元素乘积之和。由于没有填充且步长为 1,我们只能执行四次。因此,输出矩阵为 2x2。

        这种卷积运算的关键点是输入值和输出值之间存在位置连通性。例如,输入矩阵的左上角值会影响输出矩阵的左上角值。我们使用 3 x 3 核将 9 个输入矩阵值连接到 1 个输出矩阵值。 卷积运算形成多对一关系 。记住这一点,稍后我们会用到它。

2.4 卷积运算多对一关系的思考

        现在,假设我们想反过来。我们想将一个矩阵中的一个值与另一个矩阵中的九个值关联起来。这是一种一对多的关系。这就像卷积运算中的逆向操作,也就是转置卷积的核心思想。

        例如,我们将一个 2x2 矩阵上采样为 4x4 矩阵,该操作保持 1 比 9 的关系。

        但是我们如何执行这样的操作呢? 其实也不难理解了,卷积操作依靠卷积核实现多对一操作,那么转置卷积自然也可以依靠转置卷积核实现一对多关系

2.5 卷积核的本质(从矩阵卷积转为行卷积)

        我们可以用矩阵来表示卷积运算。它是一个重新排列的核矩阵,因此我们可以使用矩阵乘法来进行卷积运算。

        但是,现在我说卷积操作可以转化为一维的方式展开,也就说一行代表一个卷积结果。原本卷积结果如下:

        现在想要转变为这样:

1. 首先必然要将输入的矩阵做变化:将输入矩阵(4x4)展平为列向量(16x1)

2. 将卷积核变化:将 3x3 内核重新排列成 4x16 矩阵,如下所示:

        因此就有下面的这种卷积:

上面操作就将矩阵卷积转为行卷积了!! 

2.7 对转置卷积核的思考

        看到上面对卷积核的变化,不难发现,卷积核的本质都可以转化为每一行的卷积。从矩阵卷积到行卷积的转变,让猫猫有了下面的思考:使用卷积矩阵,你可以从 16(4x4)变为 4(2x2),本质是因为卷积矩阵本身就是 4x16。然后,如果你有一个 16x4 矩阵,你可以从 4(2x2)变为 16(4x4)

        我们希望从 4 (2x2) 变为 16 (4x4)。因此,我们使用一个 16x4 矩阵。但这里还有一件事,我们需要检查一下是否满足,那就是是否保持 1 到 9 的关系。假设我们将卷积矩阵 C (4x16) 转置为 CT (16x4)。我们可以将 CT (16x4) 与列向量 (4x1) 进行矩阵乘法,生成一个输出矩阵 (16x1)。转置后的矩阵将一个值与输出中的 9 个值联系起来。

        由此可以看到,我们将一个较小的矩阵(2x2)上采样为一个较大的矩阵(4x4)。同时也保证了一个值和九个值之间的对应关系。注意:矩阵中的实际权重值并非来自原始卷积矩阵(这是一个可训练的参数,和卷积核一样)。重要的是,权重布局与卷积矩阵形状的转置相同

3. 总结

        转置卷积运算与常规卷积形成相同的连通性,但在转置的方向上,我们可以用它来进行上采样。此外,转置卷积中的权重是可学习的。因此,我们不需要预先定义插值方法。虽然它被称为转置卷积,但这并不意味着我们采用某个现有的卷积核并对其进行转置。重点在于,与标准卷积矩阵相比,转置卷积对输入和输出之间的关联进行了反向处理(一对多关联,而非多对一关联)。因此,转置卷积并非真正的卷积。但我们可以用卷积来模拟转置卷积。我们通过在输入矩阵的值之间添加零来对输入进行上采样,这样直接卷积就能产生与转置卷积相同的效果。你可能会找到一些文章以这种方式解释转置卷积。然而,由于需要在卷积之前添加零来对输入进行上采样,因此效率较低。

        简单点来说,转置卷积和卷积类似,只是提供一个形式固定的模板,核内部的值是多少是通过学习得到的。特别地:转置卷积会造成生成图像的棋盘格伪影。因此建议先进行插值方法,然后再进行转置卷积操作,以减少此类问题

【如果想学习更多深度学习知识,可以订阅热门专栏】

  • 《AI认知筑基三十讲》
  • 《PyTorch科研加速指南:即插即用式模块开发》
  • 《深度学习理论直觉三十讲》

  如果想要学习更多人工智能的知识,大家可以点个关注并订阅,持续学习、天天进步你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis-plus笔记 (上)

简介 [MyBatis-Plus](简称 MP)是一个 [MyBatis]的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 mybatis-plus总结: 注意:mybatis-puls仅局限于单表操作。 自动生成单表的C…

大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!

微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法,超级快! 上图左侧是我的原文档,右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型,然后本地模型生成有关问题,并基于文…

opencv 灰度实验

opencv 灰度实验 1. 最大值法2. 平均值法3. 加权均值法4(直接读取灰度图)cv2.IMREAD_GRAYSCALE5内置将原图转换为灰度图cv2.cvtColor()6 两个极端的灰度值 灰度图与彩色图最大的不同就是:彩色图是由R、G、B三个通道组成,而灰度图只有一个通道&#xff0c…

高性能内存kv数据库Redis(续)

目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里? 3.1r…

【指纹浏览器系列-chromium编译】

本文提供了一步一步的指导来帮助读者在Windows环境下成功编译Chromium浏览器。涵盖了系统需求、开发环境搭建、代码下载及构建等关键步骤。 官方编译文档:https://github.com/chromium/chromium/blob/main/docs/windows_build_instructions.md 一、系统要求 一台…

Docker华为云创建私人镜像仓库

Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 : 或者在其他页面的搜索栏中搜索 容器镜像服务 : 进入到页面后,点击 创建组织 (华为云的镜像仓库称为组织): 设置组织名字后&…

Ubuntu 22.04安装MySQL : Qwen2.5 模型对话数据收集与微调教程

在Ubuntu 22.04安装MySQL的教程请点击下方链接进行参考: 点击这里获取MySQL安装教程 今天将为大家带来如何微调Qwen2.5模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ ​ 1 大模型 Qwen2.5 微调步骤 1.1 从 github 仓库 克隆项目 克隆存储库:#拉取代码 git clo…

关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析

以下是关于 JDK 中的 jce.jar 的详细解析,涵盖其作用、内容、历史背景及使用注意事项: 一、jce.jar 的核心作用 jce.jar 是 Java Cryptography Extension (JCE) 的核心实现库,提供 加密算法支持,包括: 对称加密&…

React 更新state中的对象

更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值,包括对象。但是,你不应该直接修改存放在 React state 中的对象。相反,当你想要更新一个对象时,你需要创建一个新的对象(或者将其拷贝一份)…

算法思想之模拟

欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之模拟 发布时间:2025.4.14 隶属专栏:算法 目录 算法介绍核心特点常见问题优化方向 例题替换所有的问号题目链接题目描述算法思路代码实现 提莫攻击题目链接题目描述算法思路代码实现…

测试基础笔记第四天(html)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 html介绍1. 介绍2.骨架标签3.常用标签标题标签段落标签超链接标签图片标签换行和空格标签布局标签input标签(变形金刚)form标签列表标签 htm…

WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:

顶层基类 DispatcherObject:处于继承体系最顶端,是一个抽象类。它为 WPF 元素提供了与 Dispatcher(调度器)交互的能力,Dispatcher 负责管理线程间的消息传递,确保 UI 操作在正确的线程(通常是 …

十九、UDP编程和IO多路复用

1、UDP编程 服务端&#xff1a; #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h> #include &l…

DeepSeek使用001:Word中配置DeepSeek AI的V3和R1模型

文章目录 Word中配置DeepSeek大模型1、勾选开发工具2、信任中心设置3、添加DeepSeek-V3模型4、获取API KEY5、添加DeepSeek-R1模型6、新建组7、测试使用 Word中配置DeepSeek大模型 1、勾选开发工具 打开【选项】 选择【自定义功能区】 2、信任中心设置 打开【信任中心】&…

华为OD机试真题——攀登者2(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 华为OD机试真题《攀登者2》&#xff1a; 目录 题目名称&#xff1a;攀登者2…

Windows卸载重装Docker

卸载 删除C:\Program Files\Docker &#xff0c;如果更改了路径的就找到相关位置进行删除 删除 C:\Users\<用户名>\.docker 清理注册表&#xff0c;不然重装会报错 Exising installation is up to date 按下WindowR唤起命令输入界面&#xff0c;输入regedit打开注…

双目视觉中矩阵等参数说明及矫正

以下是标定文件中各个参数的详细解释&#xff1a; 1. 图像尺寸 (imageSize) 参数值: [1280, 1024]含义: 相机的图像分辨率&#xff0c;宽度为1280像素&#xff0c;高度为1024像素。 2. 相机内参矩阵 (leftCameraMatrix / rightCameraMatrix) 结构: yaml data: [fx, 0, cx, 0,…

PyTorch核心函数详解:gather与where的实战指南

PyTorch中的torch.gather和torch.where是处理张量数据的关键工具&#xff0c;前者实现基于索引的灵活数据提取&#xff0c;后者完成条件筛选与动态生成。本文通过典型应用场景和代码演示&#xff0c;深入解析两者的工作原理及使用技巧&#xff0c;帮助开发者提升数据处理的灵活…

Go:接口

接口既约定 Go 语言中接口是抽象类型 &#xff0c;与具体类型不同 &#xff0c;不暴露数据布局、内部结构及基本操作 &#xff0c;仅提供一些方法 &#xff0c;拿到接口类型的值 &#xff0c;只能知道它能做什么 &#xff0c;即提供了哪些方法 。 func Fprintf(w io.Writer, …

ESP32+Arduino入门(三):连接WIFI获取当前时间

ESP32内置了WIFI模块连接WIFI非常简单方便。 代码如下&#xff1a; #include <WiFi.h>const char* ssid "WIFI名称"; const char* password "WIFI密码";void setup() {Serial.begin(115200);WiFi.begin(ssid,password);while(WiFi.status() ! WL…