Pytorch:view()、permute()和contiguous()

pytorch contiguous

1 官方中英文doc:

torch.Tensor.contiguous (Python method, in torch.Tensor)
torch.Tensor.is_contiguous (Python method, in torch.Tensor)

1.1 contiguous() → Tensor

Returns a contiguous tensor containing the same data as self tensor. If self tensor is contiguous, this function returns the self tensor.

1.2 contiguous() → Tensor

返回一个内存连续的有相同数据的tensor,如果原tensor内存连续,则返回原tensor;

2 pytorch contiguous的使用

contiguous一般与transpose,permute,view搭配使用:使用transpose或permute进行维度变换后,调用contiguous,然后方可使用view对维度进行变形(如:tensor_var.contiguous().view() ),

示例如下:

x = torch.Tensor(2,3)
y = x.permute(1,0)         # permute:二维tensor的维度变换,此处功能相当于转置transpose
y.view(-1)                 # 报错,view使用前需调用contiguous()函数
y = x.permute(1,0).contiguous()
y.view(-1)                 # 不报错

具体原因有两种说法:

  • 1 transpose、permute等维度变换操作后,tensor在内存中不再是连续存储的,而view操作要求tensor的内存连续存储,所以需要contiguous来返回一个contiguous copy;
  • 2 维度变换后的变量是之前变量的浅拷贝,指向同一区域,即view操作会连带原来的变量一同变形,这是不合法的,所以也会报错;也即contiguous返回了tensor的深拷贝contiguous copy数据;

view()、permute()和contiguous() 具体用法和区别

1. view()

view() 变换维度,把原先tensor中的数据按行优先的顺序排成一维数据,然后按照输入的参数组合成其他维度的tensor。

import torch
a=torch.Tensor([[[1,2,3],[4,5,6]]]) # torch.Size([1, 2, 3])
print(a.view(3,2))                  # torch.Size([3, 2])

输出:

tensor([[1., 2.],[3., 4.],[5., 6.]])

2. permute()

permute() 利用索引将tensor中的维度进行调换
b=a.permute(2,0,1) permute里的参数对应的是张量a的维度索引,利用索引来对内部数据调换。
a.permute(2,0,1):把 a 的最后一个维度放到最前面。

import torch
inputs = torch.Tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print("inputs:", inputs, inputs.shape)

输出:

inputs: tensor([[[ 1.,  2.,  3.],[ 4.,  5.,  6.]],[[ 7.,  8.,  9.],[10., 11., 12.]]]) torch.Size([2, 2, 3])outputs tensor([[[ 1.,  4.],[ 2.,  5.],[ 3.,  6.]],[[ 7., 10.],[ 8., 11.],[ 9., 12.]]]) torch.Size([2, 3, 2])

3. contiguous()

在pytorch中只有很少几个操作是不改变tensor内容本身的,大多数操作不进行数据拷贝和数据的改变,变的是原数据。例如:narrow()、view()、expand()和transpose()等。

例如使用transpose()进行转置操作时,pytorch并不会创建新的、转置后的tensor,而是修改了tensor中的一些属性(也就是原数据),使得此时的offset和stride是与转置tensor相对应的。转置的tensor和原tensor的内存是共享的

举个栗子:

import torchx = torch.randn(3, 2)
y = torch.transpose(x, 0, 1)print("修改前:")
print("x:", x)
print("y:", y)y[0, 0] = 11
print("\n修改后:")
print("x:", x)
print("y:", y)

运行结果:

原数据:

x: tensor([ [ 0.5287,  0.8814],[ 1.2752,  1.9832],[ 1.9872, -1.2719]])
y: tensor([[ 0.5287,  1.2752,  1.9872],[ 0.8814,  1.9832, -1.2719]])

重定义后:

x: tensor([[11.0000,  0.8814],[ 1.2752,  1.9832],[ 1.9872, -1.2719]])
y: tensor([[11.0000,  1.2752,  1.9872],[ 0.8814,  1.9832, -1.2719]])

重点!重点!重点!!

可以看到,我们重新定义了 y 元素值的同时,x元素的值也发生了变化。因此tensor中数据还是在内存中一块区域里,只是布局的问题!为什么这么说:因为,**y里面数据布局的方式和从头开始创建一个常规的tensor布局的方式是不一样的。**这个可能只是python中之前常用的浅拷贝,y还是指向x变量所处的位置,只是说记录了transpose这个变化的布局。

如果想要断开这两个变量之间的依赖(x本身是contiguous的),就要使用contiguous()针对x进行变化,感觉上就是我们认为的深拷贝

当调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一模一样,但是两个tensor完全没有联系。还是上面的栗子:

import torchx = torch.randn(3, 2)
y = torch.transpose(x, 0, 1).contiguous()
print("原数据:")
print("x:", x)
print("y:", y)y[0, 0] = 11
print("\n重定义后:")
print("x:", x)
print("y:", y)

运行结果:

原数据:

x: tensor([[ 2.5966, -0.7265],[ 0.0200,  0.5726],[-0.8865, -0.4727]])
y: tensor([[ 2.5966,  0.0200, -0.8865],[-0.7265,  0.5726, -0.4727]])

重定义后:

x: tensor([[ 2.5966, -0.7265],[ 0.0200,  0.5726],[-0.8865, -0.4727]])
y: tensor([[11.0000,  0.0200, -0.8865],[-0.7265,  0.5726, -0.4727]])

可以看到对y使用了contiguous()后,改变y的值,对x没有任何影响!

参考:
https://zhuanlan.zhihu.com/p/545769141
https://zhuanlan.zhihu.com/p/64376950

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

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

相关文章

基于协同过滤算法的音乐推荐系统的研究与实现

完整下载:基于协同过滤算法的音乐推荐系统的研究与实现 基于协同过滤算法的音乐推荐系统的研究与实现 A Study and Implementation of a Music Recommendation System based on Collaborative Filtering Algorithm 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研…

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control 个人理解思考基本信息摘要背景挑战方法结果 引言方法论结果讨论引用 个人理解 通过将caption的注意力图注入到目标caption注意力中影响去噪过程以一种直观和便于理解的形式通过修改交叉注意力的…

界限与不动产测绘乙级申请条件

整理一期关于测绘资质界限与不动产测绘乙级资质的申请要求 测绘资质是由测绘资质主管部门自然资源部制定的 想要了解标准、正规的申请条件,可以到当地省份的政务网搜索测绘资质办理相关标准(例如下图) 1、通用标准 http://gi.mnr.gov.cn/20…

基于多模态大数据的国家安全风险态势感知模型构建

源自:情报杂志 “人工智能技术与咨询” 发布 摘要 [研究目的]为强化国家安全情报能力,推动风险监测预警能力提升,构建基于多模态大数据的国家安全风 险态势感知模型。 [研究方法]首先,对国家安全风险态势感知进行阐释;然后,分析多模态大数据驱动下…

【黑马甄选离线数仓day07_常见优化手段及核销主题域开发】

1.常见优化手段 1.1 分桶表基本介绍 分桶表: 分文件的, 在创建表的时候, 指定分桶字段, 并设置分多少个桶, 在添加数据的时候, hive会根据设置分桶字段, 将数据划分到N个桶(文件)中, 默认情况采用HASH分桶方案 , 分多少个桶, 取决于建表的时候, 设置分桶数量, 分了多少个桶最终…

每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题

每日一题系列(day 07) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

全新仿某度文库网站源码/在线文库源码/文档分享平台网站源码/仿某度文库PHP源码

源码简介: 全新仿某度文库网站源码/在线文库源码,是以phpMySQL开发的,它是仿某度文库PHP源码。有功能免费文库网站 文档分享平台 实现文档上传下载及在线预览。 仿百度文库是一个以phpMySQL进行开发的免费文库网站源码。仿某度文库实现文档…

Chroma向量数据库支持的距离计算公式

Chroma DB默认采用squared L2 norm作为衡量两个向量距离的计算方式,可以在创建collection的时候更改metadata的hnsw:space字段指定其他距离计算公式,方式如下: collection client.create_collection(name"collection_name",metada…

史上最全C/C++面试八股文,一文带你彻底搞懂C/C++面试!

前述:本文初衷是为了总结本人在各大平台看到的面经,我会在本文持续更新我所遇到的一些C面试问题,如有错误请一定指正我。 目录 1.讲一讲封装、继承、多态是什么? 2.多态的实现原理(实现方式)是什么&…

java高频面试题(2023最新)

目录 一.java基础1.八大基础类型2.java三大特性3.重载和重写的区别4.pubilc、protected、(dafault)不写、private修饰符的作用范围5.和equals的区别6.hashcode()值相同,equals就一定为true7.为什么重写equals(),就要重写hashcode()?8.short s 1&#x…

每日一练:约瑟夫生者死者小游戏

1. 问题描述 约瑟夫问题(Josephus problem)是一个经典的数学和计算机科学问题,源于犹太历史学家弗拉维奥约瑟夫斯(Flavius Josephus)的著作《犹太战记》。问题的描述如下:   在这个问题中,有n…

【JavaEE初阶】 认识文件与Java中操作文件

文章目录 🌴认识文件🚩树型结构组织和目录🚩文件路径(Path)🚩知识扩展 🎍Java 中操作文件🚩File 概述📌属性📌构造方法📌方法 🚩File使…

R语言基础入门(学习笔记通俗易懂版)

文章目录 R语言预备知识获取工作目录设置工作目录注释变量名的命名赋值变量的显示查看与清除变量函数帮助文档查询函数安装R包文件的读取文件的输出软件的退出与保存 R语言语法向量向量的创建向量的索引(向量元素的提取、删除、添加)向量长度的获取向量的…

苹果手机怎么卸载微信?记得掌握这两种方法!

微信是一款社交应用程序,在聊天过程中,我们会经常发送和接收各种形式的信息。随着时间的推移,微信缓存的文件会越来越多,占用的存储空间也会逐渐增加。 卸载微信可以释放手机内存,提高手机的运行速度。那么&#xff0…

书p163代码hhh

package store . dao ; /&#xff0f;省略包导入代码 public class CategoryDAO ( public List < Category > findCategories ( String name , Pager pager ) throws Exception { List < Category > list new ArrayList <>(); Connection con null ;…

UDP的不可靠性可以用来做什么

目录 UDP特点 应用场景 总结 User Datagram Protocol&#xff08;UDP&#xff0c;用户数据报协议&#xff09;是互联网协议套件中的一种传输层协议。与TCP不同&#xff0c;UDP是一种无连接的、不可靠的协议。 UDP特点 要知道UDP可以用来做什么&#xff0c;首先我们要知道它…

Matlab进阶绘图第34期—双三角热图

在《Matlab进阶绘图第29期—三角热图》中&#xff0c;我分享过三角热图的绘制模板。 然而&#xff0c;有的时候&#xff0c;为了节省版面或者方便对比等&#xff0c;需要在一张图上绘制两个三角热图的组合形式&#xff0c;且每个三角热图使用不同的配色方案&#xff0c; 由于…

谈谈中间件设计的思路

前言 想要设计和真正理解中间件的架构理论和思想。对于开发来说需要具备三个关键的能力 1&#xff1a;基础通用技术的深入理解和运用2&#xff1a;了解和熟悉常见中间件的设计思想&#xff0c;且有自己的感悟,并且能按照自己的理解模仿写一写3&#xff1a;业务的高度理解能力…

pgsql 更新A表的x字段通过查询b表的z字段

查询表t_local_warning_hit_source的send_time 更新到表t_local_warning_source WITH t2 AS ( SELECT ID, send_time FROM t_local_warning_hit_source WHERE send_time > 2023-09-27 00:00:00 AND send_time < 2023-11-28 00:00:00 ) UPDATE t_local_warning_source t…

pandas教程:MovieLens 1M Dataset MovieLens 1M数据集

文章目录 14.2 MovieLens 1M Dataset&#xff08;MovieLens 1M数据集&#xff09;1 Measuring Rating Disagreement&#xff08;计算评分分歧&#xff09; 14.2 MovieLens 1M Dataset&#xff08;MovieLens 1M数据集&#xff09; 这个数据集是电影评分数据&#xff1a;包括电影…