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会多一维,可理解为叠加;
————————————————
版权声明:本文为CSDN博主「进阶媛小吴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wuli_xin/article/details/118972316
torch.cat((a,b),dim=1)和torch.cat((a,b)axis=1)一样。
同理:torch.stack((a,b),dim=1)和torch.stack((a,b)axis=1)一样。
zz=torch.rand(100)#默认zz是列向量。而非行向量。
上述3行的情况,自己已经实际实验过。




结果为:

上述行数相同d,c,在第一维度也即列上拼接时,能拼接成100行六列的tensor.

import torch
a=torch.rand(100)
b=torch.rand(100)
c=torch.rand((100,2))
d=torch.rand((100,2))
e=torch.rand((100,2)) ab,ab1,cd,cd1,cd2,cd3=torch.stack((a,b)),torch.stack((a,b),dim=0),torch.stack((c,d),dim=0),torch.stack((c,d),dim=1),torch.stack((c,d,e),axis=1),torch.stack((c,d,e),dim=-1)
'a.shape',a.shape,"b.shape",b.shape,"ab.shape",ab.shape,"ab1.shape",ab1.shape,'cd.shape',cd.shape,'cd1.shape',cd1.shape,'cd2.shape',cd2.shape,cd3.shape
此处需注意的是:torch.stack((c,d,e),dim=-1)和torch.stack((c,d,e),dim=2)结果是一样的;
('a.shape',
torch.Size([100]),
'b.shape',
torch.Size([100]),
'ab.shape',
torch.Size([2, 100]),
'ab1.shape',
torch.Size([2, 100]),
'cd.shape',
torch.Size([2, 100, 2]),
'cd1.shape',
torch.Size([100, 2, 2]),
'cd2.shape',
torch.Size([100, 3, 2]),
torch.Size([100, 2, 3]))

import torch
# t1=torch.tensor([1,1,1])
# t2=torch.tensor([2,2,2])
# t3=torch.tensor([3,3,3]) f1=torch.tensor([[1,2,3],[4,5,6]])
f2=torch.tensor([[7,8,9],[10,11,12]])
c=torch.tensor([[13,14,15],[16,17,18]]) # a=torch.cat((f1,f2,c),dim=0)
# b=torch.cat((f1,f2,c),1)
# print(a.shape,b.shape,sep='\n')
# d=torch.rand(100,4)
# e=torch.cat((d,c),1)
# print(e.shape)
g=torch.stack((f1,f2,c),0)
g1=torch.stack((f1,f2,c),1)
print(f1.shape,f2.shape,c.shape)
print('g: ',g.shape,g,sep='\n')
print('g1: ',g1.shape,g1,sep='\n') 输出结果为: torch.Size([2, 3]) torch.Size([2, 3]) torch.Size([2, 3])
g:
torch.Size([3, 2, 3])#本来3个,就3个;本来2行3列就两行三列;只不过把他们放到一起,变成了3维的,多了一个维度;个人理解,可能有误。
tensor([[[ 1, 2, 3],
[ 4, 5, 6]], [[ 7, 8, 9],
[10, 11, 12]], [[13, 14, 15],
[16, 17, 18]]])
g1:
torch.Size([2, 3, 3])#把本来的三个中,每个的第一列拼在一块;第二列拼在一块;再把拼过后的第一列和第二列分别作为一个二维矩阵; 个人理解,可能有误。 tensor([[[ 1, 2, 3],
[ 7, 8, 9],
[13, 14, 15]], [[ 4, 5, 6],
[10, 11, 12],
[16, 17, 18]]])
import torch
# t1=torch.tensor([1,1,1])
# t2=torch.tensor([2,2,2])
# t3=torch.tensor([3,3,3]) f1=torch.tensor([[1,2,3],[4,5,6]])
f2=torch.tensor([[7,8,9],[10,11,12]])
c=torch.tensor([[13,14,15],[16,17,18]]) # a=torch.cat((f1,f2,c),dim=0)
# b=torch.cat((f1,f2,c),1)
# print(a.shape,b.shape,sep='\n')
# d=torch.rand(100,4)
# e=torch.cat((d,c),1)
# print(e.shape)
g=torch.stack((f1,f2,c),0)
g1=torch.stack((f1,f2,c),2)
print(f1.shape,f2.shape,c.shape)
print('g: ',g.shape,g,sep='\n')
print('g1: ',g1.shape,g1,sep='\n') 输出结果:
torch.Size([2, 3]) torch.Size([2, 3]) torch.Size([2, 3])
g:
torch.Size([3, 2, 3])
tensor([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]],
[[13, 14, 15],
[16, 17, 18]]])
g1:
torch.Size([2, 3, 3])
tensor([[[ 1, 7, 13],
[ 2, 8, 14],
[ 3, 9, 15]],
[[ 4, 10, 16],
[ 5, 11, 17],
[ 6, 12, 18]]])
import torch
# t1=torch.tensor([1,1,1])
# t2=torch.tensor([2,2,2])
# t3=torch.tensor([3,3,3]) f1=torch.tensor([[1,2,3],[4,5,6]])
f2=torch.tensor([[7,8,9],[10,11,12]])
c=torch.tensor([[13,14,15],[16,17,18]]) # a=torch.cat((f1,f2,c),dim=0)
# b=torch.cat((f1,f2,c),1)
# print(a.shape,b.shape,sep='\n')
# d=torch.rand(100,4)
# e=torch.cat((d,c),1)
# print(e.shape)
g=torch.stack((f1,f2,c),0)
g1=torch.stack((f1,f2,c),3)#此处dim=3,或比3大的任何正数,都是如下报错结果。
print(f1.shape,f2.shape,c.shape)
print('g: ',g.shape,g,sep='\n')
print('g1: ',g1.shape,g1,sep='\n') 输出结果:
Traceback (most recent call last):
File "<input>", line 17, in <module>
IndexError: Dimension out of range (expected to be in range of [-3, 2], but got 3)
此外:
如果,torch.stack()的维度dim输入的是-1,-2,-3,也都可以正确输出结果。但是如果输入比-3小的任何数则会报错;具体如下:
import torch
# t1=torch.tensor([1,1,1])
# t2=torch.tensor([2,2,2])
# t3=torch.tensor([3,3,3]) f1=torch.tensor([[1,2,3],[4,5,6]])
f2=torch.tensor([[7,8,9],[10,11,12]])
c=torch.tensor([[13,14,15],[16,17,18]]) # a=torch.cat((f1,f2,c),dim=0)
# b=torch.cat((f1,f2,c),1)
# print(a.shape,b.shape,sep='\n')
# d=torch.rand(100,4)
# e=torch.cat((d,c),1)
# print(e.shape)
g=torch.stack((f1,f2,c),0)
g1=torch.stack((f1,f2,c),-1) #此时,维度是-1
print(f1.shape,f2.shape,c.shape)
print('g: ',g.shape,g,sep='\n')
print('g1: ',g1.shape,g1,sep='\n') 输出结果为:
torch.Size([2, 3]) torch.Size([2, 3]) torch.Size([2, 3])
g:
torch.Size([3, 2, 3])
tensor([[[ 1, 2, 3],
[ 4, 5, 6]], [[ 7, 8, 9],
[10, 11, 12]], [[13, 14, 15],
[16, 17, 18]]])
g1:
torch.Size([2, 3, 3])
tensor([[[ 1, 7, 13],
[ 2, 8, 14],
[ 3, 9, 15]], [[ 4, 10, 16],
[ 5, 11, 17],
[ 6, 12, 18]]])
torch.stack()的维度dim输入的是--2;
输出结果为:
torch.Size([2, 3]) torch.Size([2, 3]) torch.Size([2, 3])
g:
torch.Size([3, 2, 3])
tensor([[[ 1, 2, 3],
[ 4, 5, 6]], [[ 7, 8, 9],
[10, 11, 12]], [[13, 14, 15],
[16, 17, 18]]])
g1:
torch.Size([2, 3, 3])
tensor([[[ 1, 2, 3],
[ 7, 8, 9],
[13, 14, 15]], [[ 4, 5, 6],
[10, 11, 12],
[16, 17, 18]]])
torch.stack()的维度dim输入的是-3;
torch.Size([2, 3]) torch.Size([2, 3]) torch.Size([2, 3])
g:
torch.Size([3, 2, 3])
tensor([[[ 1, 2, 3],
[ 4, 5, 6]], [[ 7, 8, 9],
[10, 11, 12]], [[13, 14, 15],
[16, 17, 18]]])
g1:
torch.Size([3, 2, 3])
tensor([[[ 1, 2, 3],
[ 4, 5, 6]], [[ 7, 8, 9],
[10, 11, 12]], [[13, 14, 15],
[16, 17, 18]]])
import torch
# t1=torch.tensor([1,1,1])
# t2=torch.tensor([2,2,2])
# t3=torch.tensor([3,3,3]) f1=torch.tensor([[1,2,3],[4,5,6]])
f2=torch.tensor([[7,8,9],[10,11,12]])
c=torch.tensor([[13,14,15],[16,17,18]]) # a=torch.cat((f1,f2,c),dim=0)
# b=torch.cat((f1,f2,c),1)
# print(a.shape,b.shape,sep='\n')
# d=torch.rand(100,4)
# e=torch.cat((d,c),1)
# print(e.shape)
g=torch.stack((f1,f2,c),0)
g1=torch.stack((f1,f2,c),-4)#此处是dim=-4,小于-4的任何负数,输出类似的结果。
print(f1.shape,f2.shape,c.shape)
print('g: ',g.shape,g,sep='\n')
print('g1: ',g1.shape,g1,sep='\n') 输出结果为:
Traceback (most recent call last):
File "<input>", line 17, in <module>
IndexError: Dimension out of range (expected to be in range of [-3, 2], but got -4)
import torch
a=torch.rand(100)
b=torch.rand(100) c=torch.stack((a,b))
d=torch.stack((a,b),dim=0)
e=torch.stack((a,b),dim=1) f=torch.cat((a,b))
f1=torch.cat((a,b),dim=0)
# f2=torch.cat((a,b),dim=1)#错误提示:Dimension out of range (expected to be in range of [-1, 0], but got 1)
c.size,c.size(),c.shape,d.shape,e.shape,f.shape,f.size(),f1.shape
#从输出结果可看出,torch.rand(100)生成的是100行1列的数据,也即是一个列向量;concat沿着已有的维度拼接,stack在新创建的维度上拼接;
#输出:
(<function Tensor.size>,
torch.Size([2, 100]),
torch.Size([2, 100]),
torch.Size([2, 100]),
torch.Size([100, 2]),
torch.Size([200]),
torch.Size([200]),
torch.Size([200]))
torch.cat()和torch.stack()的更多相关文章
- torch.stack()与torch.cat()
torch.stack():http://www.45fan.com/article.php?aid=1D8JGDik5G49DE1X torch.stack()个人理解:属于先变形再cat的操作,所 ...
- torch.cat拼接 stack拼接 分块chunk
torch.cat拼接 stack拼接 分块chunk 待办 https://blog.csdn.net/qq_39709535/article/details/80803003 stack dim理 ...
- Pytorch中的torch.cat()函数
cat是concatnate的意思:拼接,联系在一起. 先说cat( )的普通用法 如果我们有两个tensor是A和B,想把他们拼接在一起,需要如下操作: C = torch.cat( (A,B),0 ...
- Pytorch的torch.cat实例
import torch 通过 help((torch.cat)) 可以查看 cat 的用法 cat(seq,dim,out=None) 其中 seq表示要连接的两个序列,以元组的形式给出,例如:se ...
- 从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系
从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系 relu多种实现之间的关系 relu 函数在 pytorch 中总共有 3 次出现: torc ...
- 【Pytorch】关于torch.matmul和torch.bmm的输出tensor数值不一致问题
发现 对于torch.matmul和torch.bmm,都能实现对于batch的矩阵乘法: a = torch.rand((2,3,10))b = torch.rand((2,2,10))### ma ...
- [pytorch笔记] torch.nn vs torch.nn.functional; model.eval() vs torch.no_grad(); nn.Sequential() vs nn.moduleList
1. torch.nn与torch.nn.functional之间的区别和联系 https://blog.csdn.net/GZHermit/article/details/78730856 nn和n ...
- Pytorch本人疑问(1) torch.nn和torch.nn.functional之间的区别
在写代码时发现我们在定义Model时,有两种定义方法: torch.nn.Conv2d()和torch.nn.functional.conv2d() 那么这两种方法到底有什么区别呢,我们通过下述代码看 ...
- torch.rand、torch.randn、torch.normal、torch.linespace
torch.rand(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) # ...
随机推荐
- Django项目引入NPM和gulp管理前端资源
前言 之前写了一篇<Asp-Net-Core开发笔记:使用NPM和gulp管理前端静态文件>,现在又来用Django开发项目了,之前我搞了一个Django的快速开发脚手架「DjangoSt ...
- 物理层(PHY)
一.物理层的定义 物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础.物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境.如果您想要用尽量少的词来记住这个第一层, ...
- 使用Visual Studio 2019开发Qt程序
安装Qt 如标题,你首先需要到 http://download.qt.io/ 去下载并安装Qt,并在引导下安装MSVC组件(这里不做过多解释) Visual Studio 2019 配置 打开VS20 ...
- 基于 Apache Hudi 构建增量和无限回放事件流的 OLAP 平台
1. 摘要 在本博客中,我们将讨论在构建流数据平台时如何利用 Hudi 的两个最令人难以置信的能力. 增量消费--每 30 分钟处理一次数据,并在我们的组织内构建每小时级别的OLAP平台 事件流的无限 ...
- JavaWeb入门day10-JSP
JSP 什么是JSP Java Server Pages:Java服务器端页面,也和Servlet一样,用于动态Web技术 最大特点: 写JSP就像在写HTML 区别 HTML只给用户提供静态数据 J ...
- 简单说一说jsonp原理
背景:由于浏览器同源策略的限制,非同源下的请求,都会产生跨域问题,jsonp即是为了解决这个问题出现的一种简便解决方案. 同源策略即:同一协议,同一域名,同一端口号.当其中一个不满足时,我们的请求即会 ...
- 浅谈MatrixOne如何用Go语言设计与实现高性能哈希表
目录 MatrixOne数据库是什么? 哈希表数据结构基础 哈希表基本设计与对性能的影响 碰撞处理 链地址法 开放寻址法 Max load factor Growth factor 空闲桶探测方法 一 ...
- [AcWing 36] 合并两个排序的链表
点击查看代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * L ...
- vue - git
今天差不多从中午开始下午一点才开始学的,把git学了一大半了,还好任务不是很多,但是我上午用的时间挺值的,因为我去搞了个cnblogs的背景主题,就是你们现在所看到的这套,这个没搞明白有一通研究的,只 ...
- vue - Vue组件化编程
今天是对vue组件化的一个理解,最主要的单文件组件,然后就可以脚手架的学习了,本来昨晚就该上传的,但是用的那个上传博客园的Python脚本不行了,换了一个新的. 组件化让我越来越感觉到框架的力量了 一 ...