关于Contiguous()方法

关于Contiguous()方法_contiguous().view_Yore_999的博客-CSDN博客

x = torch.Tensor(2,3)
y = x.permute(1,0)         # permute:二维tensor的维度变换,此处功能相当于转置transpose
y.view(-1)                 # 报错,view使用前需调用contiguous()函数
y = x.permute(1,0).contiguous()
y.view(-1)                 # OK

具体原因有两种说法:

1.  transpose、permute等维度变换操作后,tensor在内存中不再是连续存储的,而view操作要求tensor的内存连续存储,所以需要contiguous来返回一个contiguous copy;

2. 维度变换后的变量是之前变量的浅拷贝,指向同一区域,即view操作会连带原来的变量一同变形,这是不合法的,所以也会报错;---- 这个解释有部分道理,也即contiguous返回了tensor的深拷贝contiguous copy数据;

我感觉都还挺有道理的。

  • 在pytorch中,只有很少几个操作是不改变tensor的内容本身,而只是重新定义下标与元素的对应关系。换句话说,这种操作不进行数据拷贝和数据的改变,变的是元数据,这些操作是:
    narrow(),view(),expand(),transpose();

    在使用transpose()进行转置操作时,pytorch并不会创建新的、转置后的tensor,而是修改了tensor中的一些属性(也就是元数据),使得此时的offset和stride是与转置tensor相对应的,而转置的tensor和原tensor的内存是共享的。

    为了证明这一点,我们来看下面的代码:

x = torch.randn(3, 2)
y = x.transpose(x, 0, 1)
x[0, 0] = 233
print(y[0, 0])       # print 233

可以看到,改变了x的元素的值的同时,y的元素的值也发生了变化;也即,经过上述操作后得到的tensor,它内部数据的布局方式和从头开始创建一个常规的tensor的布局方式是不一样的!于是就有contiguous()的用武之地了。

在上面的例子中,x是contiguous的,但y不是(因为内部数据不是通常的布局方式)。注意:不要被contiguous的字面意思“连续的”误解,tensor中数据还是在内存中一块区域里,只是布局的问题!

简单来说,Contiguous()方法的作用就是:当调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一模一样。

实际使用时候不用太担心,如果没在需要调用contiguous()的地方调用contiguous(),运行时会提示我们需要添加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.contiguous()是PyTorch中的一个方法,用于检查张量是否是连续的(contiguous)。\[1\]当一个张量是连续的时候,它的元素在内存中是按照一定的顺序排列的,这样可以提高计算效率。而当一个张量不是连续的时候,它的元素在内存中的排列可能是不连续的,这会导致计算效率下降。\[2\] 你可以使用torch.contiguous()方法来检查一个张量是否是连续的。如果一个张量是连续的,该方法会返回True,否则返回False。例如,对于张量a和b,你可以使用以下代码来检查它们是否是连续的: print(a.is_contiguous()) # True print(b.is_contiguous()) # False 你也可以参考PyTorch官方文档中关于.contiguous()方法的详细说明:\[3\] #### 引用[.reference_title] - *1* *3* [【Pytorch】Tensor.contiguous()使用与理解](https://blog.csdn.net/meiqi0538/article/details/124264065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [torch.contiguous()方法](https://blog.csdn.net/qq_37828380/article/details/107855070)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值