在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 操作非常高效,適合在大規模數據集上使用。