Pytorch中view、索引、numpy与tensor的转换中的内存共享问题

本文介绍了如何在PyTorch中使用view改变tensor的视图,索引操作以及它们与内存共享的关系。重点讨论了运算时的内存开销,并提到了numpy与tensor之间的转换,包括共享内存和非共享内存的区别。
摘要由CSDN通过智能技术生成

View

通过view,可以改变tensor的视图,例如可以将一个5*3的tensor转化为1*15的形式

代码

 

x = torch.rand(5, 3)  #一个5*3的tensor

y = x.view(15)           #将其转化为1*15的视角

z = x.view(-1, 5)       # -1指该维度可以根据其它维度自动计算,例如此处由于规定列是5,所以行应当为3

需要注意的是,view返回的tensor与源tensor共享内存!也就是说,view只不过是改变了对同一对象的观察角度而已,如果更改新tensor,源tensor也会发生改变。

索引

我们可以通过类似numpy中的操作来对tensor中的部分数据进行访问。

同样需要注意的是,索引出来的结果与源数据共享内存!所以如果我们操作索引出来的切片,源数据也会发生改变

代码

 

x = torch.rand(5, 3)

y = x[1, :] #取出第一行的所有数据

运算的内存开销

View和索引都是不会开辟新内存的,但是形如 ` y = y + x` 这样的运算,是会为y开辟一个新内存的,也就是说,并不是覆盖了原来的y所在位置的数据,而是直接分配了一个新的地址。

如果我们希望将结果指定到原来的y,那么可以通过以下几种操作实现

代码

 

y[ : ] = y + x

torch.add(x, y, out = y)  #通过out参数来指定结果应该置于什么位置

y += x      #使用+=符号赋值,修改的是源数据

y.add_(x)

numpy与tensor的互相转换

numpy()和from_numpy()两个函数可以方便的进行互换,但是需要注意的是,两个函数所产生的tensornumpy中的数组是共享内存的,所以这种方法运行速度比较快,改变其中一个,另一个也会改变。(有点类似与view,只不过view是更换了观察维度的角度,而这两个函数则是更换了类型的观察角度)

除了上面的两个函数,还可以通过` torch.tensor()` 来将numpy转化为tensor,需要注意的是,这种方法会进行数据的拷贝,也就是说tensor与numpy并不会共享同一个内存

代码

 

# tensor转numpy

x = torch.rand(5, 3)

y = x.numpy()

 

# numpy转tensor

x = np.ones(5)

y = torch.from_numpy(x)

 

# 使用torch.tensor()通过numpy来初始化一个tensor

x = np.ones(5)

y = torch.tensor(x)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值