关于转置卷积

🧠 具体讲解神经网络中的转置卷积(Transposed Convolution)


🧭 1. 转置卷积的动机:为什么我们需要它?

标准卷积通常会降低特征图的空间尺寸(比如从 64x64 → 32x32),这对于提取高级特征很有用。但在某些任务中,比如:

  • 图像生成(如 GAN)
  • 图像分割(如 U-Net 的解码器)
  • 上采样(upsampling)

我们需要把特征图的尺寸还原回来(比如从 32x32 → 64x64),而且希望这个还原是可学习的,也就是说参数可训练。

这时候就需要 转置卷积(也叫反卷积、fractionally strided convolution)。


🧱 2. 什么是转置卷积?直觉理解

我们先从标准卷积的矩阵乘法视角出发来看。

标准卷积可以被视为:
y = K x y = Kx y=Kx
其中 K K K 是一个稀疏的矩阵(由卷积核扩展而来)。

那么转置卷积就是这个线性变换的转置矩阵乘法

转置卷积是:
x = K T y x = K^T y x=KTy

直觉上:

  • 标准卷积:压缩/整合信息
  • 转置卷积:扩展/重建信息

🧮 3. 数学公式和计算流程

设输入特征图大小为 C i n × H i n × W i n C_{in} \times H_{in} \times W_{in} Cin×Hin×Win
卷积核大小为 K × K K \times K K×K,步长为 S S S,padding 为 P P P,输出通道数为 C o u t C_{out} Cout

标准卷积输出尺寸计算:

H o u t = ⌊ H i n + 2 P − K S ⌋ + 1 H_{out} = \left\lfloor \frac{H_{in} + 2P - K}{S} \right\rfloor + 1 Hout=SHin+2PK+1

转置卷积输出尺寸计算:

H o u t = ( H i n − 1 ) ⋅ S − 2 P + K H_{out} = (H_{in} - 1) \cdot S - 2P + K Hout=(Hin1)S2P+K

你可以看到,转置卷积公式中是乘而不是除,所以它有上采样的效果。


🔄 4. 转置卷积是怎么运作的?图示直觉(描述)

  1. 在输入之间插入空格(步长为 2 就在像素间插入 1 个零)
  2. 在这个“稀疏图像”上进行普通卷积
  3. 因为插入了零,卷积核扫描时会“扩大视野”,从而生成更大的输出

这种方式又叫 “fractionally strided convolution”(因为它“模拟”了小于 1 的步长)


🧠 5. 与标准卷积的反向传播的关系

这其实是转置卷积名字的由来!

  • 在实现标准卷积的 反向传播 时,梯度传播过程中的某一步就需要一个类似转置卷积的操作来“还原”梯度。
  • 这也是为什么 PyTorch 中 ConvTranspose2dConv2d 的“梯度反向过程”的实现。

所以:

转置卷积并不是“把卷积反过来”,而是在反向传播中自然出现的操作。


📦 6. PyTorch 实现

import torch
import torch.nn as nn# 转置卷积层:输入通道3,输出通道16,kernel_size=3,stride=2,padding=1
conv_transpose = nn.ConvTranspose2d(in_channels=3, out_channels=16, kernel_size=3, stride=2, padding=1, output_padding=1)x = torch.randn(1, 3, 32, 32)
y = conv_transpose(x)
print(y.shape)  # torch.Size([1, 16, 64, 64])

注意:

output_padding 是为了调节输出大小(因为整数除法/乘法可能不是精确反转)

转置卷积参数量和普通卷积一样: C i n × C o u t × K 2 C_{in} \times C_{out} \times K^2 Cin×Cout×K2

🔁 7. 参数与输出尺寸公式总结

对于 ConvTranspose2d,输出大小计算公式为:

H o u t = ( H i n − 1 ) ⋅ S − 2 P + K + output_padding H_{out} = (H_{in} - 1) \cdot S - 2P + K + \text{output\_padding} Hout=(Hin1)S2P+K+output_padding

这里:

  • H i n H_{in} Hin:输入高度
  • S S S:stride(步长)
  • P P P:padding
  • K K K:kernel size(卷积核大小)
  • output_padding:用于解决无法精确还原的边界问题

🔬 8. 转置卷积 vs 上采样+卷积

我们也可以用非转置卷积实现上采样 + 卷积操作:

import torch.nn.functional as Fx = torch.randn(1, 3, 32, 32)
x_up = F.interpolate(x, scale_factor=2, mode='nearest')  # 最近邻上采样
conv = nn.Conv2d(3, 16, kernel_size=3, padding=1)
y = conv(x_up)

区别在于:

方法可学习参数是否精确上采样计算效率
转置卷积✅ 是✅ 是✅ 快
上采样 + 卷积✅ 是✅ 是较慢,但更可控

💣 9. 转置卷积的常见问题:Checkerboard Artifacts

因为卷积核在插值时可能导致像素间不均匀的覆盖区域,转置卷积有时会出现“棋盘格伪影”。

🛠️ 解决方式:

  • 使用 上采样 + 卷积 替代
  • 使用更小的 kernel 和 stride
  • 加强正则化,或使用 PixelShuffle 等替代方式

🧪 10. 实际应用:U-Net 解码器

在 U-Net 的上采样阶段,我们希望将低分辨率特征图还原为高分辨率(最终恢复为原图大小)。

self.upconv = nn.ConvTranspose2d(64, 32, kernel_size=2, stride=2)

然后 concat encoder 输出 + decoder 输出,再继续卷积。

转置卷积在这一步:

  • 学习“如何恢复图像细节”
  • 与 skip connection 保持 spatial 对齐
  • 输出最终的分割图像或生成图像

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

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

相关文章

JavaScript 模块化详解( CommonJS、AMD、CMD、ES6模块化)

一.CommonJS 1.概念 CommonJS 规范概述了同步声明依赖的模块定义。这个规范主要用于在服务器端实现模块化代码组 织,但也可用于定义在浏览器中使用的模块依赖。CommonJS 模块语法不能在浏览器中直接运行;在浏览器端,模块需要提前编译打包处理…

TCP BBR 的优化

前段时间,老板发了篇资料,下面是我学习的相关记录整理。 https://aws.amazon.com/cn/blogs/china/talking-about-network-optimization-from-the-flow-control-algorithm/ PS:ubuntu24默认使用的tcp控制算法。还是 cubic sysctl net.ipv4.tc…

什么是异步?

什么是异步? 异步是一个术语,用于描述不需要同时行动或协调就能独立运行的流程。这一概念在技术和计算领域尤为重要,它允许系统的不同部分按自己的节奏运行,而无需等待同步信号或事件。在区块链技术中,异步是指网络中…

SSM婚纱摄影网的设计

🍅点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 SS…

石头剪刀布游戏

自己写的一个石头剪刀布游戏&#xff0c;如果有需要更改的地方请指出 #define _CRT_SECURE_NO_WARNINGS // scanf_s编写起来太过于麻烦&#xff0c;直接把这个警告关掉&#xff0c;便于编写。 #include <stdio.h> #include <stdlib.h> #include <time.h> //…

大数据系列之:Kerberos

大数据系列之&#xff1a;Kerberos 基本概念工作流程安全特性应用场景总结加密原理Kerberos认证流程更改您的密码授予账户访问权限票证管理Kerberos 票据属性使用 kinit 获取票据使用 klist 查看票据使用 kdestroy 销毁票据.k5identity 文件描述 Kerberos 是一种网络认证协议&a…

WPF 免费UI 控件HandyControl

示例效果和代码 直接可以用 Button 按钮 | HandyOrg 1.安装 , 输入 HandyControl 2.<!--配置HandyControl--> <!--配置HandyControl--> <ResourceDictionary Source"pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/> …

windows部署docker

1.下载docker 打开浏览器&#xff0c;访问 Docker Desktop 下载页面。 2.安装 Docker Desktop 运行安装程序&#xff1a; 双击下载的 Docker Desktop 安装包&#xff0c;启动安装程序。 选择安装选项&#xff1a; 按照屏幕上的指示进行操作。建议选择默认选项&#xff0c;包…

【Linux】远程登录时,使用图形界面报错:MoTTY X11 proxy: Unsupported authorisation protocol

1、问题描述 使用 MobaXterm 远程登录Ubuntu后,使用sudo权限运行图形界面程序报错: MoTTY X11 proxy: Unsupported authorisation protocol (gpartedbin:10518): Gtk-WARNING **: 22:01:34.377: cannot open display: localhost:10.02、查看SSH配置 修改 SSH 服务端配置,…

解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案

问题背景 在使用 Hugging Face 的 SentenceTransformer 加载预训练模型 all-MiniLM-L6-v2 时&#xff0c;遇到了以下错误&#xff1a; 代理连接失败&#xff08;ProxyError / SSLError: KRB5_S_TKT_NYV&#xff09;大文件下载中断&#xff08;unexpected EOF while reading&a…

MySQL——DQL的单表查询

1、查询表中所有的字段&#xff08;列&#xff09; 语法&#xff1a;select * from 表名; * 是通配符&#xff0c;用来表示所有的字段&#xff08;列&#xff09;。 select 表示查询哪些列。 from 表示从哪张表中查询。 2、查询表中指定的字段 语法&#xff1a;select 列…

开源RuoYi AI助手平台的未来趋势

近年来&#xff0c;人工智能技术的迅猛发展已经深刻地改变了我们的生活和工作方式。 无论是海外的GPT、Claude等国际知名AI助手&#xff0c;还是国内的DeepSeek、Kimi、Qwen等本土化解决方案&#xff0c;都为用户提供了前所未有的便利。然而&#xff0c;对于那些希望构建属于自…

[WUSTCTF2020]CV Maker1

进来是个华丽的界面&#xff0c;我们先跟随这个网页创造一个用户 发现了一个上传端口&#xff0c;尝试上传一个php文件并抓包 直接上传进不去&#xff0c;加个GIF89A uploads/d41d8cd98f00b204e9800998ecf8427e.php 传入 并且报告了 上传路径&#xff0c;然后使用蚁剑连接

Spring 中的 IOC

&#x1f331; 一、什么是 IOC&#xff1f; &#x1f4d6; 定义&#xff08;通俗理解&#xff09;&#xff1a; IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09; 是一种设计思想&#xff1a;对象不再由你自己创建和管理&#xff0c;而是交给 Spring 容器…

Vue2-实现elementUI的select全选功能

文章目录 使用 Element UI 的全选功能自定义选项来模拟全选 在使用 Element UI 的 el-select组件时&#xff0c;实现“全选”功能&#xff0c;通常有两种方式&#xff1a;一种是使用内置的全选功能&#xff0c;另一种是通过自定义选项来模拟全选。 使用 Element UI 的全选功能…

小菜Go:Ubuntu下Go语言开发环境搭建

前置要求Ubuntu环境搭建 文章推荐 此处推荐一个比较好的文章&#xff0c;基本按部就班就欧克~ 安装虚拟机&#xff08;VMware&#xff09;保姆级教程&#xff08;附安装包&#xff09;_vmware虚拟机-CSDN博客 安装可能遇到的问题 虚拟机安装遇到的问题如&#xff1a;Exception…

安卓中app_process运行报错Aborted,怎么查看具体的报错日志

我在pc端生成了一个jar包&#xff0c;可以正常执行&#xff0c;但是导入到安卓的/data/local/tmp下面执行就会报错 执行命令如下&#xff1a; adb shell cd /data/local/tmp app_process -Djava.class.path/data/local/tmp/demo.jar /data/local/tmp com.example.demo.Hello然…

Python 面向对象 - 依赖倒置原则 (DIP)

1. 核心概念 依赖倒置原则(Dependency Inversion Principle, DIP) 是SOLID原则中的"D"&#xff0c;包含两个关键点&#xff1a; 高层模块不应依赖低层模块&#xff0c;二者都应依赖抽象抽象不应依赖细节&#xff0c;细节应依赖抽象 2. 使用场景 典型应用场景 系…

centos7 yum install docker 安装错误

1、错误信息&#xff1a; [rootlocalhost atguigu]# yum install docker 已加载插件&#xff1a;fastestmirror, langpacks Repository base is listed more than once in the configuration Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http:…

【Gorm】模型定义

intro package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite" // GORM 使用该驱动来连接和操作 SQLite 数据库。 )type Product struct {gorm.Model // 嵌入GORM 内置的模型结构&#xff0c;包含 ID、CreatedAt、UpdatedAt、DeletedAt 四个字段Cod…