Pytorch基础:Tensor的view方法(非连续张量也可以使用view)

相关阅读

Pytorch基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12457644.html?spm=1001.2014.3001.5482


        在Pytorch中,view是Tensor的一个重要方法,用于返回一个改变了形状,但数据和数据的顺序与原来一致的新张量,但是新张量需要与原张量共用底层存储(称为视图)。

Tensor.view(*shape) → Tensor

        view方法的语法如下所示: 

Tensor.view(*shape) → Tensorshape (torch.Size or int...) – the desired size

        view的基本用法,与reshape相同,所以可以参考下面的博文。

Pytorch基础:Tensor的reshape方法icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/article/details/133445832?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22133445832%22%2C%22source%22%3A%22weixin_45791458%22%7D        本文的重点旨在阐明一个被很多人(九成以上)误解的细节:View方法也可以对非连续张量使用!

        首先简单介绍连续张量的定义并给出一些简单的例子:

1、如果简单来说,一个连续张量就是,张量底层的数据线性存储顺序和张量数据的遍历顺序一致,此处的遍历顺序是指先遍历列,再遍历行(如有更多的维度,以此类推)。

2、如果用严格的定义,连续张量的各个维度大小和步长需要满足:对于一个有n+1维的张量(维度索引从0到n),任何的i属于0到n-1满足stride[i]=stride[i+1]×size[i+1],其中size[i]指的是第i维的大小,stride[i]指的是第i维的步长(其实就是从第i维的数据,存储时跨越的数据数)。其中stride[n]必须是1,即最后一个维度的数据必须是相邻存储的。

import torch
a=torch.rand(2,3)
print(a)
print(list(a.size())) 
print(a.stride())
print(a.is_contiguous())输出:
tensor([[0.4409, 0.5075, 0.8291],[0.9381, 0.6066, 0.5888]])
[2, 3]
(3, 1)
True

        a张量的线性存储顺序为0.4409, 0.5075, 0.8291 0.9381, 0.6066, 0.5888,因此a张量第0维的步长为3,即0.4409, 0.5075, 0.8291分别与0.9381, 0.6066, 0.5888间隔的数据数,且满足stride[0]=stride[1]×size[1],因此a是一个连续张量,可以使用.is_contiguous()方法鉴别。

import torch
a=torch.rand(2,3)
b=a.t()
print(b)
print(list(b.size()))
print(b.stride())
print(b.is_contiguous())输出:
tensor([[0.4409, 0.9381],[0.5075, 0.6066],[0.8291, 0.5888]])
[3, 2]
(1, 3)
False

        b张量为a张量转置后的结果,它与a共享底层的线性存储,因此b张量第0维的步长为1,即0.4409, 0.9381分别到0.5075, 0.6066分别到0.8291, 0.5888的间隔的数据数,不满足步长和维度大小的要求,因此是一个非连续张量。

        View常常被错误地认为只能对连续张量使用,因为非连续张量使用view方法时,有时会报错,例如对于上面的张量b。

import torch
a=torch.rand(2,3)
b=a.t()
print(b.is_contiguous())
c=b.view(1,6)输出:
False
Traceback (most recent call last):File "/home/zhangchen/Vit(quant)/test.py", line 8, in <module>c=b.view(1,6)
RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.

        但这并不能说明,所有的非连续张量都无法使用view方法,下面时Pytorch官网对于view方法的解释:

torch.Tensor.view — PyTorch 2.4 documentation

        可以看出,view方法对变换后维度有要求,满足其一即可:

1、新的维度是原维度的子空间。

2、新的维度跨越了原来满足张量连续性条件的那些维度。

        其中就是第二点,造成了很多人误以为只有连续性张量才能使用view,因为一个连续性张量一定满足该条件。

        但是第一点却常被人忽视,什么叫新的维度是原维度的子空间呢?其实这是一个类似于因式分解的概念,下面举例说明。

import torch
a=torch.rand(4,6)
b=a.t()
print(list(b.shape))
print(b.is_contiguous())
c=b.view(2,3,2,2)
print(list(c.shape))输出:
[6, 4]
False
[2, 3, 2, 2]

        其中,非连续张量b的形状是(4,6),而它成功使用了view方法,张量c的形状是(2, 3, 2, 2),这实际上就是张量c的四个维度满足了第二个条件,此时四个新的维度,都是张量b两个维度的子空间,即原来的第0个维度大小4被分解为张量c的第0个维度大小2和第1个维度大小3;原来的第1个维度大小6被分解为张量c的第2个维度大小2和第3个维度大小2。

         甚至可以两种条件互补满足,即某些维度满足连续性条件,某些维度满足子空间条件,见下例子。

import torch
a=torch.rand(3,4,8,6)
b=a.permute(0,1,3,2)
print(list(b.shape))
print(b.stride())
print(b.is_contiguous())
c=b.view(2,6,3,2,4,2)
print(list(c.shape))输出:
[3, 4, 6, 8]
(192, 48, 1, 6)
False
[2, 6, 3, 2, 4, 2]

        其中,c张量的第2维大小3和第3维大小2来自于b张量的第3维的分解,c张量的第4维大小4和第5维大小2来自于b张量的第4维的分解。而张量的前两维来自b张量的第0维和第1维,因此b张量的前两维需要满足张量连续性条件,可以看出192=4*48即满足stride[0]=stride[1]×size[1],因此可以成功使用View方法。

        在子空间分解的时候,原张量的各个维度的分解,是有顺序的,比如对于b张量的最后一维大小维8,c张量的第3维的2和第4维的4并不是它分解的子空间,因为此时c张量前三维的乘积结果是2*6*3不等于b张量前三维乘积的结果3*4*6,而c张量前四维的乘积结果是2*6*3*2等于b张量前三维乘积的结果3*4*6。从前向后分析和从后向前分析都是一样的,因为一旦一个维度之前的维度乘积确认相等了,该维度之后的维度也相等(因为数据个数不变)。

        在某种特殊情况下,view方法的原张量确实必须是连续性张量,比如将张量展平,此时由于不可能满足子空间分解的条件,要求原张量的所有维满足连续性条件,因此原张量只能是一个连续性张量。

import torch
a=torch.rand(3,4,8,6)
b=a.permute(0,1,3,2)
print(list(b.shape))
print(b.stride())
print(b.is_contiguous())
c=b.view(-1)  输出:
[3, 4, 6, 8]
(192, 48, 1, 6)
False
Traceback (most recent call last):File "/home/zhangchen/Vit(quant)/test.py", line 7, in <module>c=b.view(-1)  #
RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.

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

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

相关文章

VSCode 解决 pylint 报错 No name QWidget in module PyQt5.QtWidgets

问题 启用了 VSCode 的 Pylint 插件, 即便 Python 环境中安装了 PyQt5, 也无法正确解析 PyQt5 的导入 PyQt5 底层代码是用 C/C 写的, pylint 默认不会深入解析 pylint doesn’t load any C extensions by default, because those can run arbitrary code. 解决 修改 Settings…

Spark实时(六):Output Sinks案例演示

文章目录 Output Sinks案例演示 一、​​​​​​​File sink 二、​​​​​​​​​​​​​​Memory Sink 三、​​​​​​​​​​​​​​Foreach Sink 1、​​​​​​​foreachBatch 2、​​​​​​​​​​​​​​foreach Output Sinks案例演示 当我们对流式…

kotlin协程-- 基础概念 ①|创建和使用

引言 首先先说一些相关概念 1.并发与并行 在操作系统中我们曾经学到过并发与并行 并发: 是同一个时刻只有一条指令在执行,其他指令没有再执行,但是由于CPU的时间片特别短,导致多个指令来回切换的时间间隔特别短,就好像是同一时间多条指令在执行。单核CPU与多核CPU都可以进…

【python】Python常见的面试题解析:深入探索与实践,助你少走弯路

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

若依ruoyi+AI项目二次开发(智能售货机运营管理系统)

(一) 帝可得 - 产品原型 - 腾讯 CoDesign (qq.com)

一些电脑的操作技巧,你知道吗?

我整理了几个电脑使用的实用技巧&#xff0c;能够帮你提升办公效率&#xff0c;一起来看看吧&#xff01; 技巧一&#xff1a;反方向移动单元格 一般来讲&#xff0c;我们按下【Tab】键、【Enter】键的时候&#xff0c;会切换到右边或者下边的单元格&#xff0c;想要反向移动…

第2章 编译SDK

安装编译依赖 sudo apt-get update sudo apt-get install clang-format astyle libncurses5-dev build-essential python-configparser sconssudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \ expect g patchelf chrpath gawk texinfo chrpath diffstat …

董宇辉离职,我一点都不意外!只不过感觉来的太快

下面这张图&#xff0c;是我在半年多前写的一段随笔&#xff0c;没想到来的这么快&#xff01; 碰巧的是今天中午&#xff0c;在开发者群里有两位老铁自曝&#xff0c;本以为能公司干到老&#xff0c;但公司却不给机会&#xff0c;已经不在是公司员工了。 最近&#xff0c;晓衡…

粗解React 和 Vue 的异同

相同点&#xff1a; 1、都使用虚拟 DOM【Virtural DOM】 Vue与React都使用了 Virtual DOM Diff算法&#xff0c; 不管是Vue的Template模板options api 写法&#xff0c; 还是React的Class或者Function写法,最后都是生成render函数&#xff0c;而render函数执行返回VNode(虚拟…

iOS collectionView 滑动出现空白

iOS collectionView 滑动出现空白 一个很常见的 banner 轮播&#xff0c;滑动的时候&#xff0c;有时候会出现空白&#xff0c;检查了下&#xff0c;发现代码没什么问题&#xff0c;上网查了也没啥结果&#xff0c;最后的解决方法是自定义layout解决 interface TMLoopViewLayo…

创新概念:柯尔莫哥洛夫-阿诺德网络

文章目录 一、说明二、基础概念三、kolmogorov-Arnold 网络性质3.1 KAN 的潜在优势3.2 挑战和注意事项 四、基本 KAN 超参数五、COLAB 代码六、注意点 一、说明 kolmogorov-Arnold 网络 (KAN) 是深度学习领域的一项“创新”&#xff0c;它提供了一种受现有 Kolmogorov-Arnold …

python基础---1.变量、运算符和表达式、基本数据结构

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&…

使用Docker搭建MySql的主从同步+ShardingSphere搭建Mysql的读写分离

参考课程 尚硅谷ShardingSphere5实战教程&#xff08;快速入门掌握核心&#xff09;_哔哩哔哩_bilibili 主服务器 创建容器 docker run -d \ -p 3306:3306 \ -v /kira/mysql/master/conf:/etc/mysql/conf.d \ -v /kira/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT…

(day26)leecode热题——找到字符串中所有字母异位词

描述 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s "cbaebabacd", p …

【Git-驯化】一文搞懂git中代码冲突的解决方案大全

【Git-驯化】一文搞懂git中代码冲突的解决方案大全 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a…

[C++实战]日期类的实现

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

ELK安装(Elasticsearch+Logstash+Kibana+Filebeat)

一、简介 1.1、软件简介 ELK其实是Elasticsearch&#xff0c;Logstash 和 Kibana三个产品的首字母缩写&#xff0c;这三款都是开源产品。 1.1.1、Elasticsearch简介 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析…

springboot微信老人健康与饮食管理系统-计算机毕业设计源码82939

基于微信老人健康与饮食管理系统的小程序 摘 要 基于Spring Boot的微信老人健康与饮食管理系统的小程序致力于为老年人提供便捷的健康管理和饮食指导服务。该小程序整合了健康资讯浏览、食谱推荐、健康评估等功能模块&#xff0c;通过系统的设计与实现&#xff0c;旨在帮助老年…

古丝绸之路传闻二:十年败壳精灵显,一介穷神富贵来

古丝绸之路传闻二&#xff1a;十年败壳精灵显&#xff0c;一介穷神富贵来 &#xff08;接上节&#xff1a;古丝绸之路传闻&#xff1a;分内功名匣里财&#xff0c;不关聪慧不关呆&#xff09; 先别说闲话。且说众人带着经纪主人到船上发货&#xff0c;文若虚把之前的事情说了一…

AccessLog| 一款开源的日志分析系统

前言 ClkLog作为分析系列产品中的前端数据分析系统&#xff0c;通过采集前端应用数据进行用户行为分析。其社区版从23年9月发布至今已有近一年&#xff0c;商业版也上线快半年&#xff0c;感谢大家一直以来的关注和支持&#xff0c;ClkLog会继续做好产品升级与服务&#xff0c;…