计算机视觉:转置卷积

news2024/11/24 19:39:41

转置卷积


文章目录

  • 转置卷积
  • 基本操作
  • 填充、步幅和多通道
  • 性质


转置卷积(Transposed Convolution),也称为反卷积(Deconvolution),是卷积神经网络(CNN)中的一种操作,它可以将一个低维度的特征图(如卷积层的输出)转换为更高维度的特征图(如上一层的输入)。转置卷积操作通常用于图像分割、生成对抗网络(GAN)和语音识别等任务中。

在传统卷积操作中,我们使用一个滑动窗口(卷积核)来从输入图像中提取特征。而在转置卷积中,我们使用一个滑动窗口来填充零值的输出图像,然后通过卷积核来计算输出图像中每个像素的值。这个过程可以看作是对输入特征图进行上采样(增加分辨率)的过程。

具体来说,假设我们有一个输入特征图 X X X,大小为 N × N × C N\times N\times C N×N×C,其中 N N N 是特征图的宽和高, C C C 是特征图的通道数。我们还有一个大小为 K × K K\times K K×K 的卷积核 W W W,其中 K K K 是卷积核的大小。转置卷积的输出特征图 Y Y Y 的大小为 ( N + 2 P − K + 1 ) × ( N + 2 P − K + 1 ) × C ′ (N+2P-K+1)\times(N+2P-K+1)\times C' (N+2PK+1)×(N+2PK+1)×C,其中 P P P 是填充大小, C ′ C' C 是输出特征图的通道数。转置卷积的计算方式可以表示为:

Y i , j , k = ∑ u = 0 K − 1 ∑ v = 0 K − 1 ∑ c ′ = 1 C ′ X i + u , j + v , c W u , v , c ′ , k Y_{i,j,k} = \sum_{u=0}^{K-1}\sum_{v=0}^{K-1}\sum_{c'=1}^{C'} X_{i+u,j+v,c}W_{u,v,c',k} Yi,j,k=u=0K1v=0K1c=1CXi+u,j+v,cWu,v,c,k

其中 i , j i,j i,j 是输出特征图中的坐标, k k k 是输出特征图中的通道数, u , v u,v u,v 是卷积核中的坐标, c c c 是输入特征图中的通道数, c ′ c' c 是输出特征图中的通道数。

需要注意的是,转置卷积的输出特征图大小取决于填充大小 P P P,因此要根据具体的应用场景和网络结构来确定填充大小。另外,转置卷积还可以通过调整步长(stride)来控制输出特征图的大小。如果步长为 S S S,则输出特征图的大小为 ( N − 1 ) × S + K − 2 P (N-1)\times S+K-2P (N1)×S+K2P

基本操作

让我们暂时忽略通道,从基本的转置卷积开始,设步幅为1且没有填充。 假设我们有一个 n h × n w n_h\times n_w nh×nw的输入张量和一个 k h × k w k_h\times k_w kh×kw的卷积核。 以步幅为1滑动卷积核窗口,每行 n h n_h nh次,每列 n w n_w nw次,共产生 n h × n w n_h\times n_w nh×nw个中间结果。 每个中间结果都是一个 ( n h × k h − 1 ) × ( n w × k w − 1 ) (n_h\times k_h-1)\times (n_w\times k_w-1) (nh×kh1)×(nw×kw1)的张量,初始化为0。 为了计算每个中间张量,输入张量中的每个元素都要乘以卷积核,从而使所得的 k h × k w k_h\times k_w kh×kw张量替换中间张量的一部分。 请注意,每个中间张量被替换部分的位置与输入张量中元素的位置相对应。 最后,所有中间结果相加以获得最终结果。

举个例子如下:
在这里插入图片描述
我们可以对输入矩阵X和卷积核矩阵K实现基本的转置卷积运算trans_conv。

def trans_conv(X, K):
    h, w = K.shape
    Y = torch.zeros((X.shape[0] + h - 1, X.shape[1] + w - 1))
    for i in range(X.shape[0]):
        for j in range(X.shape[1]):
            Y[i: i + h, j: j + w] += X[i, j] * K
    return Y
X = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
trans_conv(X, K)

在这里插入图片描述

或者使用torch自带的API:

X, K = X.reshape(1, 1, 2, 2), K.reshape(1, 1, 2, 2)
tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, bias=False)
tconv.weight.data = K
tconv(X)

在这里插入图片描述
nn.ConvTranspose2d 是 PyTorch 中用于创建转置卷积层的函数,它有以下参数:

in_channels:输入特征图的通道数。
out_channels:输出特征图的通道数。
kernel_size:卷积核的大小。可以是一个整数(表示正方形卷积核的边长),也可以是一个长度为 2 的元组或列表(表示长方形卷积核的宽和高)。
stride:卷积核的步长。可以是一个整数(表示在宽度和高度上的步长相同),也可以是一个长度为 2 的元组或列表(表示在宽度和高度上的步长分别为多少)。
padding:填充大小。可以是一个整数(表示在宽度和高度上的填充大小相同),也可以是一个长度为 2 的元组或列表(表示在宽度和高度上的填充大小分别为多少)。
output_padding:输出特征图的填充大小。可以是一个整数(表示在宽度和高度上的填充大小相同),也可以是一个长度为 2 的元组或列表(表示在宽度和高度上的填充大小分别为多少)。默认为 0。
groups:输入和输出通道之间的分组数。通常将其设置为 1,表示不进行通道分组。如果设置为大于 1 的值,则表示在输入和输出通道之间进行分组卷积。
bias:是否使用偏置。默认为 True,表示使用偏置。如果设置为 False,则不使用偏置。
dilation:卷积核的膨胀率。可以是一个整数(表示在宽度和高度上的膨胀率相同),也可以是一个长度为 2 的元组或列表(表示在宽度和高度上的膨胀率分别为多少)。默认为 1,表示不进行膨胀卷积。

填充、步幅和多通道

与常规卷积不同,在转置卷积中,填充被应用于的输出(常规卷积将填充应用于输入)。 例如,当将高和宽两侧的填充数指定为1时,转置卷积的输出中将删除第一和最后的行与列。

tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, padding=1, bias=False)
tconv.weight.data = K
tconv(X)

在这里插入图片描述
在转置卷积中,步幅被指定为中间结果(输出),而不是输入。 使用上图中相同输入和卷积核张量,将步幅从1更改为2会增加中间张量的高和权重,因此输出张量在如下图:
在这里插入图片描述

tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, stride=2, bias=False)
tconv.weight.data = K
tconv(X)

在这里插入图片描述对于多个输入和输出通道,转置卷积与常规卷积以相同方式运作。 假设输入有 c i c_i ci个通道,且转置卷积为每个输入通道分配了一个 k h × k w k_h\times k_w kh×kw的卷积核张量。 当指定多个输出通道时,每个输出通道将有一个 c i × k h × k w c_i\times k_h\times k_w ci×kh×kw的卷积核。

性质

如果我们将 X X X代入卷积层 f f f来输出 Y = f ( X ) Y=f(X) Y=f(X),并创建一个与 f f f具有相同的超参数、但输出通道数量是 X X X中通道数的转置卷积层 g g g,那么 g ( Y ) g(Y) g(Y)的形状将与 X X X相同。 下面的示例可以解释这一点。

X = torch.rand(size=(1, 10, 16, 16))
conv = nn.Conv2d(10, 20, kernel_size=5, padding=2, stride=3)
tconv = nn.ConvTranspose2d(20, 10, kernel_size=5, padding=2, stride=3)
tconv(conv(X)).shape == X.shape

这个性质揭示了为什么这个操作被称为反卷积,因为它和卷积操作互逆

注意
1.数值不同,不可逆,形状可逆
2.效率高。原因:
①普通卷积操作的前向传播通过矩阵乘法一次实现,而非形式上的卷积核进行卷积并平移
②普通卷积操作的反向传播是输入乘转置权重矩阵
③上述代码表明,转置卷积作用实质上也是矩阵乘法,其前向传播为普通卷积的反向传播,反向传播同理

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

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

相关文章

排他网关-部署流程定义

类:com.roy.ActivitiGatewayExclusive /*** 部署流程定义*/Testpublic void testDeployment(){ // 1、创建ProcessEngineProcessEngine processEngine ProcessEngines.getDefaultProcessEngine(); // 2、得到RepositoryService实例RepositoryService…

剑指offer刷题笔记--题目11-20

1-旋转数组的最小数字&#xff08;11&#xff09; 主要思路&#xff1a; 一次旋转将最后一个元素移动最前面&#xff0c;由于数组最开始是升序的&#xff0c;因此数组的大部分元素都应该保持升序的状态&#xff08;n1<n2<...<n3>n4<n5<...<n6&#xff09;…

JAVA练习小游戏——贪吃蛇小游戏 PLUS版

目录 基础版本 新增内容 1.添加START开始界面 2.新增背景音乐 3.添加SCORE计分 4.新增游戏机制 代码实现 实机演示 基础版本 JAVA练习小游戏——贪吃蛇小游戏_timberman666的博客-CSDN博客https://blog.csdn.net/timberman666/article/details/131046742?spm1001.201…

xshell使用技巧小节

文章目录 1. 输出日志文件2. 快捷键设置3. 使用ctrlv按键4. 快速命令 1. 输出日志文件 需求&#xff1a;我们使用xshell时会经常需要把xshell中的内容打印到文件中&#xff0c;或者因为内容过多&#xff0c;xshell界面无法显示先显示出的内容&#xff0c;或者需要明确记录文件…

AlterNET Studio v9.0 Crack

AlterNET Studio v9.0 改进了代码编辑器、表单设计器和 Python LSP 解析器。 2023 年 6 月 5 日 - 11:22新版本 特征 代码编辑器 编辑器中添加了 Microsoft Visual Studio 主题。现在包括一个放大镜区域&#xff0c;可以更轻松地浏览文档的内容。带有 alpha 通道的图像现在用于…

汽车电子AUTOSAR之EcuM模块

目录 前言 正文 EcuM模块总体介绍 主要功能 总状态机&#xff08;Flexible 与 Fixed&#xff09; Startup Sequence STARTUP I STARTUP II RUN Sequence RUN II RUN III ShutDown Sequence ShutDown Target Go Sleep Go OFF I Go OFF II Sleep Sequence Sleep…

如何从平面图或蓝图为 ROS 创建地图

如何从平面图或蓝图为 ROS 创建地图 在本教程中&#xff0c;我将向您展示如何从平面图或蓝图为 RViz&#xff08;ROS 的 3D 可视化程序&#xff09;创建地图。为 RViz 创建地图是使机器人能够在环境中自主导航的重要步骤。 我们经常使用机器人的激光雷达来构建地图。这很好&am…

【openeuler】Yocto embedded sig例会 (2023-01-12)

Yocto & embedded sig例会 (2023-01-12)_哔哩哔哩_bilibili

群智能算法-模拟退火

一.基本理念 模拟退火算法(Simulated Annealing,简称SA) 的思想最早是由Metropolis等提出的.其出发点就是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法&#xff0c;其物理退火过程由以下三部分组成。 加温过程&#xff1a;我…

AutoHand插件使用指南

一、设置 1.软件包设置 Auto Hand 包括四个内置的输入选项。AutoHand不直接管理输入,而是包含各种脚本,充当所选输入系统和Auto Hand之间的桥梁。 这里只介绍OpenXR(Action Based),首先作如下设置: 我这里用的是HTC Vive Pro: 找到并导入AutoHand插件中的OpenXR这个包:…

java错题记录(一)

一、观察下类代码&#xff0c;输出正确的是 String s1 "coder"; String s2 "coder"; String s3 "coder" s2; String s4 "coder" "coder"; String s5 s1 s2; System.out.println(s…

SELD2022:(一)数据集收集与组织详解

前言&#xff1a;声音事件检测与定位&#xff08;SELD&#xff09;作为DCASE挑战赛的子任务&#xff0c;从2019年开始已经举办了好几届。该子任务的目标也从2022年开始由原来的在仿真数据集上设计更优声学模型&#xff0c;过渡到了在真实数据集上进行模型优化。相对而言&#x…

Omnipeek 分析wifi包简单介绍

通常打开一个.pkt文件&#xff0c;我们先看到的是如下内容。 这个场景下的数据基本是不能分析的。。 因为抓空口包1分20秒基本有10w包了&#xff0c;所以通常会对所抓的空口包进行过滤然后分析。 写个例子&#xff1a; 我本次抓包的目的是看路由器mesh的wps 组网过程&#xf…

海睿思分享 | 低代码开发直面行业变革:革新,创新?

软件体系结构从单体集群服务时期&#xff0c;历经领域驱动设计、微服务架构等阶段&#xff0c;软件产品的开发过程的变革正在潜移默化地进行。 在软件逻辑架构设计、物理架构设计、构建与部署这一系列化的过程中&#xff0c;存在可缩减的设计与开发成本&#xff0c;曾经看似不可…

力扣高频SQL50题(基础版)——第六天

力扣高频SQL50题(基础版)——第六天 1 平均售价 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 1.2 示例sql语句 SELECT u.product_id,ROUND(SUM(p.price*u.units)/SUM(u.units),2) average_price FROM UnitsSold u INNER JOIN Prices p ON u.…

Linux :: 文件内容操作【6】:文件中指定中间部分(第多少行 到 第多少行)行内容输出 及 初步认识管道

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 注&#xff…

OpenAI的人工智能语音识别模型Whisper详解及使用

1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司&#xff0c;开源了 Whisper 自动语音识别系统&#xff0c;OpenAI 强调 Whisper 的语音识别能力已达到人类水准。 Whisper是一个通用的语音识别模型&#xff0c;它使用了大量的多语言和多任务的监督数据来训练&#xff0c;能够在…

Linux中使用ls命令按大小对所有文件进行排序

按大小列出目录中的文件(排序) ls -lSh

AI版女网红“半藏森林”上线,服务项目让人意想不到

目前首批网红明星“AI克隆人”已提前上线&#xff0c;主营业务就是打造各种名人版AI聊天机器人&#xff0c;用户付费便可与之聊天。其后台报名参加AI克隆人的网红明星“全网粉丝总数已超过5亿”。该公司这波上线的网红明星AI克隆人&#xff0c;包括此前因“疑似插足他人恋情”&…

腾讯工作3个月,做测试的一些感悟...

普通二本计算机专业毕业&#xff0c;从毕业后&#xff0c;第一份接触测试的工作是在一家通讯小公司&#xff0c;大部分接触的工作是以功能测试为主&#xff0c;一直都是几千块钱工资&#xff0c;还一度被派出差&#xff0c;以及兼职各种产品、运维、运营的活&#xff0c;感觉自…