Pytorch中改变形状和交换维度详解:view()、reshape()、transpose()、permute()以及contiguous()
文章目录
- view()和reshape()
- transpose()和permute()
- contiguous
以后操作基于下述tensor。
import torch
a=torch.rand(2,2,2)
print(a)
view()和reshape()
这两个功能很简单,就是把原来的tensor拍扁,变成8个数,然后按照你给定的形状恢复出来。
问题, 怎么拍扁,就是把第二维里面数依次取出来,比如上面的就是9,5,4,8,4,3,5,7。
问题,怎么恢复出我们要的形状?假设我们要的形状是(1,1,8),先填充你给定的最后一个维度即第二维,然后看你要在这个维度上填充多少个数,我们给的是8,刚好填完就没了。
print(a.view(1,1,8))
print(a.reshape(1,1,8))
发现两者一毛一样。两者拍扁和填充的原理一样,所以当然一样喽。没毛病,都可以升维降维。
print(a.view(1,1,2,4))
print(a.reshape(1,1,2,4))
print(a.view(2,4))
print(a.reshape(2,4))
但是,这两个有不同的地方,reshape更加强大,到底有什么不同,我们会在最后公开。
transpose()和permute()
我们继续对a进行这两个操作:
这两个也非常像,但是这两个的原理和前面两个完全不一样,并不是拍扁然后恢复,而是交换维度,这个似乎非常抽象。
举个例子给你吧,现在维度是(2,2,2),假如我们要交换维度dim=1,dim=2,其流程如下:固定维度dim=0,然后对dim=1,dim=2进行矩阵转置,这个很简单对吧。
print(a.transpose(1,2))#维度1和维度2需要交换
print(a.permute(0,2,1))#效果一样,但用法不一样。表示现在的维度1是原来的维度2
我们观察一下,是不是就是一个转置而已!!!
从上面的用法可以看到,permute更加强大,transpose只能交换两个维度,但是:
print(a.permute(1,2,0))
突然变了3个维度,是不是有点烧脑了,不慌,我们一步一步来,其可以转化为:
print(a.transpose(1,2).transpose(2,0))
以上也是这两者仅有的区别了。
contiguous
在上述transpose()和permute()之后会带来一个后果,即数据地址不连续,这个时候不可以用view操作,只能用reshape。
print(a)
print(a.is_contiguous())#创建tensor或者view或者reshape,tensor的数据地址都是连续的。就是按照那个拍扁的顺序来存储在内存的。
print(a.view(1,1,8))
a=a.transpose(1,2)#交换维度,造成地址不连续
print(a.is_contiguous())
print(a.reshape(1,1,8))#仍然可以用
print(a.view(1,1,8))
tensor中的数据不连续存储,我们可以让其变得连续:
a=a.contiguous()
print(a.view(1,1,8))
contiguous:相接的; 相邻的;
continuous:;持续的;
Pytorch中改变形状和交换维度详解:view()、reshape()、transpose()、permute()以及contiguous()相关推荐
- Pytorch中dilation(Conv2d)参数详解
目录 一.Conv2d 二.Conv2d中的dilation参数 一.Conv2d 首先我们看一下Pytorch中的Conv2d的对应函数(Tensor通道排列顺序是:[batch, channel, ...
- pytorch中的nn.LSTM模块参数详解
直接去官网查看相关信息挺好的,但是为什么有的时候进不去 官网:https://pytorch.org/docs/stable/nn.html#torch.nn.LSTM 使用示例,在使用中解释参数 单 ...
- pytorch中的.detach和.data深入详解
前言:这两个方法都可以用来从原有的计算图中分离出某一个tensor,有相似的地方,也有不同的地方,下面来比较性的看一看.PyTorch0.4以及之后的版本中,.data 仍保留,但建议使用 .deta ...
- Pytorch中的train和eval模式详解
(一).model.train()和model.eval()分别在训练和测试中都要写,它们的作用如下: (1). model.train() 启用 BatchNormalization 和 Dropo ...
- python中文读音ndarray-numpy中的ndarray方法和属性详解
NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是一个一维数 ...
- python怎么横着输出_对python3中, print横向输出的方法详解
对python3中, print横向输出的方法详解 Python 2 : print打印的时候,如果结尾有逗号,打出来时候不会换行.但是在python3里面就不行了. Python3: 3.0的pri ...
- python时间函数报错_python3中datetime库,time库以及pandas中的时间函数区别与详解...
1介绍datetime库之前 我们先比较下time库和datetime库的区别 先说下time 在 Python 文档里,time是归类在Generic Operating System Servic ...
- python获取系统时间函数_python3中datetime库,time库以及pandas中的时间函数区别与详解...
1介绍datetime库之前 我们先比较下time库和datetime库的区别 先说下time 在 Python 文档里,time是归类在Generic Operating System Servic ...
- js数组中foEach和map的用法详解 jq中的$.each和$.map
数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...
最新文章
- 公司虚拟化平台VMware vCenter Server无法连接故障排查解决
- 「后端小伙伴来学前端了」CSS3伪元素选择器 ::before ::after | 记录自己的前端学习日子
- restful-api接口的设计规范介绍
- 12种Javascript解决常见浏览器兼容问题的方法
- 150秒内诊断脑瘤!最新医学影像AI在《Nature Medicine》发表
- Android异常总结---1.Android java.net.SocketException: Address family not supported by protocol
- Win10 Redstone再添新技能:深度集成App-V应用虚拟化
- 如何确定恶意软件是否在自己的电脑中执行过?
- mysql实现自动更新时间戳
- python学生信息管理系统 实验报告_Python学生信息管理系统的开发
- 性能优化-测试If-Else和if哪个性能更好
- nmap超快高效扫描端口
- The user specified as a definer (‘skip-grants user‘@‘skip-grants host‘) does not exist
- Xiaojie雷达之路---脉冲压缩
- php注入过程详解,PHP注入代码详解
- Let's go to the EX
- 【前端】使用nexus搭建本地npm仓库
- 短语、直接短语、句柄、素短语
- opencv学习笔记五:cv2.warpAffine()函数详解
- 2023年网络安全比赛--网络安全事件响应中职组(超详细)
热门文章
- 图灵5周年系列活动之科普大爆炸(免费!)
- GAN网络生成:感知损失(Perceptual Losses)
- 亚1纳米制程晶体管,一个碳原子栅极厚度:清华重大突破登上Nature
- 刷新4项文档智能任务纪录,百度TextMind打造ERNIE-Layout登顶文档智能权威榜单
- ICML 2018大奖出炉:伯克利、MIT获最佳论文(附论文、项目链接)
- 从一线撤回二三线城市的程序员们,最后都怎么样了?
- 兰州大学的《致谢》火了:“我从来不曾优秀过,也从来不曾放弃过!”
- CVPR 2020:华为GhostNet,超越谷歌MobileNet,已开源
- 初中参观机器人博物馆的作文_2021考研英语二大作文模板整理
- SAP QM QE02 修改检验结果,报错 -No characteristics were found–