Pytorch使用教学5-视图view与reshape的区别

在这里插入图片描述

有同学后台留言问为什么view有时可对张量进行形变操作,有时就会报错?另外它和reshape功能好像一致,有什么区别呢?本文就带你了解PyTorch中视图的概念。

PyTorch中对张量进行形变操作时,很多同学也会使用view方法,但是经过一系列变化后,你可能会发现你的张量错乱了,而且不能继续形变。或者你可能都不知道你的张量发生了变化,一直在处理错误数据…

tensor.view方法

该方法可以改变张量结构,生成一个不同结构但共享一个存储空间的张量。也就代表view是浅拷贝的关系,修改其中一个张量,另一个张量也会同步进行更改。

# 生成一个2行3列的矩阵
t = torch.arange(6).reshape(2, 3)
t
# tensor([[0, 1, 2],
#        [3, 4, 5]])# 将t.view(3, 2)的结果赋值给te
te = t.view(3, 2)
te
# tensor([[0, 1],
#         [2, 3],
#         [4, 5]])

这时我们对张量t进行修改,然后我们打印te,会发现te中的值也发生了变化:

# 对t的0号索引位置进行修改1
t[0] = 1# 打印te,同步变化
te
# tensor([[1, 1],
#         [1, 3],
#         [4, 5]])

tensor.view方法会返回一个“视图”的结果,该结果和原张量对象共享一块数据存储空间,而不会生成一个新的对象,大家在使用时要格外注意。若想生成新的对象,建议使用深拷贝clone方法。

视图是什么?

视图是数据的一个别称或引用(它们物理内存在同一位置),通过该别称或引用便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它可以改变原始数据,这样就避免了重新创建张量的高内存开销。

与之对应的概念就是副本。副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,因为它们的物理内存不在同一位置。

viewreshape的区别

它们功能看似一样,那么两者都存在的意义是什么呢?先给出结论:

  • view:只适用于满足连续性条件的Tensor,并且该操作不会开辟新的内存空间,只是原数据的别称或引用,返回值是视图。
  • reshape:当Tensor满足连续性时,与view方法相同,返回的是视图;当Tensor不满足连续性时,返回的是副本。

这里的关键词就是连续性。我们使用代码进行说明:

a = torch.arange(6).reshape(2, 3) 
print(a.shape)
# torch.Size([2, 3])# is_contiguous()判断是否连续
print(a.is_contiguous())
# True

可以看出,在利用torch.arange函数进行Tensor创建时,获取的Tensor元素地址是连续内存空间保存的。如果对的Tensor进行转置操作:

b = a.permute(1, 0)
print(b.shape)
# torch.Size([3, 2])print(b.is_contiguous())
# False

我们发现经过转置以后,Tensor会变成非连续保存类型uncontiguous。那么,变成非连续保存类型后,就不能使用view对它进行形变操作,否则就会报错:

b.view(2, 3)
# RuntimeError

但这时我们可以使用reshape对其进行形变,并且会新开建一块地址进行储存:

c = b.reshape(2, 3)
c
# tensor([[0, 3, 1],
#         [4, 2, 5]])# 改变原始张量a的数据
a[0][1] = 222
a
# tensor([[  0, 222,   2],
#         [  3,   4,   5]])# 此时c不会改变
c = b.reshape(2, 3)
c
# tensor([[0, 3, 1],
#         [4, 2, 5]])# 但是b的数据会变,因为b和a还共有同一储存地址
b
# tensor([[  0,   3],
#         [222,   4],
#         [  2,   5]])

是不是很神奇?其实view可以做的,reshape都可以做。reshape相当于先开辟了一个新地址,这个地址储存了和之前数据一样的连续性数据,再进行了view操作,就是使用contiguous方法:

# 先开辟一个新地址将数据复制,再进行view操作:
b.contiguous().view(2, 3)
b
# tensor([[0, 3, 1],
#         [4, 2, 5]])

reshape方法的内部执行过程:

  • 如果张量是满足连续,那么它就直接调用view方法
  • 如果张量不连续,就先调用contiguous方法进行拷贝,再使用view方法进行转换

view的存在可以明确表示对张量的操作只能是视图操作而非拷贝操作。这对于代码的可读性以及后续可能的bug查找比较友好。

而如果您一定要对张量进行形变,建议直接使用reshape

这就是reshapeview的区别,还需同学们多多梳理理解,在实际使用时避坑。

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-张量操作方法大总结

在这里插入图片描述

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

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

相关文章

4.6 replicaset controller

想系统学习k8s源码,云原生的可以加:mkjnnm 介绍 简介 replicaset controller是kube-controller-manager组件中众多控制器中的一个,是 replicaset 资源对象的控制器,其通过对replicaset、pod 2种资源的监听,当这2种资…

ueditor跨域问题解决

ueditor解决跨域问题 问题:1.在引用vue-ueditor-wrap后,上传图片和附件出现跨域问题,前端引用了webpack去解决跨域问题,但仍然存在跨域问题? ueditor是百度的富文本,功能较多但资料不够全,因为…

STM32——GPIO(点亮LEDLED闪烁)

一、什么是GPIO? GPIO(通用输入输出接口): 1.GPIO 功能概述 GPIO 是通用输入/输出(General Purpose I/O)的简称,既能当输入口使用,又能当输出口使用。端口,就是元器件…

【C++高阶】哈希之美:探索位图与布隆过滤器的应用之旅

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:模拟实现unordered 的奥秘 🌹🌹期待您的关注 🌹🌹 ❀哈希应用 &#x1f4…

使用flutter做仪表盘(桌面端)

前言 最近收到一个需求,需要使用flutter 来做一个仪表盘,这可难倒我了,毕竟我是做前端的,flutter 之前接触的也少,但没办法,既然需求有了,也得硬着头皮上了,先来看看做的效果。 一…

Java语言程序设计基础篇_编程练习题*15.32(控制时钟)

*15.32(控制时钟) 修改程序淸单14-21,在类中加入动画。添加两个方法 start() 和 stop() 以启动和停止时钟。编写一个程序,让用户使用 Start 和 Stop 按钮来控制时钟,如图15-36a所示 代码示例:编程练习题15_32ClockPane.java pack…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞,编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码,从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

blender顶点乱飞的问题解决

初学blender,编辑模式下移动某些顶点,不管是移动还是滑动都会出现定点乱飞的问题,后来才发现是开了吸附工具的原因!!!! 像下面这样,其实我只是在Z轴上移动,但是就跑的很…

AvaloniaUI的学习

相关网站 github:https://github.com/AvaloniaUI/Avalonia 官方中文文档:https://docs.avaloniaui.net/zh-Hans/docs/welcome IDE选择 VS2022VSCodeRider 以上三种我都尝试过,体验Rider最好。VS2022的提示功能不好,VSCode太慢&#xff0c…

调度器——DolphinScheduler讲解及安装教程

调度器——DolphinScheduler讲解及安装教程 一:基本讲解 Dolphin Scheduler 1、开源的分布式任务调度系统 2、支持多种任务类型,包括Shell、Spark、Hive等 3、灵活的任务调度功能和友好的Web界面,方便管理和监控任务的执行情况 架构 操作系…

必备神器!三款优秀远程控制电脑软件推荐

嘿,各位职场小伙伴们,今儿个咱们来聊聊个挺实用又带点“科技范儿”的话题——电脑远程控制那点事儿。作为刚踏入职场不久的新人,我深刻体会到,在这信息爆炸的时代,掌握几招远程操作的技能,简直就是给自个儿…

一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储

在高性能计算场景中,往往采用全闪存架构和内核态并行文件系统,以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加,全闪存的高成本和内核客户端的运维复杂性成为主要挑战。 JuiceFS,是一款全用户态的云原生分布式文件…

GPU虚拟化和池化技术解读

GPU虚拟化到池化技术深度分析 在大型模型的推动下,GPU算力的需求日益增长。然而,企业常常受限于有限的GPU卡资源,即使采用虚拟化技术,也难以充分利用或持续使用这些资源。为解决GPU算力资源的不均衡问题,同时推动国产…

Spring源码学习笔记之@Async源码

文章目录 一、简介二、异步任务Async的使用方法2.1、第一步、配置类上加EnableAsync注解2.2、第二步、自定义线程池2.2.1、方法一、不配置自定义线程池使用默认线程池2.2.2、方法二、使用AsyncConfigurer指定线程池2.2.3、方法三、使用自定义的线程池Excutor2.2.4、方法四、使用…

《500 Lines or Less》(5)异步爬虫

https://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html ——A. Jesse Jiryu Davis and Guido van Rossum 介绍 网络程序消耗的不是计算资源,而是打开许多缓慢的连接,解决此问题的现代方法是异步IO。 本章介绍一个简单的网络爬虫&a…

【Linux】玩转操作系统,深入刨析进程状态与调度机制

目录 1. 进程排队2. 进程状态的表述2.1. 进程状态2.2 运行状态2.3. 阻塞状态2.4. 挂起状态 3. Linux下具体的进程状态3.1. 运行状态R3.2. 可中断睡眠状态S3.3. 不可中断睡眠状态D3.4. 停止状态T3.5. 死亡状态X3.6. 僵尸状态Z 4. 孤儿进程5. 优先级6. Linux的调度与切换6.1. 四个…

单链表的实现和操作

目录 一.前言 二.单链表的定义和结构 三. 单链表的操作 一.前言 线性表的链式表示又称为非顺序映像或链式映像。简而言之,链表可以理解为由指针链连接的n个结点组成的。其中每一个结点包括数据域和指针域。值得注意的是,与顺序表不同,链表中…

手写spring简易版本,让你更好理解spring源码

首先我们要模拟spring,先搞配置文件,并配置bean 创建我们需要的类,beandefito,这个类是用来装解析后的bean,主要三个字段,id,class,scop,对应xml配置的属性 package org…

安科瑞邀您走进2024北京电气设计第44届年会

2024年7月11日,2024建筑电气高峰论坛暨北京电气设计第44届年会在京如期而至,各路精英齐聚一堂,围绕智慧建筑、数据中心、工业厂房配电、储能技术等热点问题展开讨论。安科瑞携企业微电网智慧能源的一站式服务解决方案亮相盛会,尽享…