torch.cat() 和 torch.stack()

别再混淆了!一文搞懂PyTorch中torch.cat()与torch.stack()的区别 本文详细解析了PyTorch中torch.cat()与torch.stack()的区别,帮助开发者正确选择张量拼接方法。通过对比两者的输入要求、维度变化和使用场景,结合实际代码示例,让你彻底掌握这两个函数的适用条件和最佳实践,提升深度学习模型开发效率。 阅读详情

网上很多的示例,都在讨论二维数据(矩阵),单是对于做图像与深度学习的人来说均是三维起步,一般都是4维,下边以4维数据举例

对于pytorch中的堆叠与拼接函数stack与cat,二者还是有一定的不同

torch.cat这是一个拼接函数(姑且这么说)

直接上例子

a0=torch.Tensor([[[[1,1,1,1],[2,2,2,2]]]])
a1=torch.Tensor([[[[3,3,3,3],[4,4,4,4]]]])
torch.Size([1, 1, 2, 4])

torch.cat((a0,a1),dim=0).type(torch.FloatTensor)

tensor([[[[1., 1., 1., 1.],
          [2., 2., 2., 2.]]],


        [[[3., 3., 3., 3.],
          [4., 4., 4., 4.]]]])
torch.Size([2, 1, 2, 4])

上边dim=0,为以第一维为基准拼接,对于一个张量的维度,有几个放括号就是几维,上边例子a0与a1均为4维张量,因此以第0维拼接就是将第一个中括号内的内容进行拼接。最终的尺度大小为(2,1,2,4)

a0=torch.Tensor([[[[1,1,1,1],[2,2,2,2]]]])
a1=torch.Tensor([[[[3,3,3,3],[4,4,4,4]]]])
torch.cat((a0,a1),dim=1).type(torch.FloatTensor)

tensor([[[[1., 1., 1., 1.],
          [2., 2., 2., 2.]],

         [[3., 3., 3., 3.],
          [4., 4., 4., 4.]]]])
torch.Size([1, 2, 2, 4])

以第1维进行拼接,将第二个括号内的内容进行拼接

a0=torch.Tensor([[[[1,1,1,1],[2,2,2,2]]]])
a1=torch.Tensor([[[[3,3,3,3],[4,4,4,4]]]])
torch.cat((a0,a1),dim=2).type(torch.FloatTensor)
tensor([[[[1., 1., 1., 1.],
          [2., 2., 2., 2.],
          [3., 3., 3., 3.],
          [4., 4., 4., 4.]]]])
torch.Size([1, 1, 4, 4])

 

a0=torch.Tensor([[[[1,1,1,1],[2,2,2,2]]]])
a1=torch.Tensor([[[[3,3,3,3],[4,4,4,4]]]])
torch.cat((a0,a1),dim=3).type(torch.FloatTensor)
tensor([[[[1., 1., 1., 1., 3., 3., 3., 3.],
          [2., 2., 2., 2., 4., 4., 4., 4.]]]])
torch.Size([1, 1, 2, 8])

以上为torch.cat的使用方法,两个tensor的维度必须一致,最终生成的张量的维度也没有变化,但是torch.cat就不一样了

torch.stack

依然使用上边的例子,看看这个函数的功能

a0=torch.Tensor([[[[1,1,1,1],[2,2,2,2]]]])
a1=torch.Tensor([[[[3,3,3,3],[4,4,4,4]]]])
torch.stack((a0,a1),dim=0).type(torch.FloatTensor)

tensor([[[[[1., 1., 1., 1.],
           [2., 2., 2., 2.]]]],



        [[[[3., 3., 3., 3.],
           [4., 4., 4., 4.]]]]])
torch.Size([2, 1, 1, 2, 4])

 

a0=torch.Tensor([[[[1,1,1,1],[2,2,2,2]]]])
a1=torch.Tensor([[[[3,3,3,3],[4,4,4,4]]]])
torch.stack((a0,a1),dim=1).type(torch.FloatTensor)
tensor([[[[[1., 1., 1., 1.],
           [2., 2., 2., 2.]]],


         [[[3., 3., 3., 3.],
           [4., 4., 4., 4.]]]]])
torch.Size([1, 2, 1, 2, 4])

从上边两个例子,可以看出,对于torch.stack来说,会先将原始数据维度扩展一维,然后再按照维度进行拼接,具体拼接操作同torch.cat类似

 

贴个torch.stack()官方文档的截图
在这里插入图片描述

dim代表沿着哪个维度进行堆叠

举个例子:

dim=0时:(dim不写时,默认为0)

在这里插入图片描述

a: 2x3 ; b: 2x3 ; c: 2x2x3

在这里插入图片描述

dim=1时:略

dim=2时:

在这里插入图片描述

a: 2x3 ; b: 2x3 ; c: 2x3x2

在这里插入图片描述

总结

在这里插入图片描述

参考链接

https://zhuanlan.zhihu.com/p/70035580

https://www.pianshen.com/article/10611294719/

 

深度学习中小知识点系列(十八) 解析pytorch中torch.stack()和torch.cat()(详尽) 手写过RNN的同学,知道在循环神经网络中输出数据是:一个list,该列表插入了seq_len个形状是[batch_size, output_size]的tensor,不利于计算,需要使用stack进行拼接,保留–[1.seq_len这个时间步]和–[2.张量属性[batch_size, output_size]]。形象的理解:假如数据都是二维矩阵(平面),它可以把这些一个个平面按第三维(例如:时间序列)压成一个三维的立方体,而立方体的长度就是时间序列长度。浅显说法:把多个2维的张量凑成一个3维的张量; 阅读详情

相关推荐

组合之torch.cat()和 torch.stack()

cat即concatenate的意思,是指沿着已有的数据的 某一维度进行拼接,操作后数据的总维数不变,在进行拼接时,除了拼 接的维度之外,其他维度必须相同。 而torch.stack()函数指新增维度,并按照指定的维度进行叠加 import torch a = torch.randperm(10) a = a.reshape([2, 5]) b = torch.Tensor([[10, 11, 15, 12, 13], [5, 4, 3, 2, 1]]) a = a.type_as(b) # 将a,b数据

Gfqwy2021 1371

pytorch拼接函数:torch.stack()和torch.cat()详解

pytorch拼接函数:torch.stack()和torch.cat()详解

sweet_tea_的博客 4627

PyTorch中的torch.stack()和torch.cat()可以用于将多个张量合并成一个张量。虽然这两个函数都可以实现张量合并的功能,但它们之间的细微区...

torch.stack()和torch.cat()都是PyTorch中常用的张量合并函数。torch.stack()主要用于将相同形状的多个张量堆叠在一起生成新的张量,而torch.cat()主要用于将多个张量拼接在一起生成新的张量。不同之处在于堆叠时需要保证各张量形状相同,而拼接则无此限制。两个函数均支持在多个维度上进行操作,并且可以设置输出结果Tensor。

. 723

关于torch.cat()与torch.stack()

拼接数据

qq_38765642的博客 5919

1.Fay-UE5数字人工程导入(UE数字人系统教程)

ue5数字人系列教程(含源文件工程)

1万+

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3515

torch.stack()和torch.cat()是否是一个意思?

torch.stack()和torch.cat()是否是一个意思?

互相学习的小博客 316

机房电脑的“还原”秘密:如何应对重启即清零的困境

机房电脑重启后自动还原是常见的现象,这主要依靠硬件还原卡或软件还原系统(如冰点还原)实现。这类技术会定期将系统盘恢复初始状态,但通常不保护非系统盘。要高效使用公共电脑,建议:1)将个人文件存储在D/E盘;2)使用绿色便携软件;3)必要时可尝试通过热键临时关闭还原功能;4)养成云端备份习惯。掌握这些技巧既能遵守机房规定,又能保证学习资料安全,培养良好的数字资产管理能力。

一位主要以学校学生信息技术,社会工作生活讲解科普拓展的博主 1445

图解torch.cat()和torch.stack()的区别

图解torch.cat()和torch.stack()的区别

L的博客 331

【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698

技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。WordPress和WordPress plugin都是WordPress基金会的产品。WordPress Plugin NotificationX 存在安全漏洞,该漏洞源于对用户提供的参数转义不充分以及对现有 SQL 查询缺乏充分的准备,很容易通过“type”参数受到 SQL 注入攻击。

失心少年 1380

智能车图像处理1-基础图像规格

从厂家摄像头的库函数中,我们可以直接得到完整图像的灰度数组,经过二值化之后(算力允许,可以考虑大津法),就是我们要处理的0-1二值图像了。本系列所有的文章中,我们的图像规格如下。

taiyuezyh的博客 4318

使用torch.cat()和torch.stack()时出现的小错误

使用torch.cat()连接张量时,出现错误如下: TypeError: cat() received an invalid combination of arguments - got (Tensor, Tensor, dim=int), but expected one of: (tuple of Tensors tensors, name dim, *, Tensor out) (tuple of Tensors tensors, int dim, *, Tensor out) 是非常简单的一个

weixin_56433898的博客 1万+

ARFoundation系列讲解 - 24 锚点

一、添加平面检测和平面可视化 请参考 ARFounnation快速入门-08平面检测 案例 二、添加射线检测 1.在AR Session Origin 组件上添加ARRaycastManager 脚本

a451319296的博客 4874

Pytorch基础 - 5. torch.cat() 和 torch.stack()

torch.cat() 和 torch.stack()常用来进行张量的拼接,在神经网络里经常用到。torch.cat会在dim的维度上进行合并,不会扩展出新的维度。torch.stack则会在dim的维度上拓展出一个新的维度,然后进行拼接,该维度的大小为tensors的个数

Aaron_neil的博客 1210

【零基础学习CAPL】——CAN报文的发送(CRC——ChecSum值)

本章主要介绍带有CRC值的报文发送一般报文可使用CANoe的IG模块直接发送,但带有CRC值的报文就只能编写脚本进行发送,以下详细讲解在配合Panel面板情况下,如何进行带有循环冗余码的报文进行报文的发送。

LOVE135149的博客 1910

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

3055

torch.stack()和torch.cat()的区别

torch.stack()可以通过torch.cat()表达,即 torch.stack(tensors, dim) 等价于 torch.cat([tensor.unsqueeze(dim) for tensor in tensors ], dim) 所以,若能理解torch.cat()函数,即可理解torch.stack() 1、torch.cat(tensors, dim) 参数: tensors:需要合并的张量集合 dim:需要合并的维度 a ......

LYStudyC的博客 669

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

torch.stack()方法和torch.cat()方法的区别

torch.stack():函数stack()对序列数据内部的张量进行扩维拼接,指定维度由程序员选择(对 原始张量按照指定维度进行拼接,拼接后维度为原始维度加一,如原始维度为2*2,那么拼接后为n*2*2或2*n*2或2*2*n)。 详情:https://blog.csdn.net/xinjieyuan/article/details/105205326 torch.cat():在给定维度上对输入的张量序列seq 进行连接操作。(连接后维度为原始维度,如原来为2*2,那么连接后为n*2或2*n) 详.

dream_to_dream的博客 1393

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

假设是时间步T1的输出[4, 5, 6],# 假设是时间步T2的输出。

m0_57317650的博客 1489

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

torch.cat() 和 torch.stack()略有不同

torch.cat() 和 torch.stack()略有不同 torch.cat(tensors,dim=0,out=None)→ Tensor torch.cat()对tensors沿指定维度拼接,但返回的Tensor的维数不会变 torch.stack(tensors,dim=0,out=None)→ Tensor torch.stack()同样是对tensors沿指定维度拼接,但返回的Tensor会多一维 a = torch.rand((2, 3))#a.size()结果为torch.Size([2

wuli_xin的博客 405

深度学习框架_PyTorch_torch.stack()函数和torch.cat()函数

torch.stcak()函数对多个张量在维度上进行叠加。 其中参数dim代表不同的维度。 具体如下代码所示: >>> a = torch.ones(3,3) >>> a tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]]) >>> b = torch.ones(3...

Rocky Ding相信人工智能、数据科学、商业逻辑、金融工具、终身成长以及顺应时代的潮流会赋予我们超能力。 918

pytorch拼接函数:torch.stack()和torch.cat()--详解及例子

原文链接: https://blog.csdn.net/xinjieyuan/article/details/105205326 https://blog.csdn.net/xinjieyuan/article/details/105208352 在pytorch中,常见的拼接函数主要是两个,分别是: stack() cat() torch.stack() 函数的意义:使用stack可以保留两个信息:[1. 序列] 和 [2. 张量矩阵] 信息,属于【扩张再拼接】的函数。 形象的理解:假如数据都是二

紫芝的博客 4万+

torch.cat()  和 torch.stack()

torch.cat() 和 torch.stack() 一句话总结,cat是将tensor拼接到同一层上,stack是将tensor层叠在一起。 torch.cat() torch.cat(tensors,dim=0,out=None)→ Tensor torch.cat()对tensors沿指定维度拼接,但返回的Tensor的维数不会变 >>> import torch >>> a = torch.rand((2, 3)) >>> ...

咖乐部 335

torch.cat()和torch.stack()的区别,例子解释

torch.stack torch.stack(inputs, dim=0) inputs:同样也是张量序列,沿着一个新维度对输入张量序列进行连接。 序列中所有的张量都应该为相同形状。 torch.cat torch.cat(inputs, dim=0) inputs:必须是张量序列, 在给定维度上对输入的张量序列进行连接操作,序列中所有的张量都应该为相同形状。 #注:由字面意思可以看出, c...

weixin_42920104的博客 1958

关于torch.cat()和torch.stack()的区别

关于torch.cat和torch.stack的区别,其实他们是很不一样的,stack不仅仅是多一个维度的问题

guanyonglai的博客 438
上一篇: 机器学习中的数学
下一篇: Python3 * 和 ** 运算符
不要清汤锅
博客等级 码龄10年 39粉丝 43原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值