Pytorch-张量形状操作

😆😆😆感谢大家的观看😆😆

🌹

reshape 函数

transpose 和 permute 函数

view 和 contigous 函数

squeeze 和 unsqueeze 函数


在搭建网络模型时,掌握对张量形状的操作是非常重要的,因为这直接影响到数据如何在网络各层之间传递和处理。网络层与层之间很多都是以不同的 shape 的方式进行表现和运算,我们需要掌握对张量形状的操作,以便能够更好处理网络各层之间的数据连接,确保数据能够顺利地在网络中流动,接下来我们看看几个常用的函数方法🌹

reshape 函数

💎reshape 函数可以在保证张量数据不变的前提下改变数据的维度,将其转换成指定的形状,在后面的神经网络学习时,会经常使用该函数来调节数据的形状,以适配不同网络层之间的数据传递。

import torch# 创建一个张量
tensor = torch.tensor([[1, 2], [3, 4]])
print("原始张量:")
print(tensor)
# (2,2)# 使用reshape函数修改张量形状
reshaped_tensor = tensor.reshape(1, 4)
print("修改后的张量:")
print(reshaped_tensor)
# (1,4)

当第二个参数为-1时,表示自动计算该维度的大小,以使得张量的元素总数不变,这样我们可以免去思考的时间。

import torch# 创建一个张量
tensor = torch.tensor([[1, 2], [3, 4]])
print("原始张量:")
print(tensor)# 使用reshape函数修改张量形状,第二个参数为-1
reshaped_tensor = tensor.reshape(1, -1)
print("修改后的张量:")
print(reshaped_tensor)原始张量:
tensor([[1, 2],[3, 4]])
修改后的张量:
tensor([[1, 2, 3, 4]])

transpose 和 permute 函数

💎transpose 函数可以实现交换张量形状的指定维度,permute 函数可以一次交换更多的维度

  • transposetranspose用于交换张量的两个维度。它并不改变张量中元素的数量,也不改变每个元素的值,只是改变了元素在张量中的排列顺序。在二维情况下,transpose相当于矩阵的转置,将行变为列,列变为行。在多维情况下,它会按照提供的轴(dimension)参数来重新排列维度。
  • reshapereshape则是改变张量的形状,而不改变任何特定的维度位置。你可以使用reshape将张量从一种形状变换到另一种形状,只要两个形状的元素总数相同。这个过程不涉及元素之间的交换,只是调整了元素在内存中的分布,以适应新的形状。在内部实现上,reshape通常通过修改张量的元数据(如shape和strides属性)来实现,而不需要重新排列数据本身。
  • 如果你需要保持张量中元素的相对位置不变,仅调整张量的维度顺序,那么应该使用transpose;如果你需要改变张量的整体形状而不关心维度的顺序,reshape会是正确的选择。

      
data = torch.tensor(np.random.randint(0, 10, [3, 4, 5]))
print('data shape:', data.size())交换1和2维度
new_data = torch.transpose(data, 1, 2)
print('data shape:', new_data.size())#将 data 的形状修改为 (4, 5, 3)
new_data = torch.transpose(data, 0, 1)
new_data = torch.transpose(new_data, 1, 2)
print('new_data shape:', new_data.size())# 使用 permute 函数将形状修改为 (4, 5, 3)
new_data = torch.permute(data, [1, 2, 0])
print('new_data shape:', new_data.size())# 结果
data shape: torch.Size([3, 4, 5])
data shape: torch.Size([3, 5, 4])
new_data shape: torch.Size([4, 5, 3])
new_data shape: torch.Size([4, 5, 3])

view 和 contigous 函数

💎view 函数也可以用于修改张量的形状,只能用于存储在整块内存中的张量。在 PyTorch 中,有些张量是由不同的数据块组成的,它们并没有存储在整块的内存中,view 函数无法对这样的张量进行变形处理,如果张量存储在不连续的内存中,使用view函数会导致错误。在这种情况下,可以使用contiguous函数将张量复制到连续的内存中,然后再使用view函数进行形状修改。

import torch# 创建一个张量
tensor = torch.randn(2, 3, 4)# 使用view函数改变张量的形状
reshaped_tensor = tensor.view(6, 4)# 使用contiguous函数使张量在内存中连续存储
contiguous_tensor = tensor.contiguous()

使用 transpose 函数修改形状或者 permute 函数的处理之后,就无法使用 view 函数进行形状操作,这时data.contiguous().view(2, 3)即可。

squeeze 和 unsqueeze 函数

💎squeeze函数用于移除张量中维度为1的轴,而unsqueeze函数则用于在指定位置插入一个新的维度

torch.squeeze(input, dim=None)

  • input: 输入张量。
  • dim: 可选参数,指定要移除的维度。如果不指定,则移除所有大小为1的维度。
import torchA = torch.tensor([[[1, 2, 3], [4, 5, 6]]])
print(A.shape) # 输出:torch.Size([1, 2, 3])
B = torch.squeeze(A)
print(B.shape) # 输出:torch.Size([2, 3])
C = torch.squeeze(A, 0)
print(C.shape) # 输出:torch.Size([2, 3])
D = torch.squeeze(A, 1)
print(D.shape) # 输出:torch.Size([1, 3])

 torch.unsqueeze(input, dim)

  • input: 输入张量。
  • dim: 指定要插入新维度的位置。
import torchA = torch.tensor([1, 2, 3])
print(A.shape) # 输出:torch.Size([3])
B = torch.unsqueeze(A, 0)
print(B.shape) # 输出:torch.Size([1, 3])
C = torch.unsqueeze(A, 1)
print(C.shape) # 输出:torch.Size([3, 1])

🎰小结

  1. reshape函数可以在保证张量不变的前提下改变数据维度。
  2. transpose(转置)函数可以实现交换张量形状的指定维度,permute可以一次交换更多维度。
  3. view函数也可以用于修改张量的形状,但是他要求被转换的张量内存必须连续,所以一般配合contiguous(连续的)函数使用。
  4. squeeze(挤压)函数和unsqueeze函数可以用来增加或者减少维度。

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

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

相关文章

背会这套面试八股文!还怕拿不到offer吗?

给各位小伙伴总结了软件测试的高频面试题,其中包含了多个方面的知识点,包括: 测试基础(102页) Linux基础(38页) MySQL (63页) ️ web测试(28页) APP测试(38页) selenium相关(50页) 性能测试(55页) 数据结构跟算法(51页) 大厂逻辑题(…

InnoDB架构:内存篇

InnoDB架构:内存篇 InnoDB是MySQL数据库中默认的存储引擎,它为数据库提供了事务安全型(ACID兼容)、行级锁定和外键支持等功能。InnoDB的架构设计优化了对于读取密集和写入密集型应用的性能表现,是一个高度优化的存储系…

如何用法语花式「道歉」?柯桥法语培训法语学校成人口语培训

生活中人与人之间总会有小摩擦,难免需要表示歉意;有的时候一句“对不起”更像是一种礼貌用语(formulation de politesse),为干燥的人际交流增添一点润滑剂。那么在法语中,有多少种方式可以表达“抱歉”呢&a…

Excel VBA技术:编织数据之梦的魔法语言

想要让你的Excel技能瞬间升级,成为数据处理与展示的顶尖高手吗?Excel VBA技术正是你不可错过的魔法武器!它能让你轻松驾驭复杂的数据任务,自动化处理繁琐操作,释放你的双手和大脑。通过VBA,你可以创建精美的…

【经典算法】LeetCode 136:只出现一次的数字(Java/C/Python3实现含注释说明,Easy)

个人主页: 进朱者赤 阿里非典型程序员一枚 ,记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名) 目录 题目描述思路及实现方式一:使用异或运算(推荐)思…

Day01-环境准备与镜像案例

Day01-环境准备与镜像案例 1. 容器架构1.1 Iaas Paas Saas (了解)1.2 什么是容器1.3 容器vs虚拟机1.4 Docker极速上手指南1)配置docker源(用于安装docker)2)docker下载镜像加速的配置3)自动补全 1.5 Docker C/S架构1.6 Docker的镜像管理1&…

MS1002激光测距用高精度时间测量(TDC)电路

产品简述 MS1002 是一款高精度时间测量 (TDC) 电路,具有更高的精度 和更小的封装,适合于低成本时间测量的工业应用领域。 MS1002 具有双通道、多脉冲的采样能力、高速 SPI 通讯、 多种测量模式,适合于激光雷达和激光测距。 主要特点…

百度沈抖:传统云计算不再是主角,智能计算呼唤新一代“操作系统”

Create 2024 百度AI开发者大会 4月16日,Create 2024 百度AI开发者大会在深圳召开。期间,百度集团执行副总裁、百度智能云事业群总裁沈抖正式发布新一代智能计算操作系统——万源,通过对AI原生时代的智能计算平台进行抽象与封装设计&#xff…

Python学习笔记(37)——用xlwings库生成excel

老规矩先pip入xlwings库 STEP1:下载xlwings库 windowsr>>cmd>>pip install xlwings (如果需要不同版本可以到pypi上搜) STEP2:完成EXCEL初级创建 请打开您的编写软件~~~~~(小编的显示结果为PYCHARM编写的,因为颜色标注好看(…

普通人做抖音小店真的能赚钱吗?可以,但更取决于个人

大家好,我是电商花花。 现在做抖音小店的基本上都是一些新商家,对于我们众多零基础的朋友来说,是期待也是一份挑战。 抖音小店作为一个充满机会的新兴平台,许多人都欣喜的投入其中,期望能够借此来改变自己的命运&…

Python 物联网入门指南(四)

原文:zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者:飞龙 协议:CC BY-NC-SA 4.0 第九章:构建光学字符识别的神经网络模块 本章介绍以下主题: 使用光学字符识别(OCR)系统 使…

springboot+vue全栈开发【3.前端篇之Vue基础语法1】

目录 前言Vue基础语法1.内容渲染指令2.属性绑定指令3.使用JavaScript表达式 前言 hi,这个系列是我自学开发的笔记,适合具有一定编程基础(html、css那些基础知识要会!)的同学,有问题及时指正! …