Pytorch中tensor.view().permute().contiguous()函数理解
Pytorch中tensor.view().permute().contiguous()函数理解
yolov3中有一行这样的代码,在此记录一下三个函数的含义
# 例子中batch_size为整型,len(self.anchors_mask[i])=3,self.bbox_attrs=25(voc数据集),最后两个参数也均为int
prediction = input.view(batch_size, len(self.anchors_mask[i]),self.bbox_attrs, input_height, input_width).permute(0, 1, 3, 4, 2).contiguous()
1 view()
view变换维度,把原先tensor中的数据按行优先的顺序排成一个一维数据,然后按照输入参数要求,组合成其他维度的tensor。
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 torchinputs = [[[1, 2 ,3], [4, 5, 6]],[[7, 8, 9], [10, 11, 12]]]inputs = torch.tensor(inputs)
print("inputs:", inputs, inputs.shape)outputs = inputs.permute(0, 2, 1)
print("outputs:", outputs, outputs.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数据布局方式和内存关系可以参考链接
仅理解contiguous()函数,可以理解为一次深拷贝
当调用contiguous()时,会强制拷贝出一份tensor,让它的布局和从头创建的一模一样,但是两个tensor完全没有联系。
contiguous() → Tensor
返回一个内存连续的有相同数据的tensor,如果原tensor内存连续,则返回原tensor;
具体原因有两种说法:
1 transpose、permute等维度变换操作后,tensor在内存中不再是连续存储的,而view操作要求tensor的内存连续存储,所以需要contiguous来返回一个contiguous copy;
2 维度变换后的变量是之前变量的浅拷贝,指向同一区域,即view操作会连带原来的变量一同变形,这是不合法的,所以也会报错;---- 这个解释有部分道理,也即contiguous返回了tensor的深拷贝contiguous copy数据;
参考链接:
【view().permute().contiguous()】 Pytorch中tensor.view().permute().contiguous()函数理解 - 简书 (jianshu.com)
Pytorch中tensor.view().permute().contiguous()函数理解相关推荐
- pytorch中tensor.mean(axis, keepdim)参数理解小实验
虽然没试过其他形式的多维数据,不过想来应该是一样的吧 -- 1.结论 keepdim=True 运算完之后的维度和原来一样,原来是三维数组现在还是三维数组(不过某一维度变成了1): keepdim=F ...
- pytorch 中 contiguous() 函数理解
pytorch 中 contiguous() 函数理解 文章目录 pytorch 中 contiguous() 函数理解 引言 使用 contiguous() 后记 文章抄自 Pytorch中cont ...
- Pytorch中tensor维度和torch.max()函数中dim参数的理解
Pytorch中tensor维度和torch.max()函数中dim参数的理解 维度 参考了 https://blog.csdn.net/qq_41375609/article/details/106 ...
- Pytorch中tensor.expand()和tensor.expand_as()函数
Pytorch中tensor.expand函数 Tensor.expand()函数详解 Tensor.expand_as()函数 Tensor.expand()函数详解 函数语法: # 官方解释: D ...
- tensor.view().permute()
tensor.view.permute tensor.view() tensor.permute() tensor.view() tenor.view()的作用说通俗点就是:该函数返回一个有相同数 ...
- pytorch tensor查找0_在PyTorch中Tensor的查找和筛选例子
本文源码基于版本1.0,交互界面基于0.4.1 import torch 按照指定轴上的坐标进行过滤 index_select() 沿着某tensor的一个轴dim筛选若干个坐标 >>&g ...
- Pytorch中Tensor的索引,切片以及花式索引(fancy indexing)
目录 理解Tensor的dim 索引 简单索引 用1维的list,numpy,tensor索引 用booltensor索引 切片 花式索引 结语 前一段时间遇到一个花式索引的问题,在搜索良久之后没有找 ...
- 机器学习9:关于pytorch中的zero_grad()函数
机器学习9:关于pytorch中的zero_grad()函数 本文参考了博客Pytorch 为什么每一轮batch需要设置optimizer.zero_grad. 1.zero_grad()函数的应用 ...
- tensor.view()函数--自己的理解《pytorch学习》
引言:首先介绍一下,我们会在哪里遇到这个函数呢?最常见的就是在利用pytorch库搭建网络时,时不时的冒出一个,如果不会!你总是看不懂,以后也看不懂,如果有时间,大家一起来看看这个函数吧! 1.ten ...
最新文章
- Redis 那些故障转移、高可用方案
- 成功解决ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
- 答网友问:如果用 OData 就能直接和 SAP 系统互通,BTP 和 CPI 这样的平台意义在哪里呢?
- 下载的c语言程序代码怎么运行,CFree怎么运行程序 编译运行C语言程序代码的方法...
- 软件测试用例_大话软件测试用例要素
- 搜索提示时jquery的focusout和click事件冲突问题完美解决
- c++中的结构体_C ++中的结构
- 初入WebService
- 使用jekins自动构建部署java maven项目(jdk1.7+tomcat7.0+jenkins2.19.3)
- java车牌号识别EasyPR_EasyPR-Java
- halcon安装教程
- Origin非线性拟合选项
- AT绑定句柄无效和拒绝访问
- PAT甲级 1116
- 一个在线免费短网址生成API
- 生产系统执行下线操作--泪奔
- springboot企业人力资源管理系统毕业设计源码291816
- 我理解的MOOC的重要性
- 三线性插值(Trilinear Interpolation)详解
- C++jump game跳跃游戏的算法(附完整源码)
热门文章
- 常用的行列式和矩阵的性质
- 已知由单链表表示的线性表中含有三类字符(数字,字母和其他字符)试编写算法来构造三个循环链表,使每个表中只含某一类字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。
- Eclipse使用指南
- Android键盘操作的函数:onKeyDown, onKeyUp, on, onKeyMultiple
- 【算法】 二叉树遍历
- DSO详解-Direct Sparse Odometry论文解读
- ab进行压力测试详解
- DOTween的使用
- Redis学习笔记(四):配置文件详细说明(redis-3.2)
- 六十星系之43紫微天相坐辰戌