torch常用指令一

一:view()、reshape()、resize_()

view和reshape都是一种无脑的转化shape的方法,都是浅拷贝,会破坏原来的数据顺序。view必须满足连续性要求,一般在transpose等操作后再view都会报错,因为元数据不连续了。但是reshape却可以,这是因为reshape在不连续情况下,会自动contiguous,将不连续数据深拷贝为新的连续数据,然后再执行view操作,如下图:
在这里插入图片描述而resize呢,前面说到的 reshape 和 view 都必须要用到全部的原始数据,比如你的原始数据只有12个,无论你怎么变形都必须要用到12个数字,不能多不能少。因此你就不能把只有12个数字的 tensor 强行 reshap 成 2*5 的维度的tensor。但是 resize_() 可以做到,无论你存储区原始有多少个数字,我都能变成你想要的维度,数字不够怎么办?随机产生凑!数字多了怎么办?就取我需要的部分!

在这里插入图片描述

在这里插入图片描述

二:size()、shape

tensor.size()等价于 tensor.shape,前者是方法调用,返回该张量的形状,后者则是attribute查询。下图举例说明:

a = torch.tensor([1, 2, 3, 4, 5, 6]).reshape(2,3)
new_a_shape = a.size() + (2,) #注意!!如果元组中只有一位数据,后面要加逗号,不然作int处理
							# 那么元组拼接会报错
print(new_a_shape)

三:permute()、transpose()、view()、contiguous()

permute可以转换任意个数的维度,transpose只能调换两个维度。两者实际是一种浅拷贝,破坏了连续性,只是呈现的shape形式改变了。

view也是一种转换shape维度的方式,也是一种浅拷贝,但不会破坏连续性。

区别:实际一个多维的torch数组存放在内存中是被拉直的一维形式,view只是单纯的按顺序填充给定的shape,但是破坏了原先的数值顺序。而permute和transpose是一种“忠诚”的转换方式,保护了数据的顺序。

联动用法:比如一个shape为[6,7,2,8]的tensor-a,我想先转换为[6,2,7,8]把最后两维拼在一起,得到[6,2,56],要求不能破坏原始的数据存储顺序。常用的操作流程如下:

target = 56
b = a.permute(0, 2, 1, 3).contiguous()
new_b_shape = b.shape[:-2] + (target,) # torch.Size(6, 2, 56)
c = b.view(*new_b_shape)

四:squeeze()、unsqueeze()、expand()

squeeze()用来去除值是1的维度,也可以指定index。unsqueeze是给指定index处添加一个维度。expand()是利用广播极值来扩展维度,一般接在unsqueeze()后使用。注意,也都是浅拷贝!!见下图测试举例:

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值