在 PyTorch 中,view 和 reshape 都用于改变张量的形状,但它们的行为和适用场景有所不同。
1、view
- 共享内存:view 返回的新张量与原始张量共享内存。这意味着修改其中一个张量会影响另一个。
- 连续性要求:view 要求张量在内存中是连续的(contiguous)。如果张量不连续,需要先调用 contiguous() 方法。
- 适用场景:适用于需要共享内存且张量已经是连续的情况。
import torch
x = torch.arange(6)
y = x.view(2, 3) # 改变形状为 (2, 3)
y[0, 0] = 10
print(x) # x 也会被修改
2、reshape
- 共享内存(可能):reshape 会尽可能返回共享内存的视图,但如果张量不连续,它会返回一个新的张量副本。
- 无连续性要求:reshape 不要求张量是连续的,它会自动处理连续性。
- 适用场景:适用于不确定张量是否连续,或需要灵活处理形状的情况。
import torch
x = torch.arange(6)
y = x.reshape(2, 3) # 改变形状为 (2, 3)
y[0, 0] = 10
print(x) # x 也会被修改,但如果 x 不连续,y 可能是副本
3、总结
- view:适用于已知张量连续且需要共享内存的场景。
- reshape:适用于不确定张量是否连续或需要灵活处理形状的场景。
如果张量不连续,view 会报错,而 reshape 会自动处理。