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

news2024/11/19 21:28:53

相关阅读

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) → Tensor

shape (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.coloradmin.cn/o/1955043.html

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

相关文章

夸克Android一面凉经(2024)

夸克Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《夸克Android一面凉经(2024)》。 面试职位: 智能信息-客户端开发工程师-夸克小说 技术一…

20240728 每日AI必读资讯

Google Gemini 聊天机器人更新 可以免费使用Gemini 1.5 Flash 1. 引入Gemini 1.5 Flash模型&#xff1a; • 提供更快和更高质量的响应。 • 提升推理和图像理解能力。 • 上下文窗口扩大到 32Ktokens&#xff0c;允许进行更长的对话和处理更复杂的问题。 • 即将支持通过 Goo…

【你也能从零基础学会网站开发】 SQL结构化查询语言应用基础-- SQL Server数据库开发创建表之FOREIGN KEY外键约束完全详解最详细!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 浅谈FOREIGN K…

故障诊断 | CNN-LSSVM卷积神经网络结合最小二乘支持向量机故障诊断(Matlab)

效果一览 文章概述 故障诊断 | CNN-LSSVM卷积神经网络结合最小二乘支持向量机故障诊断(Matlab) 模型描述 使用CNN进行特征提取: 使用CNN模型对数据进行训练,通常是图像数据。 通过CNN的卷积层和池化层提取图像的特征。 将提取到的特征作为输入,可以是全连接层的输出或者卷…

系统架构师考点--系统架构设计(上)

大家好。今天我来总结一下系统架构设计相关的考点。这块考点是重中之重&#xff0c;每年上午场客观题占20-25分左右&#xff0c;下午案例题也会考到&#xff0c;下午论文也会考到。大家要好好学学这部分内容。 一、软件架构概述 软件架构是指从需求分析到软件设计之间的过渡过…

机器学习 | 分类算法原理——逻辑回归

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的线性可分继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享逻辑回归这一分类算法原理。本章的分类算法原理基于《基于图像大小进行分类》项目&#xff0c;欢迎大家交流学习&#xff01; 目录 一、…

【51CTO-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

vim的使用及退出码(return 0)

linux基础之vim快速入门 linux基础之vim快速入门_基本linux vim-CSDN博客https://blog.csdn.net/ypxcan/article/details/119878137?ops_request_misc&request_id&biz_id102&utm_termvim%E7%BC%96%E8%BE%91%E5%99%A8%E5%A4%8D%E5%88%B6%E7%B2%98%E8%B4%B4%E4%BA%…

达梦数据库激活

SSH登录 192.168.0.148 账号&#xff1a;root 密码&#xff1a;xxx 1.上传 dm.key 文件到安装目录 /bin 目录下 cd /home/dmdba/dmdbms/bin rz -E dm.key2.修改 dm.key 文件权限 chown -R dmdba.dinstall dm.key3.打开数据库工具&#xff0c;新建查询&#xff0c;输入 cd /…

Odoo 17 仪表盘开发指南:打造高效的数据可视化中心

在现代企业管理中,数据驱动的决策至关重要。Odoo 17 提供了强大的平台来构建自定义仪表板, 适用于数据统计、工作台、驾驶舱、数据可视化等场景,以便用户能够一目了然地监控关键指标并做出及时反应。本文将介绍如何在 Odoo 17 中开发一个灵活且高度定制化的仪表盘系统,包括…

CVE-2018-8715

目录 前言影响范围漏洞利用0x04 漏洞修复指纹总结 前言 AppWeb 是一个嵌入式 Web 服务器&#xff0c;基于由 Embedthis Software LLC 开发和维护的开源 GPL 协议。它是用 C/C 编写的&#xff0c;几乎可以在任何现代操作系统上运行。当然&#xff0c;它的作用是为嵌入式设备提供…

【CodinGame】趣味算法(教学用) CLASH OF CODE -20240728

文章目录 正文数字*三角形四舍五入 写在最后END 正文 数字* import sys import math# Auto-generated code below aims at helping you parse # the standard input according to the problem statement.n int(input()) for i in range(n):a, b [int(j) for j in input().sp…

【2024最新】国内6个免费的AI绘画网站,支持Midjourney等绘画模型

一、什么是AI绘画&#xff1f; AI绘画&#xff0c;也称为人工智能绘画或机器生成艺术&#xff0c;是指使用人工智能技术来创作视觉艺术作品的过程。这种技术通常涉及到深度学习模型&#xff0c;尤其是生成对抗网络&#xff08;GANs&#xff09;和变分自编码器&#xff08;VAEs…

CTRL+Y,定位后快速复制

复制后可在EXCEL中进行粘贴。

SVN没有绿色图标解决方法

一.总体方法介绍 如果在使用 SVN&#xff08;Subversion&#xff09;时遇到没有绿色小图标的情况&#xff0c;可能是因为 SVN 客户端&#xff08;如 TortoiseSVN&#xff09;没有正确检测到工作拷贝的状态。以下是一些常见的解决方法&#xff1a; 确认安装 TortoiseSVN&#x…

SAPUI5基础知识18 - 自定义CSS和主题色

1. 背景 在上一篇博客中&#xff0c;我们通过使用SAPUI5提供的CSS类实现元素间距的调整。在本篇博客中&#xff0c;让我们看一下如何实现自定义的CSS样式。 2. 背景知识 2.1 CSS基础语法 CSS&#xff0c;全称为级联样式表&#xff08;Cascading Style Sheets&#xff09;&a…

搭建自己的金融数据源和量化分析平台(三):读取深交所股票列表

深交所的股票信息读取比较简单&#xff1a; 看上图&#xff0c;爬虫读取到下载按钮的链接之后发起请求&#xff0c;得到XLS文件后直接解析就可以了。 这里放出深交所爬虫模块的代码&#xff1a; # -*- coding: utf-8 -*- # 深圳交易所爬虫 import osimport pandas as pd imp…

关于Buffer和Channel的注意事项和细节

1.举例 package org.example.demo;import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.util.RandomAccess;/*** MappedByteBuffer可…