在pytorch中,Tensor的存储是行主序的,也就是意味着最后一个维度的元素的存储时连续的,reshape和view并不改变元素存储的内存,仅仅改变访问的间隔,下面举例说明;
比如一个23的Tensor在内存中的存储是连续的:[1,2,3,4,5,6]
实际访问的过程中,1,2,3属于第一行,4,5,6属于第二行,对于第一个维度2,访问的间隔是3,对于第二个维度3,访问的间隔是1;
如果reshape成32的Tensor,对于第一个维度3,访问的间隔是2,对于第二个维度2,访问的间隔是1;也就是对于当前维度,访问的间隔是下一个维度的数值。
reshape 和 view
reshape 和 view 不会改变原始 Tensor 的内存存储。它们的工作原理如下:
- 内存视图
共享内存:reshape 和 view 返回的是原始 Tensor 的一个新的视图(view),而不是复制数据。这意味着新 Tensor 和原始 Tensor 共享相同的内存空间。 - 数据不变
原始数据保持不变:通过 reshape 或 view 生成的新 Tensor 的数据布局与原始 Tensor 相同。改变新视图中的数据会影响原始 Tensor,反之亦然。 - 连续性要求
注意连续性:如果原始 Tensor 是非连续的,使用 view 可能会导致错误。在这种情况下,使用 reshape 更为安全,因为它会在必要时返回一个新的 Tensor。
总结
reshape 和 view 不会改变原始 Tensor 的内存存储,它们只是创建了一个指向同一块内存的新视图。
permute
permute 是 PyTorch 中用于重新排列 Tensor 维度的操作。其工作原理主要涉及以下几个方面:
- 维度重排
重新排列维度:permute 允许用户指定一个新的维度顺序。例如,给定一个形状为 (2, 3, 4) 的 Tensor,使用 tensor.permute(1, 0, 2) 会改变 Tensor 的形状为 (3, 2, 4)。 - 内存视图
共享内存:与 reshape 和 view 类似,permute 返回的是原始 Tensor 的一个新的视图,不会复制数据。新 Tensor 仍然指向原始数据的内存。 - 步幅的变化
步幅计算:permute 通过调整步幅来实现维度重排。步幅决定了在内存中如何跳过元素以访问不同的维度。例如:
原始 Tensor 的步幅会根据新的维度顺序计算出新的步幅。 - 效率
高效操作:由于不涉及数据的拷贝,permute 操作非常高效,适合在大规模数据集上使用。