PyTorch_张量形状操作

搭建模型时,数据都是基于张量形式的表示,网络层与层之间很多都是以不同的shape的方式进行表现和运算。

对张量形状的操作,以便能够更好处理网络各层之间的数据连接。


reshape 函数的用法

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

import torch 
import numpy as np def test01():torch.manual_seed(0)data = torch.randint(0, 10, [4, 5])# 查看张量的形状print(data.shape, data.shape[0], data.shape[1])  # shape属性可以查看张量的形状print(data.size(), data.size(0), data.size(1))  # size()方法可以查看张量的形状# 修改张量的形状new_data = data.reshape(2, 10) # 两行十列print(new_data)# 注意:转换之后的形状元素个数得等于原来张量的元素个数,不然就报错。上面创建data就是4*5=20个元素# 使用 -1 代替省略的形状new_data = data.reshape(-1, 10) # -1表示自动计算行数print(new_data.shape)  # torch.Size([2, 10])print(new_data)new_data = data.reshape(2, -1) # -1表示自动计算列数print(new_data)if __name__ == "__main__":test01() 

transpose 和 permute 函数的使用

transpose 函数可以实现交换张量形状的指定维度。

例如:一个张量的形状为 (2, 3, 4) 可以通过 transpose 函数把 3 和 4 进行交换,将张量的形状变为 (2, 4, 3)。

permute 函数可以一次交换更多的维度。

本质上都是在修改数据的维度。

import torch 
import numpy as np # transpose 函数
def test01():torch.manual_seed(0)data = torch.randint(0, 10, [3, 4, 5])# new_data = data.reshape(4, 3, 5)  # 重新计算维度# print(new_data.shape)# 直接交换两个维度的值new_data = torch.transpose(data, 0, 1) # 只是将这两个位置进行交换。0表示第0个维度,1表示第1个维度print(new_data.shape)# 缺点:transpose 一次只能交换两个维度# 把数据的形状变成 (4, 5, 3)# 进行第一次交换:(4, 3, 5)# 进行第二次交换:(4, 5, 3)new_data = torch.transpose(data, 0, 1)new_data = torch.transpose(new_data, 1, 2)print(new_data.shape)# permute 函数
def test02():torch.manual_seed(0)data = torch.randint(0, 10, [3, 4, 5])# permute 函数可以一次性交换多个维度new_data = torch.permute(data, [1, 2, 0])print(new_data.shape)if __name__ == "__main__":test02() 

view 和 contigous 函数的用法

view 函数可以用于修改张量的形状,但是其用法比较局限,只能用于存储在整块内存中的张量。

在 PyTorch 中,有些张量是由不同的数据块组成的,它们并没有存储在整块的内存中,view 函数无法对这样的张量进行变形处理。
例如:一个张量经过了 transpose 或者 permute 函数的处理之后,就无法使用 view 函数进行形状操作。

import torch 
import numpy as np # view 函数的使用
def test01():data = torch.tensor([[10, 20, 30], [40, 50, 60]])data = data.view(3, 2)print(data.shape)# 通过 is_contigous 函数来判断张量是否是连续内存空间 (整块的内存)print(data.is_contiguous())# view 函数使用注意
def test02():# 当张量经过 transpose 或者 permute 函数之后,内存空间基本不连续# 此时,必须先把空间连续,才能使用 view 函数进行张量形状操作data = torch.tensor([[10, 20, 30], [40, 50, 60]])data = torch.transpose(data, 0, 1)print(data.is_contiguous())# data = data.view(2, 3)  # 这是报错的data = data.contiguous().view(2, 3)print(data)if __name__ == "__main__":test02() 

squeeze 和 unsqueeze 函数的用法

squeeze 函数用删除 shape 为 1 的维度。

unsqueeze 在每个维度添加1,以增加数据的形状。

import torch 
import numpy as np # squeeze 函数使用
def test01():data = torch.randint(0, 10, [1, 3, 1, 5])print(data.shape)# 维度压缩,默认去掉所有的1的维度new_data = data.squeeze()print(new_data.shape)# 指定去掉某个1的维度new_data = data.squeeze(2)print(new_data.shape)# unsqueeze 函数使用
def test02():data = torch.randint(0, 10, [3, 5])print(data.shape)new_data = data.unsqueeze(0)print(new_data)if __name__ == "__main__":test01() 

总结

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

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

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

相关文章

大模型实践:图文解锁Ollama在个人笔记本上部署llm

使用在线模型服务时,我们常常需要支付API调用费用,这对于个人开发者或小型组织来说可能是一笔不小的开支。那么,有没有方法可以在本地免费使用这些强大的模型呢?答案是肯定的——Ollama就是这样一个工具。 当然如果是比较大的组织…

Python基本语法(lambda表达式)

lambda表达式 lambda的一般形式是在关键字lambda后面跟一个或多个参数,之后再紧跟一个 冒号,接下来是一个表达式。lambda是一个表达式,而不是一个语句,它能够出现 在Python语法不允许def出现的地方。作为表达式,lambd…

【MySQL数据库】用户管理

目录 1,用户信息 2,创建/删除/修改用户 3,数据库的权限 MySQL数据库安装完之后,我们最开始时使用的都是 root 用户,其它用户通常无法进行操作。因此,MySQL数据库需要对用户进行管理。 1,用户…

Python的ArcPy基于Excel表格对大量遥感影像批量重分类

本文介绍基于Python中的ArcPy模块,以Excel表格内的信息,对遥感影像加以重分类的方法。 首先,明确一下本文的需求。现有按照文章ArcPy批量将栅格文件的属性表导出为Excel表格的方法(https://blog.csdn.net/zhebushibiaoshifu/artic…

LabVIEW 中VI Server导出 VI 配置

该 LabVIEW VI 展示了在 VI Server 中配置和执行 Exported VIs 的过程,实现对服务器端导出 VI 的远程调用与操作。 ​ 具体过程及模块说明 前期配置:需确保在 LabVIEW 的 “Tools> Options > VI Server > Protocols” 路径下,启用 …

论文阅读:2024 ACM SIGSAC Membership inference attacks against in-context learning

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Membership inference attacks against in-context learning https://arxiv.org/pdf/2409.01380 https://www.doubao.com/chat/4030440311895554 速览 这篇论文主要研究了…

从 Python 基础到 Django 实战 —— 数据类型驱动的 Web 开发之旅

主题简介: 本主题以 Python 基础数据类型为核心,结合 Django 框架的开发流程,系统讲解如何通过掌握数字、字符串、列表、元组、字典等基础类型,快速构建功能完善的 Web 应用。通过理论与实践结合,帮助学员从零基础 Py…

软考 系统架构设计师系列知识点之杂项集萃(53)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(52) 第85题 在静态测试中,主要是对程序代码进行静态分析。“数据初始化、赋值或引用过程中的异常”属于静态分析中的()。 A. 控制流分析 B. 数据…

Raycaster光线投射

Raycaster光线投射 3D虚拟工厂在线体验 描述 光线投射Raycaster,用于进行raycasting(光线投射)。 光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体)。 构造器 Raycaster( origin : Vector3, dire…

初识Linux —— git三板斧

版本控制器git 为了我们方便管理不同版本的文件,就有了版本控制器; 所谓的版本控制器,就是能够了解到一个文件的历史记录(修改记录);简单来说就是记录每一次的改动和版本迭代的一个管理系统,同…

用哈希表封装出unordered_set/_map

前提: ①:本博客是对哈希表(开散列)进行封装,因为闭散列不优秀(与库保持一致) ②:哈希表封装出unordered_set/_map和红黑树封装出ste/map是大同小异的,可以先看下:用红黑树封装出set和map -CSDN博客 ③&…

情绪ABC——AI与思维模型【93】

一、定义 情绪ABC思维模型是一种心理学上的理论,它认为人们的情绪和行为反应(C,Consequence)并非直接由激发事件(A,Activating event)引起,而是由个体对激发事件的认知和评价所产生…

Unity URP RenderTexture优化(二):深度图优化

目录 前言: 一、定位深度信息 1.1:k_DepthStencilFormat 1.2:k_DepthBufferBits 1.3:_CameraDepthTexture精度与大小 1.4:_CameraDepthAttachment数量 二、全代码 前言: 在上一篇文章:Un…

【力扣刷题记录】hot100错题本(一)

1. 简单题 我的答案:时间复杂度过高:O(N^3) class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for num in nums:if (target - num) in nums:#多余for i in range(len(nums)):if nums[i] num :for j in range(i1,len(nu…

线程池的线程数配置策略

目录 1. CPU密集型任务 2. IO密集型任务 3. 混合型任务 1. CPU密集型任务 特点:任务主要消耗CPU资源(如计算、加密、压缩)。 推荐线程数: 线程数 ≈ 物理核心数 1 / CPU - 1(不知道哪个√) 例如&#…

基于开源链动2+1模式AI智能名片S2B2C商城小程序的爆品力构建研究

摘要:在兴趣电商生态中,爆品力已成为品牌实现指数级增长的核心竞争力。本文以开源链动21模式AI智能名片S2B2C商城小程序为技术载体,结合抖音平台的内容传播特性,提出“需求挖掘-技术赋能-内容转化”三位一体的爆品力构建模型。通过…

photoshop学习笔记2

第一章 第01节-界面的重要性(学习方法) 第02节-文件的打开新建及储存 第03节-移动工具(图层概念) 学习目标: 1.了解图层概念 2.认识工具属性 3.掌握工具使用 图层的概念 移动工具 移动工具就是用来移动图层内容的。是否可以用来移动组…

operator 可以根据需要重载 == 运算符进行比较

要将 vector<AppInfo> 类型的 A 和 B 两个容器进行比较&#xff0c;并且当 B 中有 A 中没有的元素时&#xff0c;插入到数据库中&#xff0c;你可以通过以下步骤实现&#xff1a; 比较元素&#xff1a;遍历 vector<B>&#xff0c;检查每个元素是否在 vector<A&…

Three.js在vue中的使用(二)-加载、控制

在 Vue 中使用 Three.js 加载模型、控制视角、添加点击事件是构建 3D 场景的常见需求。下面是一个完整的示例&#xff0c;演示如何在 Vue 单文件组件中实现以下功能&#xff1a; 使用 GLTFLoader 加载 .glb/.gltf 模型添加 OrbitControls 控制视角&#xff08;旋转、缩放、平移…