2021-04-27

本文详细介绍了PyTorch中Tensor的数据操作,包括view、reshape、clone及其内存管理,以及广播机制在不同形状Tensor运算中的应用。此外,还讨论了Tensor与NumPy数组之间的转换,并强调了在内存操作中的注意事项。
摘要由CSDN通过智能技术生成

Tensor的简单的数据操作

1 数据操作

import torch
x = torch.rand(5, 3)

# 1 用view改变tensor([])的形状:新源tensor共享内存,view仅仅改变了对此张量的观察角度
y = x.view(15)
z = x.view(-1, 5)  # -1所指的维度可以根据其他维度的值推出来
print(x.size(), y.size(), z.size())

# 2 用reshape改变形状,返回一个新的tensor副本
Z = x.reshape()
print(Z)

# 3 用x.clone()创造一个副本,然后再使用view():
x_cp = x.clone().view(15)
print(x)
print(x_cp)

# 使⽤ clone 还有⼀个好处是会被记录在计算图中,即梯度回传到副本时也会传到源 Tensor

# 4 另外⼀个常⽤的函数就是 item() , 它可以将⼀个标量 Tensor 转换成⼀个Python number:
x = torch.randn(1)
print(x)
print(x.item())

PyTorch中的 Tensor ⽀持超过⼀百种操作,包括转置、索引、切⽚、数学运算、线性代数、随机数等
等,可参考官⽅⽂档。

2 tensor的广播机制

# 当对两个形状不同的 Tensor 按元素运算
# 时,可能会触发⼴播(broadcasting)机制:先适当复制元素使这两个 Tensor 形状相同后再按元素
# 运算。例如:

import torch
x = torch.arange(1, 4).view(1, 3)
print(x)
y = torch.arange(1, 5).view(4, 1)
print(y)
print(x + y)

# 索引、 view 是不会开辟新内存的,
# ⽽像 y = x + y 这样的运算是会新开内存的
import torch
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
y = y + x
print(id(y) == id_before) # False

# 如果想指定结果到原来的 y 的内存,
# 我们可以使⽤前⾯介绍的索引来进⾏替换操作。在下⾯的例⼦中,
# 我们把 x + y 的结果通过 [:] 写进 y 对应的内存中。

x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
y[:] = y + x
print(id(y) == id_before) # True
#
# 我们还可以使⽤运算符全名函数中的 out 参数
# 或者⾃加运算符 += (也即 add_() )达到上述效果,例如
# torch.add(x, y, out=y) 和 y += x ( y.add_(x) )。
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
id_before = id(y)
torch.add(x, y, out=y) # y += x, y.add_(x)
print(id(y) == id_before) # True

3 tensor和numpy的相互转换

# Tensor转为NumPy数组(二者共享内存)
import torch
a = torch.ones(5)
b = a.numpy()
print(a, b)

# NumPy数组转 Tensor
# 使⽤ from_numpy() 将NumPy数组转换成 Tensor :
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a, b)

# 所有在CPU上的 Tensor(除了 CharTensor )都⽀持与NumPy数组相互转换

# 还有⼀个常⽤的⽅法就是直接⽤ torch.tensor() 将NumPy数组转换成 Tensor

c = torch.tensor(a)
a += 1
print(a, c)
# 注意的是该⽅法总是会进⾏数据拷⻉.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值