torch中reshape和view
回答
老师讲到torch中reshape和view是一样的,看了torch文档,并实践了一下,事实上还是有一点点区别的,区别在于被操作的那个tensor是否是连续的,当连续时两者一致,当不连续时reshape会返回新的tensor,该tensor与原来的再无关联,修改reshape返回的tensor不会变更原来的,比如:
a = t.rand(3,3)
b = a.permute(1,0)
c = b.reshape(9)
c【0】=100 #这里观察一下a,b对应位置的数值
评论
可以参考这个网页的第一个回答:https://stackoverflow.com/questions/49643225/whats-the-difference-between-reshape-and-view-in-pytorch view只能作用在连续的张量上(张量中元素的内存地址是连续的)。而reshape连续or非连续都可以。调用x.reshape的时候,如果x在内存中是连续的,那么x.reshape会返回一个view(原地修改,此时内存地址不变),否则就会返回一个新的张量(这时候内存地址变了)。所以推荐的做法是,想要原地修改就直接view,否则就先clone()再改。
参考程序
import torch as t
a = t.rand(3,3)
b = a.permute(1,0)
c = b.reshape(9)
c[0]=100 #这里观察一下a,b对应位置的数值
print("a: \n", a)
print("b: \n", b)
print("c: \n", c)
这段代码使用了 PyTorch 库,其中执行了以下操作:
- 使用
t.rand(3, 3)
函数创建一个随机的 3×3 的张量,并将其赋值给变量a
。 - 使用
a.permute(1,0)
函数对a
进行转置操作,并将得到的结果赋值给变量b
。其中,permute
函数可以接收多个参数,用于指定新维度的顺序,这里将原张量的两个维度交换。 - 使用
b.reshape(9)
函数将b
变形为一维张量(即长度为 9 的向量),并将结果赋值给变量c
。 - 对
c
中的第一个元素进行修改,将其赋值为 100。 - 输出变量
a
、b
和c
的值。
最后输出的结果显示,由于 PyTorch 张量对象是引用类型,所以在修改一维张量 c
的第一个元素时,也同时影响了转置后的二维张量 b
第一列的第一个元素以及原始的数组 a
的第一行第一列元素。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】