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

一、问题引出

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


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

二、问题解决

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

相关推荐
weiwuxian2 小时前
🚀 拒绝“人工智障”:如何写出一份高质量的 agent.md?
人工智能
黑客思维者3 小时前
智能配电系统用户敏感数据脱敏详细设计:从静态遮盖到动态策略
c++·python·嵌入式系统·数据脱敏·智能配电系统
陈鋆3 小时前
Langchain-Chatchat[四、RAG对话流程代码解析]
开发语言·python·langchain
ServBay3 小时前
Django 6.0 发布,新增原生任务队列与 CSP 支持
后端·python·django
Yeats_Liao3 小时前
CANN Samples(十一):媒体处理接口V1与V2的取舍与迁移
人工智能·媒体
β添砖java3 小时前
python第一阶段第九章异常、模块、包
开发语言·python
2501_941982053 小时前
企业微信Python SDK:高效群发消息实战
开发语言·python·企业微信
汤姆yu3 小时前
基于srpingboot心情治愈调整系统
人工智能
国科安芯3 小时前
航天医疗领域AS32S601芯片的性能分析与适配性探讨
大数据·网络·人工智能·单片机·嵌入式硬件·fpga开发·性能优化
咚咚王者3 小时前
人工智能之数据分析 Pandas:第五章 文件处理
人工智能·数据分析·pandas