广告
返回顶部
首页 > 资讯 > 后端开发 > Python >聊聊Pytorch torch.cat与torch.stack的区别
  • 258
分享到

聊聊Pytorch torch.cat与torch.stack的区别

2024-04-02 19:04:59 258人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

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

torch.cat()的示例如下图1所示

图1 torch.cat()

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

torch.stack()的示例如下图2所示:

图2 torch.stack()

补充:torch.stack()的官方解释,详解以及例子

可以直接看最下面的【3.例子】,再回头看前面的解释

PyTorch中,常见的拼接函数主要是两个,分别是:

1、stack()

2、cat()

实际使用中,这两个函数互相辅助:关于cat()参考torch.cat(),但是本文主要说stack()。

函数的意义:使用stack可以保留两个信息:[1. 序列] 和 [2. 张量矩阵] 信息,属于【扩张再拼接】的函数。

形象的理解:假如数据都是二维矩阵(平面),它可以把这些一个个平面(矩阵)按第三维(例如:时间序列)压成一个三维的立方体,而立方体的长度就是时间序列长度。

该函数常出现在自然语言处理NLP)和图像卷积神经网络(CV)中。

1. stack()

官方解释:沿着一个新维度对输入张量序列进行连接。 序列中所有的张量都应该为相同形状。

浅显说法:把多个2维的张量凑成一个3维的张量;多个3维的凑成一个4维的张量…以此类推,也就是在增加新的维度进行堆叠。


outputs = torch.stack(inputs, dim=?) → Tensor

参数

inputs : 待连接的张量序列。

注:python的序列数据只有list和tuple。

dim : 新的维度, 必须在0到len(outputs)之间。

注:len(outputs)是生成数据的维度大小,也就是outputs的维度值。

2. 重点

函数中的输入inputs只允许是序列;且序列内部的张量元素,必须shape相等

----举例:[tensor_1, tensor_2,..]或者(tensor_1, tensor_2,..),且必须tensor_1.shape == tensor_2.shape

dim是选择生成的维度,必须满足0<=dim<len(outputs);len(outputs)是输出后的tensor的维度大小

不懂的看例子,再回过头看就懂了。

3. 例子

1.准备2个tensor数据,每个的shape都是[3,3]


# 假设是时间步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]])

2.测试stack函数


print(torch.stack((T1,T2),dim=0).shape)
print(torch.stack((T1,T2),dim=1).shape)
print(torch.stack((T1,T2),dim=2).shape)
print(torch.stack((T1,T2),dim=3).shape)
# outputs:
torch.Size([2, 3, 3])
torch.Size([3, 2, 3])
torch.Size([3, 3, 2])
'选择的dim>len(outputs),所以报错'
IndexError: Dimension out of range (expected to be in range of [-3, 2], but Got 3)

可以复制代码运行试试:拼接后的tensor形状,会根据不同的dim发生变化。

dim shape
0 [2, 3, 3]
1 [3, 2, 3]
2 [3, 3, 2]
3 溢出报错

4. 总结

1、函数作用:

函数stack()对序列数据内部的张量进行扩维拼接,指定维度由程序员选择、大小是生成后数据的维度区间。

2、存在意义:

在自然语言处理和卷及神经网络中, 通常为了保留–[序列(先后)信息] 和 [张量的矩阵信息] 才会使用stack。

函数存在意义?》》》

手写过RNN的同学,知道在循环神经网络中输出数据是:一个list,该列表插入了seq_len个形状是[batch_size, output_size]的tensor,不利于计算,需要使用stack进行拼接,保留–[1.seq_len这个时间步]和–[2.张量属性[batch_size, output_size]]。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 聊聊Pytorch torch.cat与torch.stack的区别

本文链接: https://www.lsjlt.com/news/126417.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 聊聊Pytorch torch.cat与torch.stack的区别
    torch.cat()函数可以将多个张量拼接成一个张量。torch.cat()有两个参数,第一个是要拼接的张量的列表或是元组;第二个参数是拼接的维度。 torch.cat()的示例如...
    99+
    2022-11-12
  • Pytorch中 torch.cat与torch.stack有什么区别
    今天就跟大家聊聊有关Pytorch中 torch.cat与torch.stack有什么区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。torch.cat()函数可以将多个张量拼接成...
    99+
    2023-06-15
  • 聊聊uniapp与h5区别
    随着移动互联网的发展,越来越多的企业开始投入到移动应用的开发中。在移动应用开发中,uniapp和h5是两种流行的选择。虽然它们都是以HTML、JavaScript、CSS为基础的技术,但是在实现的方式、性能以及用户体验方面存在一些差别。这篇...
    99+
    2023-05-14
  • 聊聊prod()与cumprod()区别cumsum()
    pandas.Series.cumprod 官方文档 cumprod()累积连乘 Series.cumprod(axis=None, skipna=True, *args, **...
    99+
    2022-11-12
  • 聊聊python中not 与 is None的区别
    原因: list 获得的数据为空: 显示值为 [ ] 不同的判断--- is None ----not 两者结果不一样分析: 总之: not 判断的是内容,而is None则涉及到这个 list 或 dict...
    99+
    2022-06-02
    python not is None
  • 聊聊Python与Golang的区别有哪些
    Python是一种高级编程语言,它被广泛用于数据科学、计算机科学、人工智能和互联网开发等领域。而Golang是一种新型的编程语言,也被称为Go,由Google开发,它的设计目的是为了在多核和网络环境下提供更好的性能和可伸缩性。语言设计Pyt...
    99+
    2023-05-14
  • 聊聊pytorch中Optimizer与optimizer.step()的用法
    当我们想指定每一层的学习率时: optim.SGD([ {'params': model.base.parameters()}, ...
    99+
    2022-11-12
  • 聊聊docker中容器与镜像的区别
    什么是镜像? 镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AUFS文件联合系统实现),镜像层也可以简单理解为一个基本的镜像,而每个镜像层之间通过指...
    99+
    2022-11-12
  • 详细聊聊TypeScript中unknown与any的区别
    目录前言1. unknown vs any2. unknown 和 any 的心智模式3.总结总结前言 我们知道 any 类型的变量可以被赋给任何值。 let myVar: a...
    99+
    2022-11-12
  • 聊聊git和github的区别
    Git是一种分布式版本控制系统,它能够记录代码的变化并帮助开发者管理版本的历史记录。Git的创建者是Linus Torvalds,它于2005年发布并在开源社区中推广,现在已成为开发者们最常用的版本控制工具之一。GitHub则是一个在线代码...
    99+
    2023-10-22
  • 聊聊SpringCloud和SpringCloudAlibaba的区别
    目录SpringCloud和SpringCloudAlibaba的区别SpringCloud Alibaba与Spring Cloud搭配方案开源地址SpringCloud几大痛点S...
    99+
    2022-11-12
  • 聊聊Vuex与Pinia在设计与实现上的区别
    Vue 状态管理首先,先介绍一下 Vue 框架自身提供的状态管理的方式。【相关推荐:vuejs视频教程、web前端开发】Vue 组件内主要涉及到状态、动作和视图三个组成部分。在选项式 API 中通过 data 方法返回一个状态对象,通过 m...
    99+
    2023-05-14
    Vuex Vue.js React.js
  • 聊聊@RequestMapping和@GetMapping @PostMapping的区别
    @RequestMapping和@GetMapping @PostMapping的区别 最近学习看一些代码,发现对于发送请求这件事,有的地方用@RequestMapping,有的地方...
    99+
    2022-11-12
  • 聊聊Python中end=和sep=的区别
    end: 默认是换行,表示两个字符串最后以什么结尾。 eg: 换行 end="\n" sep: 默认是空格,表示两个字符串之间用什么分割。 eg: 空格 sep=" " 补充:python 中的 print(x, ...
    99+
    2022-06-02
    Python end= sep=
  • 聊聊Numpy.array中[:]和[::]的区别在哪
    [:]和[::]的区别蛮大的,用的好可以节省时间,下面以实例进行分析 array([:]) >>> import numpy as np >>>...
    99+
    2022-11-12
  • 聊聊BeanUtils.copyProperties和clone()方法的区别
    目录首先,BeanUtils有两种:效率:需要在pom文件中引入这个包在pom文件里面引入所需要的包新建一个实体类StudentEntity实现Cloneable接口测试方法最近撸代...
    99+
    2022-11-12
  • 聊聊注解@controller@service@component@repository的区别
    目录注解@controller@service@component@repository的区别命名不一样主要是为了区分类的作用和所属层级:Spring中的主要注解1.组件类注解@Co...
    99+
    2022-11-12
  • 聊聊python dropna()和notnull()的用法区别
    `dropna()`和`notnull()`是pandas库中用于处理缺失值的函数,它们的用法和功能有一些区别。`dropna()`...
    99+
    2023-08-16
    python
  • 聊聊JavaScript和php的区别有哪些
    JavaScript和PHP是两种不同的编程语言,它们各自有着自己的特点和用途。虽然它们都可以用于Web开发,但是它们的差异还是很大的。下面将详细介绍JavaScript和PHP之间的区别。语言类型JavaScript是一种客户端脚本语言,...
    99+
    2023-05-14
  • 聊聊码云和gitee的区别是什么
    码云和gitee是当前国内最受欢迎的两个代码托管平台,二者许多人会认为他们是一样的,但实际上,它们在某些功能和用法方面还是存在一些差异的。下面,我们就来探讨一下码云和gitee的几个不同之处。管理者背景首先,码云和gitee的背景不同。码云...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作