pytorch中torch.stack()用法虽简单,但不好理解

函数功能

沿一个新维度对输入一系列张量进行连接,序列中所有张量应为相同形状,stack 函数返回的结果会新增一个维度。也即是把多个2维的张量凑成一个3维的张量;多个3维的凑成一个4维的张量…以此类推,也就是在增加新的维度上面进行堆叠。

参数列表

tensors :为一系列输入张量,类型为turple和List
dim :新增维度的(下标)位置,当dim = -1时默认最后一个维度;范围必须介于 0 到输入张量的维数之间,默认是dim=0,在第0维进行连接
返回值:输出新增维度后的张量

情况一:输入数据为1维数据

dim = 0 : 在第0维进行连接,相当于在行上进行组合(输入张量为一维,输出张量为两维)

import torcha = torch.tensor([1, 2, 3])b = torch.tensor([11, 22, 33])#在第0维进行连接,相当于在行上进行组合,取a的一行,b的一行,构成一个新的tensor(输入张量为一维,输出张量为两维)c = torch.stack([a, b],dim=0)          print(a)print(b)print(c.size())print(c)输出:
tensor([1, 2, 3])
tensor([11, 22, 33])
torch.Size([2, 3])
tensor([[ 1,  2,  3],[11, 22, 33]])

dim = 1 :在第1维进行连接,相当于在对应行上面对列元素进行组合(输入张量为一维,输出张量为两维)

import torcha = torch.tensor([1, 2, 3])b = torch.tensor([11, 22, 33])print(a)print(b)#在第1维进行连接,相当于在对应行上面对列元素进行组合,取a的一列,b的一列,构成新的tensor的一行(输入张量为一维,输出张量为两维)c = torch.stack([a, b],dim=1)print(c.size())print(c)输出:
tensor([1, 2, 3])
tensor([11, 22, 33])
torch.Size([3, 2])
tensor([[ 1, 11],[ 2, 22],[ 3, 33]])

情况二:输入数据为2维数据

dim=0:表示在第0维进行连接,相当于在通道维度上进行组合(输入张量为两维,输出张量为三维),注意:此处输入张量维度为二维,因此dim最大只能为2。

import torcha = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])b = torch.tensor([[11, 22, 33], [44, 55, 66], [77, 88, 99]])print(a)print(b)
#在第0维进行连接,相当于在通道维度上进行组合
#即取a的所有数据,作为新tensor的一个分量
#取b的所有数据,作为新tensor的另一个分量
#(输入张量为两维,输出张量为三维)c = torch.stack([a, b],dim=0)print(c.size())print(c)输出:
tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
tensor([[11, 22, 33],[44, 55, 66],[77, 88, 99]])
torch.Size([2, 3, 3])
tensor([[[ 1,  2,  3],[ 4,  5,  6],[ 7,  8,  9]],[[11, 22, 33],[44, 55, 66],[77, 88, 99]]])

dim=1:表示在第1维进行连接,相当于对相应通道中每个行进行组合,注意:此处输入张量维度为二维,因此dim最大只能为2。

import torcha = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])b = torch.tensor([[11, 22, 33], [44, 55, 66], [77, 88, 99]])print(a)print(b)#在第1维(行)进行连接,相当于对相应通道中每个行进行组合
#取a的一行,b的一行,作为新tensor的第1行和第2行
#原来a:3*3,b:3*3,新tensor:3*2*3c = torch.stack([a, b], 1)print(c.size())print(c)输出:
tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
tensor([[11, 22, 33],[44, 55, 66],[77, 88, 99]])
torch.Size([3, 2, 3])
tensor([[[ 1,  2,  3],[11, 22, 33]],[[ 4,  5,  6],[44, 55, 66]],[[ 7,  8,  9],[77, 88, 99]]])

dim=2:表示在第2维进行连接,相当于对相应行中每个列元素进行组合,注意:此处输入张量维度为二维,因此dim最大只能为2。

import torcha = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])b = torch.tensor([[11, 22, 33], [44, 55, 66], [77, 88, 99]])print(a)print(b)#在第2维进行连接,相当于对相应行中每个列元素进行组合
#针对每行,取a、b的第一列数据,构成tensor的第一行
#针对每行,取a、b的第二列数据,构成tensor的第二行
#,针对每行取a、b的第三列数据,构成tensor的第三行
#原来a:3*3,b:3*3,新tensor:3*3*2
c = torch.stack([a, b], 2)print(c.size())print(c)输出:
tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
tensor([[11, 22, 33],[44, 55, 66],[77, 88, 99]])
torch.Size([3, 3, 2])
tensor([[[ 1, 11],[ 2, 22],[ 3, 33]],[[ 4, 44],[ 5, 55],[ 6, 66]],[[ 7, 77],[ 8, 88],[ 9, 99]]])

情况三:输入数据为3维数据

dim=0:表示在第0维进行连接,相当于在通道维进行拼接。注意:此处输入张量维度为三维,因此dim最大只能为3。

import torcha = torch.tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],[[10, 20, 30], [40, 50, 60], [70, 80, 90]]])b = torch.tensor([[[11, 22, 33], [44, 55, 66], [77, 88, 99]], [[110, 220, 330], [440, 550, 660], [770, 880, 990]]])print(a)print(b)#表示在第0维进行连接,取整个a作为新tensor的一个分量,取整个b作为新tensor的一个分量
c = torch.stack([a, b], 0)print(c)输出:
tensor([[[ 1,  2,  3],[ 4,  5,  6],[ 7,  8,  9]],[[10, 20, 30],[40, 50, 60],[70, 80, 90]]])
torch.Size([2, 3, 3])
tensor([[[ 11,  22,  33],[ 44,  55,  66],[ 77,  88,  99]],[[110, 220, 330],[440, 550, 660],[770, 880, 990]]])
torch.Size([2, 3, 3])
torch.Size([2, 2, 3, 3])
tensor([[[[  1,   2,   3],[  4,   5,   6],[  7,   8,   9]],[[ 10,  20,  30],[ 40,  50,  60],[ 70,  80,  90]]],[[[ 11,  22,  33],[ 44,  55,  66],[ 77,  88,  99]],[[110, 220, 330],[440, 550, 660],[770, 880, 990]]]])

dim=1:表示在第1维进行连接,取各自的第1维度数据,进行拼接。注意:此处输入张量维度为三维,因此dim最大只能为3。 

import torcha = torch.tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],[[10, 20, 30], [40, 50, 60], [70, 80, 90]]])b = torch.tensor([[[11, 22, 33], [44, 55, 66], [77, 88, 99]], [[110, 220, 330], [440, 550, 660], [770, 880, 990]]])print(a)
print(a.size())print(b)
print(b.size())#表示在第1维进行连接,取a的第一维数据[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
#取b的第一维数据[[11, 22, 33], [44, 55, 66], [77, 88, 99]]作为新tensor的一个分量#取a的第一维数据[[10, 20, 30], [40, 50, 60], [70, 80, 90]]
#取b的第一维数据[[110, 220, 330], [440, 550, 660], [770, 880, 990]]作为新tensor的另一个分量
c = torch.stack([a, b], 1)print(c.size())print(c)输出:
tensor([[[ 1,  2,  3],[ 4,  5,  6],[ 7,  8,  9]],[[10, 20, 30],[40, 50, 60],[70, 80, 90]]])
torch.Size([2, 3, 3])
tensor([[[ 11,  22,  33],[ 44,  55,  66],[ 77,  88,  99]],[[110, 220, 330],[440, 550, 660],[770, 880, 990]]])
torch.Size([2, 3, 3])
torch.Size([2, 2, 3, 3])
tensor([[[[  1,   2,   3],[  4,   5,   6],[  7,   8,   9]],[[ 11,  22,  33],[ 44,  55,  66],[ 77,  88,  99]]],[[[ 10,  20,  30],[ 40,  50,  60],[ 70,  80,  90]],[[110, 220, 330],[440, 550, 660],[770, 880, 990]]]])

dim=2:表示在第2维进行连接,取各自的第2维度数据,进行拼接。注意:此处输入张量维度为三维,因此dim最大只能为3。

import torcha = torch.tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],[[10, 20, 30], [40, 50, 60], [70, 80, 90]]])b = torch.tensor([[[11, 22, 33], [44, 55, 66], [77, 88, 99]], [[110, 220, 330], [440, 550, 660], [770, 880, 990]]])print(a)
print(a.size())print(b)
print(b.size())#表示在第1维进行连接,取a的第2维数据[1, 2, 3]
#取b的第2维数据[11, 22, 33]作为新tensor的一个分量#取a的第2维数据[4, 5, 6]
#取b的第2维数据[44, 55, 66]作为新tensor的一个分量#取a的第2维数据[4, 5, 6]
#取b的第2维数据[44, 55, 66]作为新tensor的一个分量#取a的第2维数据[7, 8, 9]
#取b的第2维数据[77, 88, 99]作为新tensor的一个分量#取a的第2维数据[10, 20, 30]
#取b的第2维数据[110, 220, 330]作为新tensor的一个分量#取a的第2维数据[40, 50, 60]
#取b的第2维数据[440, 550, 660]作为新tensor的一个分量#取a的第2维数据[70, 80, 90]
#取b的第2维数据[770, 880, 990]作为新tensor的一个分量
c = torch.stack([a, b], 2)
print(c.size())print(c)输出:
tensor([[[ 1,  2,  3],[ 4,  5,  6],[ 7,  8,  9]],[[10, 20, 30],[40, 50, 60],[70, 80, 90]]])
torch.Size([2, 3, 3])
tensor([[[ 11,  22,  33],[ 44,  55,  66],[ 77,  88,  99]],[[110, 220, 330],[440, 550, 660],[770, 880, 990]]])
torch.Size([2, 3, 3])
torch.Size([2, 3, 2, 3])
tensor([[[[  1,   2,   3],[ 11,  22,  33]],[[  4,   5,   6],[ 44,  55,  66]],[[  7,   8,   9],[ 77,  88,  99]]],[[[ 10,  20,  30],[110, 220, 330]],[[ 40,  50,  60],[440, 550, 660]],[[ 70,  80,  90],[770, 880, 990]]]])

dim=3:表示在第3维进行连接,取各自的第3维度数据,进行拼接。注意:此处输入张量维度为三维,因此dim最大只能为3。

import torcha = torch.tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],[[10, 20, 30], [40, 50, 60], [70, 80, 90]]])b = torch.tensor([[[11, 22, 33], [44, 55, 66], [77, 88, 99]], [[110, 220, 330], [440, 550, 660], [770, 880, 990]]])print(a)
print(a.size())print(b)
print(b.size())#针对第二维数据,在每个第二维度相同的情况下,取各自的列数据,构成新tensor的一行
c = torch.stack([a, b], 3)
print(c.size())print(c)输出:
tensor([[[ 1,  2,  3],[ 4,  5,  6],[ 7,  8,  9]],[[10, 20, 30],[40, 50, 60],[70, 80, 90]]])
torch.Size([2, 3, 3])
tensor([[[ 11,  22,  33],[ 44,  55,  66],[ 77,  88,  99]],[[110, 220, 330],[440, 550, 660],[770, 880, 990]]])
torch.Size([2, 3, 3])
torch.Size([2, 3, 3, 2])
tensor([[[[  1,  11],[  2,  22],[  3,  33]],[[  4,  44],[  5,  55],[  6,  66]],[[  7,  77],[  8,  88],[  9,  99]]],[[[ 10, 110],[ 20, 220],[ 30, 330]],[[ 40, 440],[ 50, 550],[ 60, 660]],[[ 70, 770],[ 80, 880],[ 90, 990]]]])

总结:m个序列数据,在某个维度k进行拼接,该维度大小为n,则拼接后形成了*n*m*大小,具体拼接过程是取m个序列数据,k-1维(设k-1维大小为x,从x=1开始取)相同情况下的第1个数据,构成新tensor的一个行;第二个数据...,第三个数据...构成tensor的新行;然后从x=2开始执行同样的操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浪潮信息AIStation与潞晨科技Colossal-AI 完成兼容性认证!

为进一步提升大模型开发效率,近年来,浪潮信息持续加强行业合作,携手业内头部,全面进攻大模型领域。日前,浪潮信息AIStation智能业务创新生产平台与潞晨科技Colossal-AI大模型开发工具完成兼容性互认证。后续&#xff0…

如何使用 RabbitMQ 进行消息的发送和接收

1、创建连接工厂: ConnectionFactory factory new ConnectionFactory(); factory.setHost("localhost"); // 设置 RabbitMQ 服务器的主机地址 Connection connection factory.newConnection(); // 创建连接 Channel channel connection.createChannel…

性能测试VS负载测试VS压力测试

性能测试 性能测试的目的不是去找bugs,而是排除系统的瓶颈,以及为以后的回归测试建立一个基准。而性能测试的操作,实际上就是一个非常小心受控的测量分析过程。在理想的情况下,被测软件在这个时候已经是足够稳定了,所以这个过程得以顺利的进行。 一组清晰已定义好的…

FFmpeg将绿幕视频处理成透明视频播放

怎么在网页端插入透明视频呢,之前在做Web3D项目时,使用threejs可以使绿幕视频透明显示在三维场景中,但是在网页端怎么让绿幕视频透明显示呢? 如图上图,视频背景遮挡住后面网页内容 想要如下图效果 之前有使用过ffmpeg…

机器人码垛机:智能仓储系统的重要组成部分

随着科技的飞速进步,机器人技术已经渗透到了许多行业领域,其中,仓储业尤为显著。机器人码垛机作为智能仓储系统的重要组成部分,不仅提高了码垛效率,还降低了人工成本和安全风险。然而,在其广泛应用的同时&a…

HTML5 和 CSS3 提高

一、HTML5 的新特性 HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。这些新特性都有兼容性问题,基本是 IE9 以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量使用这些新特性。 声明…

NineAi3.5 –支持GPT绘图,语音播报,联网访问,上下文关联,语音模式

NineAi3.5 –支持GPT绘图,语音播报,联网访问,上下文关联,语音模式 基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话, 还能根据聊天的上下文进行互动&…

Vue3之setup方法

Vue 3 的 setup 方法是 Vue Composition API 的一部分,用于组织和复用 Vue 组件的逻辑代码。Vue Composition API 允许您以更具响应性和函数式的方式来组织和复用 Vue 组件中的代码,特别是在处理复杂逻辑或跨组件共享逻辑时非常有用。 以下是关于 setup…

Java NIO详解

一、概念 NIO, 即new io,也叫非阻塞io 二、NIO三个核心组件: Buffer数据缓冲区Channel通道Selector选择器 1、Buffer缓冲区 缓冲区本质上是一个可以存放数据的内存块(类似数组),可以在这里进行数据写入和读取。此…

第十四届省赛大学B组(C/C++) 冶炼金属

题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续…

【Java】LinkedList模拟实现

目录 整体框架IMyLinkedList接口IndexNotLegalException异常类MyLinkedList类成员变量(节点信息)addFirst(头插)addLast(尾插)在指定位置插入数据判断是否存在移除第一个相等的节点移除所有相等的节点链表的长度打印链表释放回收链表 整体框架 IMyLinkedList接口 这个接口用来…

Leetcode704_二分查找

1.leetcode原题链接:. - 力扣(LeetCode) 2.题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标&#xff…

京东云服务器价格_云主机价格查询系统_2024年京东云优惠活动

2024年京东云服务器优惠价格表,轻量云主机优惠价格5.8元1个月、轻量云主机2C2G3M价格50元一年、196元三年,2C4G5M轻量云主机165元一年,4核8G5M云主机880元一年,游戏联机服务器4C16G配置26元1个月、4C32G价格65元1个月、8核32G费用…

OpenHarmony如何模拟搭建本地http静态服务

简介 本文是在基于OpenHarmony 4.0的基础上,介绍了一种编写一个前端http静态服务的思路. 方案设计 在OpenHarmony上,如果想要访问本地网页。有两种方案 u 方案一:使用file协议,将html放至entry/src/main/resource/rawfile下&#…

构建ELK+Filebeat+kafka+zookeeper大数据日志分析平台

主机IP 角色 所属服务层 部署服务 192.168.11.11 日志生产 采集层 filebeat 192.168.11.12 日志缓存 数据处理层、缓存层 Zookeeperkafkalogstash 192.168.11.13 192.168.11.14 日志展示 持久、检索、展示层 Logstashelasticsearchkibana 数据流向 filebeat--…

#设计模式#3.1 抽象工厂

抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在抽象工厂模式中,抽象工厂定义了产品的创建接口,但是由子类决定实例化哪一个产品类。 在Python中,你可以使用abc模…

维修西格玛泰克触摸屏ETV0551 Sigmatek ETV 0555工业电脑控制面板

控制面板 ETV 0555 控制面板是自动化编程和可视化的智能终端流程。 过程诊断以及操作和监控自动化程序 使用此终端进行简化。触摸屏作为过程数据和参数的输入介质; 输出是显示在 5.7“ VGA TFT 彩色显示屏上。 使用LSE掩模编辑器,可以在PC上创建图形&…

华清远见STM32U5开发板助力2024嵌入式大赛ST赛道智能可穿戴设备及IOT选题项目开发

第七届(2024)全国大学生嵌入式芯片与系统设计竞赛(以下简称“大赛”)已经拉开帷幕,大赛的报名热潮正席卷而来,高校电子电气类相关专业(电子、信息、计算机、自动化、电气、仪科等)全…

新能源充电桩站场AI视频智能分析烟火检测方案及技术特点分析

新能源汽车充电起火的原因多种多样,涉及技术、设备、操作等多个方面。从技术层面来看,新能源汽车的电池管理系统可能存在缺陷,导致电池在充电过程中出现过热、短路等问题,从而引发火灾。在设备方面,充电桩的设计和生产…

若干比赛题目以及补题复盘

一些补题或者比赛中比较典型的问题 1.Problem - E - Codeforces 这道题有这几个点: 1.答案长度只有可能是因数 2.如果一个字符串k是答案,那么这个字符串满足k*xs,差别不大于一,那么这x个字符串中与k不同的至多有一个,所以判断…