【PyTorch】contiguous==>保证Tensor是连续的,通常transpose、permute 操作后执行 view需要此方法
目录
PyTorch中的is_contiguous是什么含义?
行优先
为什么需要 contiguous ?
contiguous 本身是形容词,表示连续的,关于 contiguous,
PyTorch 提供了
is_contiguous:
用于判定Tensor是否是 contiguous 的,contiguous
(形容词动用)两个方法 :保证Tensor是contiguous的。
PyTorch中的is_contiguous是什么含义?
is_contiguous
直观的解释是Tensor底层一维数组元素的存储顺序与Tensor按行优先一维展开的元素顺序是否一致。
Tensor多维数组底层实现是使用一块连续内存的1维数组(行优先顺序存储,下文描述),Tensor在元信息里保存了多维数组的形状,在访问元素时,通过多维度索引转化成1维数组相对于数组起始位置的偏移量即可找到对应的数据。
如果想要变得连续使用contiguous
方法,如果Tensor不是连续的,则会重新开辟一块内存空间保证数据是在内存中是连续的,如果Tensor是连续的,则contiguous
无操作。
行优先
行是指多维数组一维展开的方式,对应的是列优先。PyTorch中Tensor底层实现是C,也是使用行优先顺序。举例说明如下:
>>> t = torch.arange(12).reshape(3,4)
>>> t
tensor([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])
二维数组 t 如图1:
数组 t 在内存中实际以一维数组形式存储,通过 flatten 方法查看 t 的一维展开形式,实际存储形式与一维展开一致,如图2,
>>> t.flatten()
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
颜色相同的数据表示在同一行,不论是行优先顺序、或是列优先顺序,如果要访问矩阵中的下一个元素都是通过偏移来实现,这个偏移量称为步长(stride)。在行优先的存储方式下,访问行中相邻元素物理结构需要偏移1个位置,在列优先存储方式下偏移3个位置。
为什么需要 contiguous ?
torch.view
等方法操作需要连续的Tensor。
transpose、permute 操作虽然没有修改底层一维数组,但是新建了一份Tensor元信息,并在新的元信息中的 重新指定 stride。torch.view
方法约定了不修改数组本身,只是使用新的形状查看数据。如果我们在 transpose、permute 操作后执行 view,Pytorch 会抛出以下错误:
invalid argument 2: view size is not compatible with input tensor's size and stride (at least one dimension
spans across two contiguous subspaces). Call .contiguous() before .view().
at /Users/soumith/b101_2/2019_02_08/wheel_build_dirs/wheel_3.6/pytorch/aten/src/TH/generic/THTensor.cpp:213
即需要在transpose()、permute() 操作后先执行contiguous()让后再执行 view(),如下:
windows = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, win_size, win_size, C)
原文:PyTorch中的contiguous - 知乎
【PyTorch】contiguous==>保证Tensor是连续的,通常transpose、permute 操作后执行 view需要此方法相关推荐
- pytorch contiguous的使用
pytorch contiguous的使用 contiguous一般与transpose,permute,view搭配使用 即使用transpose或permute进行维度变换后,调用contiguo ...
- 实践教程 | 浅谈 PyTorch 中的 tensor 及使用
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | xiaopl@知乎(已授权) 来源 | https://z ...
- 【小白学PyTorch】9.tensor数据结构与存储结构
[机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 小白学PyTorch | 8 实战之MNIST小试牛刀 小白学PyTorch | 7 最新版本torchvisi ...
- 【深度学习理论】一文搞透pytorch中的tensor、autograd、反向传播和计算图
转载:https://zhuanlan.zhihu.com/p/145353262 前言 本文的主要目标: 一遍搞懂反向传播的底层原理,以及其在深度学习框架pytorch中的实现机制.当然一遍搞不定两 ...
- pytorch 深入理解 tensor.scatter_ ()用法
pytorch 深入理解 tensor.scatter_ ()用法 在 pytorch 库下理解 torch.tensor.scatter()的用法.作者在网上搜索了很多方法,最后还是觉得自己写一篇更 ...
- pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换 1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为 ...
- YDOOK:Pytorch : AI : torch.tensor.size() 与 torch.tensor.shape 的区别
YDOOK:Pytorch : AI : torch.tensor.size() 与 torch.tensor.shape 的区别 区别: 1. torch.tensor.size() 可用通过 :t ...
- YDOOK:Pytorch教程:tensor 张量内各个值同时相加一个数
YDOOK:Pytorch教程:tensor 张量内各个值同时相加一个数 © YDOOK Jinwei Lin, shiye.work import torch import numpy as npt ...
- YDOOK AI : Pytorch :使用 tensor.zeros() tensor.zeros_like() 生成定义 全零数组 全0数组
YDOOK AI : Pytorch :使用 tensor.zeros() tensor.zeros_like() 生成定义 全零数组 全0数组 1_1. tensor.zeros() 函数: tor ...
最新文章
- 2022-2028年中国废矿物油行业市场研究及前瞻分析报告
- JAVA8的LocalDateTime使用心得和工具类
- CSS3盒模型display:box详解
- matplotlib-绘制精美的图表
- DevExpress的下拉框控件LookUpEdit的使用、添加item选项值、修改默认显示值
- 线段树模板hdu 1754:I Hate It
- 统一设置网站html文件输出编码为utf-8,以解决乱码问题
- google_protobuf数据类型
- 利用Teensy进行EM410x卡模拟以及暴力破解EM410X类门禁系统可行性猜想
- Linux load函数,kexec_load()函数 Unix/Linux
- C语言在main中输入2个整数ab,请教一个C语言问题。若输入3个整数3,2,1,则以下程序输出的结果是.,c 语言问题 输入三个整数 按从小到大输出...
- 同样是机器学习算法工程师,你的面试为什么过不了?
- Tapestry5中的DI
- 全微分推导: 全微分感性理解: 全微分几何意义举例: 偏导与全微分的意义 通过物理性质理解。偏导与全微分的意义
- 使用美图秀秀批量处理照片
- 腾讯网页登陆的加密机制
- flex:1是什么?
- Arthas(阿尔萨斯)简记
- 深度学习系列7:fastai
- 6个网页背景特效源码 canvas+three.js科技贴图 webgl源码