torch中contiguous()函数

1. 背景

torch中一些操作会改变原数据,比如:narrow() view() expand() transpose()等操作,在使用transpose()进行转置操作时,pytorch并不会创建新的、转置后的tensor,而是修改了tensor中的一些属性(也就是元数据),使得此时的offset和stride是与转置tensor相对应的。转置的tensor和原tensor的内存是共享的,即改变转置后的tensor, 原先tensor中内容也会改变,而contiguous方法就类似深拷贝,使得上面这些操作不会改变元数据

2. 示例

x = torch.randn(3, 2)
y = torch.transpose(x, 0, 1)
print("修改前:")
print("x-", x)
print("y-", y)
 
print("\n修改后:")
y[0, 0] = 11
print("x-", x)
print("y-", y)

输出:修改后的x会随y的改变而改变

修改前:
x- tensor([[-1.2076, -0.5300],
        [-0.0826, -1.0144],
        [ 1.2097, -1.2360]])
y- tensor([[-1.2076, -0.0826,  1.2097],
        [-0.5300, -1.0144, -1.2360]])

修改后:
x- tensor([[11.0000, -0.5300],
        [-0.0826, -1.0144],
        [ 1.2097, -1.2360]])
y- tensor([[11.0000, -0.0826,  1.2097],
        [-0.5300, -1.0144, -1.2360]])

使用conguous方法

import torch
x = torch.randn(3, 2)
y = torch.transpose(x, 0, 1).contiguous()
print("修改前:")
print("x-", x)
print("y-", y)
 
print("\n修改后:")
y[0, 0] = 11
print("x-", x)
print("y-", y)

输出: 可以看到x并没有随y的改变而改变

x- tensor([[ 1.3756, -0.1766],
        [ 0.9518, -1.7000],
        [-1.0423, -0.6077]])
y- tensor([[ 1.3756,  0.9518, -1.0423],
        [-0.1766, -1.7000, -0.6077]])

修改后:
x- tensor([[ 1.3756, -0.1766],
        [ 0.9518, -1.7000],
        [-1.0423, -0.6077]])
y- tensor([[11.0000,  0.9518, -1.0423],
        [-0.1766, -1.7000, -0.6077]])

3. 总结

当调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一模一样,使得两个tensor完全没有联系,类似于深拷贝

4. 参考

Pytorch中contiguous()函数理解

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值