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

函数功能

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

参数列表

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

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

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

import torch

a = 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 torch

a = 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 torch

a = 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 torch

a = 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*3

c = 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 torch

a = 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 torch

a = 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 torch

a = 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 torch

a = 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 torch

a = 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.mfbz.cn/a/498606.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新零售SaaS架构:客户管理系统的应用架构设计

客户管理系统的应用架构设计 应用层定义了软件系统的应用功能,负责接收用户的请求,协调领域层能力来执行任务,并将结果返回给用户,功能模块包括: 客户管理:核心功能模块,负责收集和更新客户信息…

IDEA跑Java后端项目提示内存溢出

要设置几个地方,都试一下吧: 1、默认是700,我们设置大一点(上次配置了这儿就解决了) 2、 3、 4、-Xmx4g

Linux repo基本用法: 搭建自己的repo仓库[服务端]

概述 Repo的使用离不开Git, Git 和 Repo 都是版本控制工具,但它们在使用场景和功能上有明显区别… Git 定义:Git 是一个分布式的版本控制系统,由 Linus Torvalds 为 Linux 内核开发而设计,现已成为世界上最流行的版本控制软件之…

Redis 基础命令集详解

目录 一、string 类型及操作 二、hash 类型及操作 三、list 类型和操作 四、set 类型及操作 五、zset类型及操作 六、其他相关命令 一、string 类型及操作 string是最简单的类型,一个key对应一个value,string类型是二进制安全的。redis的string可以…

硬件9、常用PCB封装的直接调用

拷贝过来之前的封装(适用于之前的项目创建过项目的,可以多个) ctrlA全选,然后ctrlc进行全部复制 然后切换到要使用的封装库里面进行粘贴 复制 在其他库文件中粘贴 单独复制一个封装 在PCB中使用ctrlc进行复制 切换到库中&…

保理业务风险评级及尽调

企业评级的作用 对核心企业进行评级,是为了初步判断核心企业(买方)的基本状况,确保开展业务后核心企业(买方)的还款能力;对融资企业(卖方)进行评级,是为了判…

消息队列经典应用场景

笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。 在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章,笔者结合自己的真实经历,和大家分享消息队列的七种经典应用场景。 1 异步&解耦 笔者曾经负责某电…

SIP-6002D对讲终端使用说明 SIP对讲求助终端

SIP对讲终端SIP-6002D双按键是一款采用了ARMDSP架构;配置了麦克风输入和扬声器输出,SIP-6002D带两路寻呼按键,可实现SIP对讲功能,作为SIP对讲的终端,主要用于银行、部门机构、调度室、化工厂、钢铁厂、矿井、风电等场所…

彩信群发为奢侈品行业带来了哪些性化体验与互动?

彩信群发作为一种创新的营销手段,为奢侈品行业带来了诸多个性化体验与互动的机会。以下是一些具体的体现: 首先,彩信群发为奢侈品品牌提供了丰富的创意展示空间。通过嵌入高质量的图片、短视频和音频,品牌可以全方位、多角度地展示…

Vue——高德地图

1.官网上需要注册并登录高德地图开放平台,申请密钥(如图1)。(高德地图官网)选择Web端,添加成功后,可以获取到(图2)key和密钥 2.Vue项目终端安装地图加载包 npm i amap/amap-jsapi-loader --s…

6.二叉树——3.搜索树

二叉搜索树BST的特色 左<根<右中序序列有序 二叉搜索树构造 树为空&#xff0c;新结点作为根树不空&#xff0c;新结点与树根比大小 大往右走&#xff0c;小往左走 新结点插入空位 例题 代码 #include <cstdio> #include <string> #include <map>…

目标检测——交通专用车辆数据集

一、重要性及其意义 目标检测在交通管理领域&#xff0c;特别是在交通专用车辆数据集的构建上&#xff0c;具有显著的重要性和深远的意义。以下是对其重要性及其意义的详细探讨&#xff1a; 提升交通管理效率&#xff1a;通过精准的目标检测&#xff0c;交通管理部门可以迅速识…

regexp_substr()

1、基本语法 REGEXP_SUBSTR(String, pattern, position,occurrence, modifier) String&#xff1a;需要进行处理的字符串。 pattern&#xff1a;正则表达式。 position&#xff1a;起始位置&#xff08;从字符串的第几个开始&#xff0c;默认为1&#xff0c;注&#xff1a;…

基于springboot实现社区团购系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现社区团购系统演示 摘要 本课题是根据用户的需要以及网络的优势建立的一个社区团购系统&#xff0c;来满足用户团购的需求。 本社区团购系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&…

短剧APP搭建必备技巧大揭秘

在当今数字化时代&#xff0c;随着人们对视频内容的需求不断增长&#xff0c;短剧APP成为一种备受关注的新兴形式。短剧APP提供了一个平台&#xff0c;让用户可以快速、便捷地浏览各种精彩的短剧内容&#xff0c;吸引了大批年轻用户的关注。短剧APP的搭建不仅可以满足用户对短剧…

JAVA面试八股文之集合

JAVA集合相关 集合&#xff1f;说一说Java提供的常见集合&#xff1f;hashmap的key可以为null嘛&#xff1f;hashMap线程是否安全, 如果不安全, 如何解决&#xff1f;HashSet和TreeSet&#xff1f;ArrayList底层是如何实现的&#xff1f;ArrayList listnew ArrayList(10)中的li…

Coursera自然语言处理专项课程03:Natural Language Processing with Sequence Models笔记 Week02

Natural Language Processing with Sequence Models Course Certificate 本文是https://www.coursera.org/learn/sequence-models-in-nlp 这门课程的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Natural Language Processing with Sequence ModelsWeek 02…

eclipse导入svn项目

1、配置maven和jre 2、用svn引入项目, 3一直点击next,到最后选完成。 4、从svn引入成功后&#xff0c;右键项目名点delete&#xff0c;弹窗出现的框不选&#xff0c;然后再import,点maven,点(existing maven projects)已存在maven项目&#xff0c;选择该文件等待引入完成…

免费VPS/云服务器整理汇总

随着互联网的普及和云计算技术的飞速发展&#xff0c;越来越多的人开始尝试使用VPS&#xff08;Virtual Private Server&#xff0c;虚拟专用服务器&#xff09;或者云服务器来部署自己的在线业务。本文将对免费VPS/云服务器进行整理汇总&#xff0c;助力大家轻松开启云计算之旅…

硬件7、AD设置封装如何画IC芯片以及芯片的散热引脚

首先查看引脚的尺寸&#xff0c;引脚的宽度为b&#xff0c;选择b的Max&#xff1a;0.5mm&#xff0c;然后计算引脚的长度&#xff1a;(E-E1)/2&#xff0c;也就是(6.1-3.95)/2约等于1mm&#xff0c;填写参数可以填1.2mm&#xff0c;尽量大一点 可以看到两个引脚的中心点在水平…
最新文章