pytorch入门篇2 玩转tensor(查看、提取、变换)

2023-10-27

上一篇博客讲述了如何根据自己的实际需要在pytorch中创建tensor:pytorch入门篇1——创建tensor,这一篇主要来探讨关于tensor的基本数据变换,是pytorch处理数据的基本方法。

1 tensor数据查看与提取

tensor数据的查看与提取主要是通过索引和切片实现的。主要方法有:

  • 直接索引:tensor[index]
  • 选定数据范围切片:tensor[s:d]
  • 步长切片:tensor[s:d:step]
  • 数据筛选:torch.masked_select(tensor,mask),其中mask是和tensor等shape的Bool类型矩阵,函数将以一维矩阵的形式返回mask中值为1对应位置tensor矩阵的值
################################################
#1、直接索引
a = torch.rand(4,1,16,16)
b = a[0]
print(b.size())
"""
输出结果:
torch.Size([1, 16, 16])
"""
################################################
#2、选定索引的维度范围
c = a[1:3,:,:,:]
print(c.size())
"""
输出结果:
torch.Size([2, 1, 16, 16])
"""
################################################
#3、按步长索引
c = a[0:3:2,:,:,:]
print(c.size())
"""
输出结果:
torch.Size([2, 1, 16, 16])
"""
################################################
#4、按mask筛选索引
d = torch.rand(2,3)
mask = torch.BoolTensor([[0,1,0],
                        [1,0,1]])
res = torch.masked_select(d,mask)
print(d)
print(res)
"""
输出结果:
tensor([[0.2507, 0.8419, 0.6681],
        [0.0940, 0.8476, 0.5883]])
tensor([0.8419, 0.0940, 0.5883])
"""

2 tensor数据变换

本部分主要介绍的是将已有的tensor数据改变shape的方法,这是pytorch变换数据的基本操作。

2.1 重置tensor形状:pytorch.view()

torch.view()主要实现重新定义tensor的shape,对tensor中的元素进行重排列,在view过程中tensor的总元素个数保持不变该方法的缺点是会丢失维度信息

#############################################
a = torch.rand(4,4,16,16)
b = a.view(4,32,32)
print(a.shape)
print(b.shape)
"""
输出结果:
torch.Size([4, 4, 16, 16])
torch.Size([4, 32, 32])
#注:在view前后必须保证tensor的总元素个数不变
#   在本例中:4*4*16*16 = 4*32*32
"""

2.2 增加/减少tensor维度:torch.unsqueeze()/torch.squeeze()

  • torch.unsqueeze(index):在原tensor的index索引位置对应的维度前增加一个维度,
  • torch.squeeze(index):去掉index索引位置对应的维度,注意:这里index对应的维度必须是1维的,也就是压缩(删除)此维度并不会改变数据的元素个数,当不指定index时,函数会将tensor中所有数值为1的维度压缩。例如:现有tensor(1,4,1,16,16),tensor.squeeze(0)的值为:(4,1,16,16),函数压缩了0这个维度;当不指定index时,tensor.squeeze()的返回值为:(4,16,16),这时函数将tensor上数值为1的维度全部压缩
#############################################
a = torch.rand(4,4,16,16)
b = a.unsqueeze(0)
c = torch.rand(1,4,1,16,16).squeeze()
print(a.shape)
print(b.shape)
print(c.shape)
"""
输出结果:
torch.Size([4, 4, 16, 16])
torch.Size([1, 4, 4, 16, 16])
torch.Size([4, 16, 16])
"""

2.3 tensor扩充:torch.expand()/torch.repeat()

  • torch.expand():接收参数是将对应元素扩充的指定维度,函数只把原来维度为1的拓展成指定的维度,其它原来维度不是1的接收参数要与其原来维度数保持一致,否则会报错
  • torch.repeat():接收参数是将对应元素复制的次数,函数会将所有维度复制对应的次数,形成新的tensor
    示例及讲解:
#############################################
a = torch.rand(4,1,16,16)
#a中只有a[1]是1维度,这里要将它扩充至4,因此expand中第二个参数为4,其它维度不是1,所以要与a保持一致(否则会报错)
b = a.expand(4,4,16,16)
#repeat中的参数都是,代表这要将a中对应维度的元素都复制两次
c = a.repeat(2,2,2,2)
print(a.shape)
print(b.shape)
print(c.shape)
"""
输出结果:
#这是原来a变量的shape
torch.Size([4, 1, 16, 16])
#这是经过expand后的a变量(b)的shape
#可以看出,expand成功将原理index=1位置处的1维度扩充成了对应的4维度
torch.Size([4, 4, 16, 16])
#这是经过repeat后的a变量的shape
#可以看出,repeat将每个维度都复制了2次,即:(4*2,1*2,16*2,16*2)
torch.Size([8, 2, 32, 32])
"""

2.4 tensor维度交换/重新排序:torch.transpose()/torch.permute()

  • torch.tanspose():接收参数为指定对换的两个维度索引a,b,函数将返回维度互换后的新tensor
  • torch.permute():接收参数为新排序的维度索引(原来的索引值),函数将返回维度重新排列的新tensor
#############################################
a = torch.rand(4,1,12,16)
b = a.transpose(0,2)        #第0个维度和第2个维度互换,即:4和12互换
c = a.permute(3,2,0,1)  #将原有的3, 2, 0,1维度作为新tensor的0,1,2,3维度
print(a.shape)
print(b.shape)
print(c.shape)
"""
输出结果:
torch.Size([4, 1, 12, 16])  #a.shape
torch.Size([12, 1, 4, 16])  #b.shape  (4,1,12,16)-互换4,12->(12,1,4,16) 
torch.Size([16, 12, 4, 1])  #c.shape  重新对a进行排列(a[3],a[2],a[0],a[1])->(16,12,4,1)
"""

3 总结

tensor变换的核心理念是为了更好的服务于高维向量运算,这部分的变换技巧和相关的方法有很多。关于这部分的内容我的建议是:不需要花费大量的时间去刻意记忆,只要知道有这些方法,在编程需要的时候能想起来用这些方法可以解决即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch入门篇2 玩转tensor(查看、提取、变换) 的相关文章

随机推荐

  • ACN总结报告

    ACM总结报告 关于学到的知识 先暂且留一下 先说说这学期的情况 还记得 刚开始时选择这门选修课 除了听说它对于我们计算机专业的来说很有用之外 就是听说它很难 想要挑战一下自我而已 想想 现在不由自主的想要笑起来 说实在的 对于这门选修课
  • Flamingo插件_Contact Form 7表单数据存储插件

    Flamingo插件是一款用来帮助 Contact Form 7表单数据存储的插件 因为Contact Form 7插件本身没有数据存储功能 默认把前台访客提交的表单数据提交到设置好的接收邮箱 如果邮件服务器出现问题 配置错误就可能会永远丢
  • 第一课:一文读懂马尔科夫过程

    1 马尔科夫决策过程 MDPs 简介 马尔科夫决策过程是对强化学习 RL 问题的数学描述 几乎所有的RL问题都能通过MDPs来描述 最优控制问题可以用MDPs来描述 部分观测环境可以转化成POMDPs 赌博机问题是只有一个状态的MDPs 注
  • 查看LINUX放开端口,Linux下防火墙开启相关端口及查看已开启端口

    Linux下防火墙开启相关端口及查看已开启端口 1 默认情况下Linux的防火墙都是在关闭状态下的 root test etc service iptables status Firewall is stopped root test et
  • 新建Springboot项目默认test包下的测试类报错缺少org.junit.jupiter.api

    在springboot项目中碰到一个问题 记录一下 新建了一个普通的Maven项目A 其pom xml继承parent为
  • 电脑怎么恢复已删除的数据?

    恢复已经删除的数据取决于多种因素 包括删除的方式 存储设备的类型以及是否有备份等 以下是一些常见的方法 但不能保证所有情况下都能成功恢复数据 在尝试恢复数据之前 请确保不会进一步覆盖原始数据 以提高恢复成功的机会 回收站 如果你删除的是电脑
  • mysql数据去重并排序使用distinct 和 order by 的问题

    比如直接使用 SELECT distinct mobileFROM table aWHERE code 123ORDER BY a ime desc 在本地mysql数据库没有错 在线上的数据库就会报如下错 估计是版本的问题 Express
  • 典型的贪心算法~ (田忌赛马 )

    1 田忌赛马 典型的贪心算法 自己木有考虑到贪心的第二步导致wa了好多次 算法分析 Problem Description 给出2N组数据 分别表示田忌和齐威王的N匹马的速度 没进行一场比赛 每组数据共N场场赛 若能分出胜负 则输的一方要给
  • DVWA之SQL注入

    一 DVWA介绍 1 1 DVWA简介 DVWA是一款基于PHP和MYSQL开发的web靶场练习平台 集成了常见的web漏洞如sql注入 XSS 密码破解等常见漏洞 旨在为安全专业人员测试自己的专业技能和工具提供合法的环境 帮助web开发者
  • 七牛云上传图片,只需十分钟搞定

    1 去七牛云注册 建好自有空间 2 导入依赖
  • Sonar常见问题解决方案

    阻断 1 Close this FileInputStream in a finally clause 在finally中关闭FileInputStream 这个最为常见 主要是关闭方式不对 finally代码块中 应该要对每个stream
  • FCGI

    fcgi作为客户端需要注意的几点 http blog csdn net cleanfield article details 6699952 fcgi作为中间层 需要与后端server通信进行数据处理 这里需要注意一下几点 1 要做好超时处
  • 日历插件可选择_Obsidian——推荐插件

    Obsidian 推荐插件 工具 Obsidian 官方插件 关系图谱 页面预览 预览模式中 鼠标悬浮于一个内链时 显示小窗预览 编辑模式中 鼠标悬浮于链接上的同时按住 Ctrl Cmd 也会显示预览小窗 快速切换 Ctrl Cmd O 在
  • 开山之作,简单说说什么是"集群(Cluster)"

    一 什么是集群 集群 Cluster 是由两台或多台节点机 服务器 构成的一种松散耦合的计算节点集合 为用户提 供网络服务或应用程序 包括数据库 Web服务和文件服务等 的单一客户视图 同时提供接近容错机的故 障恢复能力 集群系统一般通过两
  • AndroidStudio项目打包成library以及jar包、aar包流程

    引言 一般项目做多了后 码农们都会整理出一系列的工具类来 为了方便在后面项目中使用 打包成library或者jar aar包供项目使用是比较好的方式 1 library方式 library方式是比较简单的方式 一般新建完一个项目的时候 点击
  • mysql意向锁的概念和用途

    锁的粒度 A 表锁 Table Lock 对整个表加锁 影响标准的所有记录 通常用在DDL语句中 如DELETE TABLE ALTER TABLE等 B 行锁 Row Lock 对一行记录加锁 只影响一条记录 通常用在DML语句中 如IN
  • Visio如何插入公式、MathTape安装

    遇到的问题 在写论文过程中发现Visio没有插入公式的选项 而从word中复制过来邮无法识别 经过我在一番百度以后解决了这个问题 首先要求我们的电脑上已经装好WPS或者MathType 我的电脑已经装了office 所以不想再装WPS 所以
  • 课程计划、课程标准、教材三者关系

    课程主要表现为课程计划 课程标准 教材 教科书是其主要部分 课程计划 国家教育主管部门制定的 包括课程设置 学科顺序 课时分配 学年编制和学周安排 课程标准 国家根据课程计划纲要的形式编写的有关某门学科的内容及实施 评价的指导行文件 如 高
  • 使用nginx搭建的各种服务

    一 nginx搭建文件服务器 1 安装nginx bin bash 安装nginx的脚本文件 先按照nginx的依赖 yum y install gcc openssl devel pcre devel gt dev null echo n
  • pytorch入门篇2 玩转tensor(查看、提取、变换)

    上一篇博客讲述了如何根据自己的实际需要在pytorch中创建tensor pytorch入门篇1 创建tensor 这一篇主要来探讨关于tensor的基本数据变换 是pytorch处理数据的基本方法 文章目录 1 tensor数据查看与提取