pytorch函数reshape()和view()的区别及张量连续性

目录

1.view()

2.reshape()

3.引用和副本:

4.区别

5.总结


在PyTorch中,tensor可以使用两种方法来改变其形状:view()和reshape()。这两种方法的作用是相当类似的,但是它们在实现上有一些细微的区别。

1.view()

view()方法是PyTorch中的一种基础操作,用于调整tensor的形状。它返回一个新的tensor,其数据与原始tensor相同,但具有新的形状。与原始tensor共享存储空间 ,因此在新的tensor上的任何操作都会影响原始tensor

下面是一个使用view()方法改变tensor形状的示例:

python 复制代码
import torch

# 创建一个形状为(2, 3, 4)的tensor
x = torch.randn(2, 3, 4)

# 使用view()方法将其形状改变为(6, 4)
y = x.view(6, 4)

print(x.shape) # 输出torch.Size([2, 3, 4])
print(y.shape) # 输出torch.Size([6, 4])

在上面的代码中,我们使用view()方法将形状为(2, 3, 4)的tensor x 转换为形状为(6, 4)的新tensor y。

2.reshape()

reshape()方法也用于调整tensor的形状,与view()方法类似,但是在实现上有一个重要的区别:reshape()方法返回一个新的tensor,其数据与原始tensor相同,但是可能与原始tensor共享存储空间,具体取决于实现。

下面是一个使用reshape()方法改变tensor形状的示例:

python 复制代码
import torch

# 创建一个形状为(2, 3, 4)的tensor
x = torch.randn(2, 3, 4)

# 使用reshape()方法将其形状改变为(6, 4)
y = x.reshape(6, 4)

print(x.shape) # 输出torch.Size([2, 3, 4])
print(y.shape) # 输出torch.Size([6, 4])

在上面的代码中,我们使用reshape()方法将形状为(2, 3, 4)的tensor x 转换为形状为(6, 4)的新tensor y。

3.引用和副本:

view 并不产生原始数据的新拷贝,副本产生原始数据的新拷贝

视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置,这样避免了重新创建张量的高内存开销。由上面介绍的 PyTorch 的张量存储方式可以理解为:对张量的大部分操作就是视图操作!

与之对应的概念就是副本。副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置

对张量连续性条件的理解

4.区别

view()和reshape()的区别在于它们对于共享存储空间的处理方式 。view()方法对共享存储空间的处理比较严格,必须要满足两个条件:新的tensor的大小必须与原始tensor大小相同,且新的tensor的步幅(stride)必须与原始tensor步幅相同,否则将会抛出一个错误。相反,reshape()方法更加灵活,可以处理整个形状大小的变化。

下面是一个使用view()方法会抛出错误的示例:

python 复制代码
import torch

# 创建一个形状为(2, 3, 4)的tensor
x = torch.randn(2, 3, 4)

# 使用view()方法将其形状改变为(6, 5),会抛出一个错误
y = x.view(6, 5)

在上面的代码中,我们尝试使用view()方法将形状为(2, 3, 4)的tensor x 转换为一个形状为(6, 5)的新tensor,但由于新的tensor大小与原始tensor大小不同,所以会抛出一个错误。

下面是一个使用reshape()方法可以处理大小变化的示例:

python 复制代码
import torch

# 创建一个形状为(2, 3, 4)的tensor
x = torch.randn(2, 3, 4)

# 使用reshape()方法将其形状改变为(6, 5)
y = x.reshape(6, 5)

print(x.shape) # 输出torch.Size([2, 3, 4])
print(y.shape) # 输出torch.Size([6, 5])

在上面的代码中,我们使用reshape()方法将形状为(2, 3, 4)的tensor x 转换为一个形状为(6, 5)的新tensor。

5.总结

PyTorch中的view()和reshape()方法都用于将tensor的形状调整为新的形状。view()方法返回一个新的tensor,其中数据与原始tensor相同,但具有新的形状,并且对共享存储空间进行严格的处理;reshape()方法也返回一个新的tensor,其中数据与原始tensor相同,但是对共享存储空间的处理比较灵活,可以处理整个形状大小的变化。在使用这两种方法时,需要根据需要选择不同的方法。

  • (1)reshape()函数返回一个新的张量,而view()函数返回一个与原始张量共享存储空间的张量。这意味着,当你使用reshape()函数改变张量形状时,会创建一个新的张量对象,而原始张量对象不会改变。而当你使用view()函数改变张量形状时,会返回一个新的张量对象,但是它与原始张量对象共享存储空间,因此对新张量的修改也会影响原始张量。
  • (2)reshape()函数可以处理任意形状的张量,而view()函数只能处理连续的张量。如果你尝试使用view()函数处理非连续的张量,会引发RuntimeError异常。
  • (3)reshape()函数可以自动推断某些维度的大小,而view()函数需要手动指定所有维度的大小。如果你使用reshape()函数时只指定了部分维度的大小,它会自动推断其他维度的大小。而如果你使用view()函数时没有指定所有维度的大小,会引发RuntimeError异常。
  • (4)reshape()函数可以使用-1作为占位符来自动计算某个维度的大小,而view()函数不支持使用-1作为占位符。
  • (5)reshape()和view()函数都是用于改变张量形状的函数,但是它们之间有一些区别。如果你需要处理非连续的张量或者需要自动推断某些维度的大小,应该使用reshape()函数。如果你需要处理连续的张量并且需要手动指定所有维度的大小,应该使用view()函数。
  • (6)view比较轻量化,占资源较少

参考:PyTorch 82. view() 与 reshape() 区别详解 - 知乎

相关推荐
nVisual15 小时前
nVisual:AI驱动的智能排障,平均响应时间缩短40%
android·人工智能·缓存
白日做梦Q15 小时前
PyTorch从零手写CNN实现NEU钢材表面缺陷检测(完整实战·单篇完结)
人工智能·pytorch·cnn
星马梦缘15 小时前
机器学习与模式识别 第十一章 优化于梯度下降 考点压缩
人工智能·机器学习·梯度下降·hessian·条件数
想会飞的蒲公英15 小时前
TF-IDF + 随机森林中文文本分类全链路实战:从训练脚本到 Flask API + Streamlit 前端
人工智能·pytorch·python·随机森林·分类·flask·tf-idf
AI服务老曹15 小时前
摄像机安装AI视频分析参数配置说明:POC现场交付全流程指南
人工智能·音视频
FriendshipT15 小时前
Ultralytics:解读C3模块
人工智能·pytorch·python·深度学习·目标检测
极光代码工作室15 小时前
基于深度学习的异常行为检测系统
人工智能·python·深度学习·神经网络·机器学习
承渊政道15 小时前
【Python学习】(了解Python背景知识、搭建 Python 环境以及安装PyCharm)
python·学习·pycharm·搭建python环境
川石课堂软件测试15 小时前
性能测试|Nginx中间件监控与调优
linux·python·nginx·中间件·单元测试·压力测试·harmonyos
阿拉斯攀登15 小时前
RAG 性能优化:缓存、批量与并发
人工智能·缓存·性能优化·embedding·agent·loop·rag