Pytorch使用教学6-张量的分割与合并

在这里插入图片描述

在使用PyTorch时,对张量的分割与合并是不可避免的操作,本节就带大家深刻理解张量的分割与合并。

在开始之前,我们先对张量的维度进行深入理解:

t2 = torch.zeros((3, 4))
# tensor([[0., 0., 0., 0.],
#         [0., 0., 0., 0.],
#         [0., 0., 0., 0.]])t2.shape
# torch.Size([3, 4])

重点理解

我们可以把shape的返回结果看成一个序列,代表着各张量维度的信息,第一个数字3代表行,即向量数,第二个数字4代表列,即每个向量中的标量数。

深入理解:t2是由3个一维张量组成,并且每个一维张量都包含四个元素。

张量的分割

chunk(tensor, chunks, dim)

chunk函数能够按照某个维度(dim)对张量进行均匀切分(chunks),并且返回结果是原张量的视图。

# 创建一个4×3的矩阵
t2 = torch.arange(12).reshape(4, 3)
t2
# tensor([[ 0,  1,  2],
#        [ 3,  4,  5],
#        [ 6,  7,  8],
#        [ 9, 10, 11]])

张量可均分时

在第0个维度(shape的第一个数字,代表向量维度)上将t2进行4等分:

# 在矩阵中,第一个维度是行,理解为shape的第一个数
tc = torch.chunk(t2, chunks = 4, dim = 0)
tc
# (tensor([[0, 1, 2]]),
#  tensor([[3, 4, 5]]),
#  tensor([[6, 7, 8]]),
#  tensor([[ 9, 10, 11]]))

根据结果可见:

  1. 返回结果是一个元组,不可变
tc[0] = torch.tensor([[1, 1, 1]])
# TypeError: 'tuple' object does not support item assignment
  1. 元组中的每个值依然是一个二维张量
tc[0]
# tensor([[0, 1, 2]])
  1. 返回的张量tc的一个视图,不是新成了一个对象
# 我们将原张量t2中的数值进行更改
t2[0] = torch.tensor([6, 6, 6])
# 再打印分块后tc的结果
tc
# (tensor([[6, 6, 6]]),
#  tensor([[3, 4, 5]]),
#  tensor([[6, 7, 8]]),
#  tensor([[ 9, 10, 11]]))

还不了解视图的同学,点击进行学习

张量不可均分时

若原张量不能均分时,chunk不会报错,会返回次一级均分结果。

# 创建一个4×3的矩阵
t2 = torch.arange(12).reshape(4, 3)
t2
# tensor([[ 0,  1,  2],
#        [ 3,  4,  5],
#        [ 6,  7,  8],
#        [ 9, 10, 11]])

将4行分为3等份,不可分,就会返回2等分的结果:

tc = torch.chunk(t2, chunks = 3, dim = 0)
tc
# (tensor([[0, 2, 2],
#          [3, 4, 5]]), 
#  tensor([[ 6,  7,  8],
#          [ 9, 10, 11]]))

将4行分为5等份,不可分,就会返回4等分的结果:

tc = torch.chunk(t2, chunks = 5, dim = 0)
# (tensor([[0, 2, 2]]),
#  tensor([[3, 4, 5]]),
#  tensor([[6, 7, 8]]),
#  tensor([[ 9, 10, 11]]))

split函数

split既能进行均分,也能进行自定义切分。需要注意的是split的返回结果也是视图。

# 第二个参数只输入一个数值时表示均分
# 第三个参数表示切分的维度
torch.split(t2, 2, dim = 0)
# (tensor([[0, 1, 2],
#          [3, 4, 5]]), 
#  tensor([[ 6,  7,  8],
#          [ 9, 10, 11]]))

chunk函数不同的是,split第二个参数可以输入一个序列,表示按照序列数值等分:

torch.split(t2, [1,3], dim = 0)
# (tensor([[0, 1, 2]]), 
#  tensor([[ 3,  4,  5],
#          [ 6,  7,  8],
#          [ 9, 10, 11]]))

当第二个参数输入一个序列时,序列的各数值的和必须等于对应维度下形状分量的取值,即shape对应的维度。

例如上述代码中,是按照第一个维度进行切分,而t2总共有4行,因此序列的求和必须等于4,也就是1+3=4,而序列中每个分量的取值,则代表切块大小。

torch.split(t2, [1, 1, 2], 0)
# (tensor([[0, 1, 2]]), 
#  tensor([[3, 4, 5]]), 
#  tensor([[ 6,  7,  8],
#         [ 9, 10, 11]]))

将张量第一个维度(行维度)分为1:1:2。

张量的合并

张量的合并操作类似与列表的追加元素,可以进行拼接、也可以堆叠。

这里一定要将dim参数与shape返回的结果相对应理解。

cat拼接函数

a = torch.zeros(2, 3)
a
# tensor([[0., 0., 0.],
#         [0., 0., 0.]])b = torch.ones(2, 3)
b
# tensor([[1., 1., 1.],
#         [1., 1., 1.]])

因为在张量ab中,shape的第一个位置是代表向量维度,所以当dim取0时,就是将向量进行合并,向量中的标量数不变:

torch.cat([a, b], dim = 0)
# tensor([[0., 0., 0.],
#         [0., 0., 0.],
#         [1., 1., 1.],
#         [1., 1., 1.]])

dim取1时,shape的第二个位置是代表列,即标量数,就是在列上(标量维度)进行拼接,行数(向量数)不变:

torch.cat([a, b], dim = 1)
# tensor([[0., 0., 0., 1., 1., 1.],
##        [0., 0., 0., 1., 1., 1.]])

dimshape结合理解,是不是清晰明了了?

对维度不理解的同学,点击进行学习

stack堆叠函数

和拼接不同,堆叠不是将元素拆分重装,而是将各参与堆叠的对象分装到一个更高维度的张量里。

a = torch.zeros(2, 3)
a
# tensor([[0., 0., 0.],
#         [0., 0., 0.]])b = torch.ones(2, 3)
b
# tensor([[1., 1., 1.],
#         [1., 1., 1.]])

堆叠之后,生成一个三维张量:

torch.stack([a, b], dim = 0)
# tensor([[[0., 0., 0.],
#          [0., 0., 0.]],
#         [[1., 1., 1.],
#          [1., 1., 1.]]])torch.stack([a, b], dim = 0).shape
# torch.Size([2, 2, 3])

此例中,就是将两个维度为1×2×3的张量堆叠为一个2×2×3的张量。

cat的区别

拼接之后维度不变,堆叠之后维度升高。拼接是把一个个元素单独提取出来之后再放到二维张量里,而堆叠则是直接将两个二维向量封装到一个三维张量中。因此,堆叠的要求更高,参与堆叠的张量必须形状完全相同。

python对比

a = [1, 2]
b = [3, 4]

cat拼接操作与listextend相似,不会改变维度,只会在已有框架内增加元素:

a.extend(b)
a
# [1, 2, 3, 4]

stack堆叠操作与listappend相似,会改变维度:

a = [1, 2]
b = [3, 4]
a.append(b)
a
# [1, 2, [3, 4]]

Pytorch张量操作大全:

Pytorch使用教学1-Tensor的创建
Pytorch使用教学2-Tensor的维度
Pytorch使用教学3-特殊张量的创建与类型转化
Pytorch使用教学4-张量的索引
Pytorch使用教学5-视图view与reshape的区别
Pytorch使用教学6-张量的分割与合并
Pytorch使用教学7-张量的广播
Pytorch使用教学8-张量的科学运算
Pytorch使用教学9-张量的线性代数运算
Pytorch使用教学10-张量操作方法大总结

有关Pytorch建模相关的AI干货请扫码关注公众号「AI有温度」阅读获取
在这里插入图片描述

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

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

相关文章

MySQL练手 --- 1934. 确认率

题目链接:1934. 确认率 思路 由题可知,两个表,一个表为Signups注册表,另一个表为Confirmations信息确认表,表的关联关系为 一对一,且user_id作为两个表的连接条件(匹配字段)&#…

自动驾驶(八十八)---------通讯之SOMEIP

1. 什么是SOME/IP 服务导向架构(SOA,Service-Oriented Architecture)是一种设计软件系统的方法,强调通过可重用的服务来实现系统的松散耦合。每个服务是独立的功能单元,可以被不同的应用程序使用。这些服务通过标准化的…

音视频入门基础:H.264专题(16)——FFmpeg源码中,判断某文件是否为H.264裸流文件的实现

音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

Redis (常用数据结构和命令)

目录 简介 概述 特点 数据结构 常用命令 通用命令 keys del exists expire 与 ttl String 命令 SET 和GET: MSET和MGET INCR和INCRBY和DECY SETNX SETEX Redis 命令 Key 的层级结构 key层级关系 : Hash命令 HSET和HGET HMSET和HMGET HGETALL H…

免杀笔记 -->API的整理Shellcode加密(过DeFender)

最近更新频率明显下降我懒,那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。 1.WinAPI整理 问我为什么要整理? 就是用起来的时候要左翻右翻 :: 烦死了 1.VirtualAlloc VirtualAlloc(NULL,sizeof(buf),MEM_…

FastAPI(七十五)实战开发《在线课程学习系统》接口开发-- 创建课程

源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 上次我们分享了,FastAPI(七十四)实战开发《在线课程学习系统》接口开发-- 删除留言 从本篇文章开始,…

Potree在web端显示大型点云模型文件

一、克隆项目代码(准备好上网工具,得先有node.js npm 环境) git clone https://github.com/potree/potree.git二、依赖安装(换淘宝镜像能快一些) cd potree npm install三、运行 npm start四、使用样例 打开浏览器…

python黑马笔记

运算符: 算术运算符: 加 - 减 * 乘 / 除 // 整除 % 取余 ** 求平方 除法计算得出的结果都是小数 赋值运算符: 标准赋值: 复合赋值: 、 - 、 * 、 / 、// 、 ** 字符串: 字符串拓展内容&#xf…

Vue 3 实现左侧列表点击跳转滚动到右侧对应区域的功能

使用 Vue 3 实现左侧列表点击跳转到右侧对应区域的功能 1. 引言 在这篇博客中,我们将展示如何使用 Vue 3 实现一个简单的页面布局,其中左侧是一个列表,点击列表项时,右侧会平滑滚动到对应的内容区域。这种布局在很多应用场景中都…

力扣高频SQL 50 题(基础版)第三题

文章目录 力扣高频SQL 50 题(基础版)第三题1148.文章浏览题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50 题(基础版)第三题 1148.文章浏览 题目说明 Views 表: ---------------------- | Colu…

Internet Download Manager(IDM)2024中文版本有哪些新功能?6.42版本功能介绍

1. Internet Download Manager(IDM)是一款功能强大的下载管理器,支持所有流行的浏览器,并可提升下载速度高达5倍。 2. IDM具有智能下载逻辑加速器,可以设置文件下载优先级、分块下载等,提高下载效率。 IDM…

数据结构(5.3_4)——线索二叉树的概念

普通二叉树找某结点前驱和后继的方法 中序线索二叉树 n个结点的二叉树,有n1个空链域!可用来记录前驱,后继的信息 中序线索二叉树的存储结构 //线索二叉树结点 typedef struct ThreadNode {ElemType data;struct BiTNode* lchild, * rchild;int ltag,…

Facebook的隐私之战:用户数据保护的挑战与未来

在数字化时代,隐私问题成为了公众关注的焦点,而作为全球最大的社交网络平台之一,Facebook(现已更名为Meta)在用户数据保护方面面临着巨大的挑战。从数据泄露到隐私政策的变化,Facebook的隐私之战不仅关乎其…

前端三大主流框架Vue React Angular有何不同?

前端主流框架,Vue React Angular,大家可能都经常在使用,Vue React,国内用的较多,Angualr相对用的少一点。但是大家有思考过这三大框架的不同吗? 一、项目的选型上 中小型项目:Vue2、React居多…

规范:前后端接口规范

1、前言 随着互联网的高速发展,前端页面的展示、交互体验越来越灵活、炫丽,响应体验也要求越来越高,后端服务的高并发、高可用、高性能、高扩展等特性的要求也愈加苛刻,从而导致前后端研发各自专注于自己擅长的领域深耕细作。 然…

SpringMVC基础

SpringMVC ssm:mybatisSpringSpringMVC MVC三层架构 1、什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范 是将业务逻辑、数据、显示分离…

应用层自定义协议以及序列化和反序列化

文章目录 应用层自定义协议以及序列化和反序列化1、应用层自定义协议1.1、应用层1.2、协议 2、序列化和反序列化3、TCP 为什么支持全双工4、jsoncpp基础4.1、序列化4.2、反序列化 5、实现网络版计算器6、手写序列化和反序列化 应用层自定义协议以及序列化和反序列化 1、应用层…

Anconda 快速常用命令简洁版

目的:简单清楚的使用基本的conda 命令 可能需求 查看项目中的虚拟环境及依赖是否满足需求操作新环境来满足项目或者论文的实现 Anconda 常用命令 conda 查看基础命令1. 进入Anaconda 环境2. 查看版本3.查看有哪些虚拟环境4.激活虚拟环境5. 进入虚拟环境查看6. 退出…

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(二)|| 堆 / 栈

堆和栈 1. 堆 堆就是空闲的一块内存,可以通过malloc申请一小块内存,用完之后使用再free释放回去。管理堆需要用到链表操作。 比如需要分配100字节,实际所占108字节,因为为了方便后期的free,这一小块需要有个头部记录…

IDEA缓存和索引

IDEA缓存和索引 —2020年06月10日 IntelliJ IDEA首次加载项目的时候。都会创建索引,而创建索引的时间根项目的文件多少成正比。 IntelliJ IDEA的缓存和索引主要是用来加快文件查询,从而加快各种查找、代码提示等操作的速度。 某些特殊情况下&#xf…