Pytorch基础 - 6. torch.reshape() 和 torch.view()

news2024/11/29 12:35:00

目录

1. torch.reshape(shape) 和 torch.view(shape)函数用法

2. 当处理的tensor是连续性的(contiguous)

3. 当处理的tensor是非连续性的(contiguous)

4. PyTorch中的contiguous


在本文开始之前,需要了解最基础的Tensor存储方式,具体见 Tensor数据类型与存储结构

注:如果不想继续往下看,就无脑使用reshape()函数来进行tensor处理!!

1. torch.reshape(shape) 和 torch.view(shape)函数用法

torch.reshape() 和 torch.view()不会修改tensor内部的值,只是对tensor的形状进行变化,里面只包含了shape的参数,shape为当前tensor改变后的形状

示例:将x改变成shape为[2,3] 和 [3,2]的方式,reshape和view均可 

x = torch.tensor([1, 2, 3, 4, 5, 6])
y1 = x.reshape(2, 3)
y2 = x.view(3, 2)
print(y1.shape, y2.shape)   # torch.Size([2, 3]) torch.Size([3, 2])

2. 当处理的tensor是连续性的(contiguous)

当tensor是连续的,torch.reshape() 和 torch.view()这两个函数的处理过程也是相同的,即两者均不会开辟新的内存空间,也不会产生数据的副本,只是新建了一份tensor的头信息区,并在头信息区中指定重新指定某些信息,如stride , 并没有修改这个tensor的存储区 Storage

示例:尽管y1和y2的stride不同,但他们的storage()是相同的

x = torch.tensor([1, 2, 3, 4, 5, 6])
y1 = x.reshape(2, 3)
y2 = x.view(3, 2)
print(y1.stride(), y2.stride())   # (3, 1) (2, 1)
print(y1.storage().data_ptr() == y2.storage().data_ptr())   # True

3. 当处理的tensor是非连续性的(contiguous)

view():在调用view()函数之前需要先调用 contiguous()方法,即x.contiguous().view()。但这种方法变换后的tensor就不是与原始tensor共享内存了,而是重新开辟了一个空间

reshape():仅需要直接调用reshape()函数即可,返回结果等同于 contiguous().view()

示例:通过transpose将x变成了 uncontiguous,然后使用contiguous().view()和reshape()均会重新开辟一个新空间,不与原始tensor共享内存了。

x = torch.tensor([1, 2, 3, 4, 5, 6]).reshape(2, 3).transpose(0, 1)
print(x.is_contiguous())    # False
print(x.storage().data_ptr())   # 1690151067136
y1 = x.contiguous().view(2, 3)
print(y1.storage().data_ptr())  # 1690151068544
y2 = x.reshape(2, 3)
print(y2.storage().data_ptr())  # 1690151076736

4. PyTorch中的contiguous

上面说了这么多,什么情况下是连续的,什么时候不连续呢?很简单,在PyTorch中定义了:(不)连续:Tensor底层一维数组元素的存储顺序与Tensor按行优先一维展开的元素顺序是否一致

比如:可以通过storage()查看底层一维数组的存储顺序,通过is_contiguous()判断是否连续

x = torch.tensor([1, 2, 3, 4, 5, 6]).reshape(2, 3)
print(x.storage())  #  1 2 3 4 5 6
print(x.is_contiguous())    # True
xt = x.transpose(0, 1)
print(xt.storage()) # 转置后,底层存储仍为 1 2 3 4 5 6
print(xt.is_contiguous())    # False

x按行展开后与x.stoage()相同,而xt按行展开后与stoage()不同,所以x是连续的,xt是不连续的。那我们继续实验,将xt再次进行转置,变成 xtt,xtt与原始x相同,所以变为连续

x = torch.tensor([1, 2, 3, 4, 5, 6]).reshape(2, 3)
print(x.storage())  #  1 2 3 4 5 6
print(x.is_contiguous())   # True
xtt = x.transpose(0, 1).transpose(0, 1)
print(xtt.storage()) # 转置的转置后,底层存储为 1 2 3 4 5 6,按行展开仍为 1 2 3 4 5 6
print(xtt.is_contiguous())  # True

导致导致不连续的函数常见有:transpose(), permute(), narrow(), expand()等

注:推荐一篇讲contiguous非常好的文章:PyTorch中的contiguous - 知乎

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

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

相关文章

Spring常见面试题汇总

文章目录在Spring中,Bean的作用域有哪几个?SpringMVC的执行流程你知道吗?谈谈你对Spring IOC的理解?DI又是什么?谈谈你对Spring AOP的理解?Spring Bean的生命周期你能说出多少?Spring如何解决循…

sggJava基础第三天

运算符 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 算术运算符 赋值运算符 比较运算符(关系运算符) 逻辑运算符 位运算符(这个几乎不使用,我们在讲解的时候了解一下即可,只不过…

敏捷团队如何在 PingCode 这类敏捷开发工具中管理 Scrum 开发管理流程

在本教程中,我们将在 PingCode 中介绍如何使用 Scrum 项目、创建产品待办列表和规划迭代、举行 Scrum 会议等详细流程。准备工作:已创建 PingCode 软件帐户 【免费注册通道】 什么是Scrum?Scrum 是国内外最热门的敏捷开发框架之一。Scrum 通…

【SpringBoot2】SpringBoot基础篇

SpringBoot基础篇 JC-1.快速上手SpringBoot ​ 学习任意一项技术,首先要知道这个技术的作用是什么,不然学完以后,你都不知道什么时候使用这个技术,也就是技术对应的应用场景。SpringBoot技术由Pivotal团队研发制作,功…

第三章 word2vec

目录3.1 基于推理的方法和神经网络3.1.1 基于计数的方法的问题3.1.2 基于推理的方法的概要3.1.3 神经网络中单词的处理方法3.2 简单的 word2vec3.2.1 CBOW模型的推理3.2.2 CBOW模型的学习3.2.3 word2vec的权重和分布式表示3.3 学习数据的准备3.3.1 上下文和目标词3.3.2 转化为o…

loki采集k8s日志

前言 loki 是轻量、易用的日志聚合系统。如果你的k8s集群规模并不大,推荐使用grafanaloki的方案来做微服务日志的采集; Loki组成 loki架构很简单,主要由3部分组成: loki:服务端,负责存储日志和处理查询&…

行程器,数显卡尺液晶驱动IC,VK1623段码LCD驱动芯片资料分享,封装LQFP100,QFP100,RAM映射48EGx8COM

永嘉微电/VINKA 型号:VK1623 封装形式:LQFP100/QFP100/DICE/COG KPP2609 概述 VK1623S是一个点阵式存储映射的LCD驱动器,可支持最大384点(48EGx8COM)的LCD屏。单片机可通过3/4线串行接口配置显示参数和发送显示数据…

Spring Cloud微服务网关Zuul的注解@EnableZuulProxy或@EnableZuulServer做了什么事情

一、Zuul的工作原理 Zuul 1.x的版本是由Servlet以及一系列的Filter组成的,各个组件之间协同合作完成功能,且易于扩展。参看官方的架构图我画了张图: Zuul声明周期: HTTP Request -> DispatcherServlet -> ZuulHandlerMappi…

动力节点老杜Vue3视频笔记——Vue程序初体验

目录 一、Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 一、Vue程序初体验 可以先不去了解Vue框架的发展历史、Vue框架有什么特点、Vue是谁开发的,对我们编写Vue程序起不到太大的作用,…

代码随想录_二叉树_leetcode654 617

leetcode654 最大二叉树 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 …

octave安装使用——吴恩达机器学习

下载octave 解压后双击octave.vbs进行安装 配置 pkg rebuildpkg list 使用基础命令 使用矩阵命令 移动数据 size:矩阵的行和列length:行和列的最大值 读取和存储数据 load:加载文件who:所有变量whos:更详细的变量…

界面开发框架Qt - 组合小部件映射器示例

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 Combo Widget Mappe…

人工智能实验二:约束满足问题

一、实验目的 求解约束满足问题;使用回溯搜索算法求解八皇后问题。 二、实验平台 课程实训平台https://www.educoder.net/paths/369 三、实验内容及步骤 实训内容:2-4 第六章 约束满足问题 1.问题描述 八皇后问题是指在一个 88 的棋盘上摆放八个皇…

Spark运行模式介绍

文章目录1. Local运行模式1.1 基本运行情况介绍1.2 角色划分1.3 Spark 任务提交与解释器对比2. StandAlone运行模式2.1 StandAlone介绍2.2 StandAlone架构2.3 Spark应用架构2.4 StandAlone HA 运行原理3. Spark on YARN3.1 Spark on Yarn 本质3.2 部署模式3.3 两种部署模式运行…

stata变量引用

stata变量引用–潘登同学的stata笔记 文章目录stata变量引用--潘登同学的stata笔记变量生成gen命令通配符:*, ?, -因子变量时间序列变量命名、前缀与标签变量命名、添加前缀通配符与批量重命名变量标签数字-文字对应表CSMAR数据处理查看、查找变量单值、暂元单值暂…

TCP网络连接的书写

TCP网络连接的书写 文章目录TCP网络连接的书写服务器端书写进程sock创建创建bind进行端口绑定(进行bind的初始化)监听socket获取链接用户端创建sock套接字connect进行连接服务器端书写 为TCP是面向连接,所有需要进行对于端口进行监控,另外的UDP的服务器就不需要进行…

洛克菲勒:世界上只有两种人头脑聪明...

洛克菲勒:被人称为“石油大王”、美国第一位十亿富豪与全球首富、创办芝加哥大学。洛克菲勒写给儿子的信共有38封,这些信真实记录了洛克菲勒创造财富神话的种种业绩。从这些信中我们不仅可以看到洛克菲勒优良的品德、卓越的经商才能,还可窥见…

Spring面向切面编程AOP使用介绍

文章目录AOPAOP核心概念AOP快速入门AOP工作流程AOP切入点表达式AOP通知类型AOP通知获取数据AOP总结AOP AOP核心概念 AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构 OOP(Object Oriented Programming)面向对象…

Web自动化测试的详细流程和步骤,一篇足矣

Web自动化测试是软件测试中非常重要的一种测试方法,它通过编写脚本来模拟人工操作网页,从而实现对Web应用程序进行自动化测试的过程。为了保证测试质量和效率,我们需要遵循一定的流程和步骤来完成Web自动化测试。 一、测试环境准备 在进行W…

webp怎么转换成png,4个方法教你快速处理

webp怎么转换成png?目前在一些比较大的图片素材网站下载的图片都是webp格式的。我们都知道webp格式图片,它在正常的图片浏览器中是无法打开的。 所以说我们要把webp图片转变成png格式,正常来说我们常用的图片处理软件也能进行格式转换&#x…