PyTorch 中 view 和 reshape 的区别是什么?

推荐答案

在 PyTorch 中,viewreshape 都用于改变张量的形状,但它们的行为有一些关键区别:

  • view:

    • view 返回一个与原始张量共享数据的新张量,但形状不同。
    • 要求原始张量在内存中是连续的(contiguous),否则会抛出错误。
    • 如果张量不连续,需要先调用 contiguous() 方法。
  • reshape:

    • reshape 也返回一个与原始张量共享数据的新张量,但形状不同。
    • 如果原始张量在内存中是连续的,reshape 的行为与 view 相同。
    • 如果原始张量不连续,reshape 会自动处理,返回一个连续的新张量。

本题详细解读

view 的使用场景

  • view 适用于已知张量在内存中是连续的情况。
  • 由于 view 要求张量是连续的,因此在某些情况下需要先调用 contiguous() 方法。

reshape 的使用场景

  • reshape 更加灵活,适用于不确定张量是否连续的情况。
  • 如果张量不连续,reshape 会自动处理,返回一个连续的新张量。

关键区别总结

  • 连续性要求view 要求张量是连续的,而 reshape 不要求。
  • 自动处理reshape 在张量不连续时会自动处理,而 view 会抛出错误。
  • 性能:由于 reshape 可能需要复制数据,因此在性能上可能略低于 view

代码示例对比

-- -------------------- ---- -------
------ -----

- - ---------------------------- --  - ----------

- -- ---- -----
----
    - - --------- --
------ ------------ -- --
    ------------ ------ -----

- -- ------- ---
- - ------------ --
--------

在这个示例中,view 会抛出错误,而 reshape 会成功执行。

纠错
反馈