tensor.view()、tensor.reshape()、tensor.resize_() 三者的区别
我们已经知道pytorch的tensor由“头信息区”和“storage”两部分组成,其中tensor的实际数据是以一维数组(storage)的方式存于某个连续的内存中的。。
view 从字面意思上就是“ 视图 ”的意思,就是将原tensor以某种排列方式展示给我们, view()不会改变原storage、也不会新建storage,只新建头信息区 。
本质上, view()返回的是针对一维storage的某种排列视图,并且这种视图只能是连续、等距切分storage再连续竖向叠加形成的视图,不能跳跃式切分 ,如下图例子。
注意:如果tensor是不连续的,则不能使用view()( /p/51678ea7a959 )。
我们知道,tensor不连续是不能使用 view() 方法的。
只有将不连续tensor转化为连续tensor(利用contiguous(), /p/51678ea7a959 )后,才能使用view()。
reshape()正是先完成连续化,然后再进行view() 。
reshape() 和 view() 的区别:
(1)当 tensor 满足连续性要求时,reshape() = view(),和原来 tensor ***用存储区;
(2)当 tensor不满足连续性要求时,reshape() = **contiguous() + view(),会产生有新存储区的 tensor,与原来tensor 不***用存储区。
前面说到的 view()和reshape()都必须要用到全部的原始数据,比如你的原始数据只有12个,无论你怎么变形都必须要用到12个数字,不能多不能少。因此你就不能把只有12个数字的 tensor 强行 reshap 成 2×5 的。
但是 resize_() 可以做到,无论原始存储区有多少个数字,我都能变成你想要的维度,数字不够怎么办?随机产生凑!数字多了怎么办?就取我需要的部分!
1.截取时:
会改变原tensor a,但不会改变storage(地址和值都不变),且a和b***用storage(这里是2638930351680
)。
2.添加时:会改变原tensor a,且会改变storage(地址和值都变),但a和b还是***用storage(这里是2638924338752
)。