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 库,其中执行了以下操作:

  1. 使用 t.rand(3, 3) 函数创建一个随机的 3×3 的张量,并将其赋值给变量 a
  2. 使用 a.permute(1,0) 函数对 a 进行转置操作,并将得到的结果赋值给变量 b。其中,permute 函数可以接收多个参数,用于指定新维度的顺序,这里将原张量的两个维度交换。
  3. 使用 b.reshape(9) 函数将 b 变形为一维张量(即长度为 9 的向量),并将结果赋值给变量 c
  4. 对 c 中的第一个元素进行修改,将其赋值为 100。
  5. 输出变量 ab 和 c 的值。

最后输出的结果显示,由于 PyTorch 张量对象是引用类型,所以在修改一维张量 c 的第一个元素时,也同时影响了转置后的二维张量 b 第一列的第一个元素以及原始的数组 a 的第一行第一列元素。

参考

https://www.bilibili.com/video/BV1CV411Y7i4?p=4&spm_id_from=pageDriver&vd_source=c708def0a324eac06f3f31f597632be7

posted @ 2023-05-18 20:04  尚方咸鱼  阅读(150)  评论(0编辑  收藏  举报