李沐《动手学深度学习》torch.cat() 和 torch.stack()的区别及思考

一、问题引出

好久没更新啦!最近在学习沐神《动手学深度学习》6.5节池化层的时候,发现沐神在两处相似的地方使用了两种Python拼接函数torch.cat()和torch.stack():

torch.stack()
torch.cat()

百思不得其解,于是查阅相关文档之后终于弄清楚了两者之间的区别,遂做总结如下。

二、问题解决

1.torch.cat()

torch.cat()函数可以将多个张量拼接成一个张量。torch.cat()有两个参数,第一个是要拼接的张量的列表或是元组;第二个参数是拼接的维度

python"># 假设是时间步T1的输出
T1 = torch.tensor([[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]])
# 假设是时间步T2的输出
T2 = torch.tensor([[10, 20, 30],
          [40, 50, 60],
          [70, 80, 90]])
print("T1.shape: ", T1.shape, "T2.shape: ", T2.shape)
print(torch.cat((T1,T2),dim=0).shape)
print(torch.cat((T1,T2),dim=1).shape)

输出为:

输出

2.torch.stack()

torch.stack()函数同样有张量列表和维度两个参数。stack与cat的区别在于,torch.stack()函数要求输入张量的大小完全相同,得到的张量的维度会比输入的张量的大小多1,并且多出的那个维度就是拼接的维度,那个维度的大小就是输入张量的个数。

python">print("T1.shape: ", T1.shape, "T2.shape: ", T2.shape)
print(torch.stack((T1,T2),dim=0).shape)
print(torch.stack((T1,T2),dim=1).shape)
print(torch.stack((T1,T2),dim=2).shape)

输出为:

输出

三、总结

总的来说,cat 和 stack的区别在于 cat会增加现有维度的值,可以理解为续接,stack会新加增加一个维度,可以理解为叠加。

使用stack可以保留两个信息:[1. 序列] 和 [2. 张量矩阵] 信息,属于【扩张再拼接】的函数。形象的理解:假如数据都是二维矩阵(平面),它可以把这些一个个平面(矩阵)按第三维(例如:时间序列)压成一个三维的立方体,而立方体的长度就是时间序列长度。该函数常出现在自然语言处理(NLP)和图像卷积神经网络(CV)中。

欢迎大家一起跟着学习沐神的《动手学深度学习》,我建了一个github网站,发布了我的日常学习笔记,欢迎大家star!,网址为https://github.com/BugMaker2002/DeepLearningAction-LiMu


http://www.niftyadmin.cn/n/5019871.html

相关文章

Node.js安装教程图文详解

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 下载Node.js 请下载Node.js并保存至本地,官方网址:https://nodejs.org/zh-cn/ 在此,选择windows系统64位的16.13.1版本进行下载。 下载…

MC-4/11/10/400 ELAU 操作员界面旨在帮助优化系统开发

MC-4/11/10/400 ELAU 操作员界面旨在帮助优化系统开发 作为海洋认证流程的一部分,根据海洋协会和国际电工委员会 (IEC) 标准的规定,对产品进行测试,以评估其在高湿度、极热和极冷温度、振动和电磁兼容性方面的性能。这些产品还经过评估&…

金蝶云星空各种部署架构及适用场景分享

> 随着公司的快速发展上市到进入世界500强,作为技术经理,负责了金蝶云星空从单点部署到集群,再到替换SAP的过程,如今项目已经成功上线,所以对金蝶的相关知识也做下整理和归档。 > 在项目实施过程中,部…

通过pycamunda进行流程引擎api的使用

1.pycamunda 简介 Pycamunda是一个用Python语言编写的Camunda BPM平台的客户端库。它可以用于与Camunda BPM引擎进行交互,通过Camunda REST API执行各种操作,如启动流程实例、完成任务等。它提供了一组易于使用的工具,使开发人员可以轻松地与…

【网络基础】——HTTPS

目录 HTTPS背景知识 HTTPS是什么? 加密解密 为什么要加密 常见的加密方式 对称加密 非对称加密 数据摘要&&数据指纹 数字签名 HTTPS工作过程探究 方案1:只使用对称加密 方案2:只使用非对称加密 方案3:双方…

The Maximum Prefix

题目 引 在某些思想上跟 象棋 象棋 象棋 那道很相似 虽然可能只有我这样认为 解法 倒序进行加数的过程,那么当你倒序加入了一个数后。若为 1 1 1,则 S 1 S1 S1; 若为 − 1 -1 −1,则为 max ⁡ { 0 , S − 1 } \max\{0,S-1\} max{0…

MyBatisPlus 基础实现(一)

说明 创建一个最基本的MyBatisPlus项目&#xff0c;参考官网。 依赖 MyBatisPlus 依赖&#xff0c;最新版是&#xff1a;3.5.3.2 &#xff08;截止2023-9-4&#xff09;。 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-bo…

272_C++_把当前日期和时间信息转换为一个微秒级别的时间戳,考虑中国时区GMT-8影响以及UTC时间和GMT时间的区分

代码块一:把一个指定日期,转换为微妙级的时间戳用以录像等时间定位 RS_U64 UIDateTimeToU64(const RSDateTime &dateTime) {RS_U64 s32Time = 0;struct tm tmTime = {0};struct timeval tvTime =