PyTorch 中,Tensor view、permute、transpose、reshape 接口,都是用来做什么的?有什么区别和联系?
一、torch.Tensor.view
作用:把Tensor展平后,重新改变形状,但是不改变维度顺序。
1、总元素个数不变
2、Tensor 是连续内存
3、不会生成新数据,只是改变索引方式
二、torch.Tensor.permute
作用:按照你指定的顺序,重新排列所有维度
1、可以同时调整任意多个维度
2、比 transpose 更通用(transpose 是 permute 的特例)
3、同样会让 Tensor 变成非连续内存
三、torch.Tensor.transpose
作用:只交换 指定的两个维度
1、只能传 2 个维度下标
2、不改变元素总数
3、会让 Tensor 变成非连续内存
四、torch.Tensor.reshape
作用:把张量变成你想要的形状,不改变维度顺序,不改变总元素数量
1、重塑形状
2、维度顺序不变
3、总元素个数必须一样
4、不关心张量是否连续
5、不复制数据,复制数据
五、reshape 和 view 的区别
1. view
必须要求张量内存连续
不连续会直接报错
永远不复制数据
2. reshape
不要求连续
如果不连续,自动调用 .contiguous () 复制数据
永远不会报错(只要元素数量对)
六、reshape 与 transpose /permute 的区别
1、reshape:只改形状,不改维度顺序
2、transpose /permute:改维度顺序,不改形状
七、联系
| 方法 | 功能 | 维度顺序 | 内存连续性 | 是否复制数据 |
|---|---|---|---|---|
| view | 塑形 | 不变 | 必须连续 | 不复制 |
| reshape | 塑形 | 不变 | 自动处理 | 不连续时复制 |
| transpose | 交换 2 个维度 | 改变 | 变不连续 | 不复制 |
| permute | 重排所有维度 | 改变 | 变不连续 | 不复制 |
八、总结
1、view:必须连续,不复制数据,不连续就报错
2、reshape:自动处理连续,不报错,最安全、最常用
3、transpose:交换两个维度
4、permute:重排所有维度