Pytorch 数据操作
创建Tensor操作
- 创建一个未初始化的Tensor
x=torch.empty(5,3)
- 创建一个5x3的随机初始化的Tensor
x=torch.rand(5,3)
- 创建一个5x3的long型全0的Tensor
x=torch.zeros(5,3,dtype=torch.long)
- 使用list直接创建数据
x=torch.tensor([5.5,3])
- 创建全是1的Tensor
x=x.new_ones(5,3,dtype=torch.float64)
- 创建同类型的Tensor,随机初始化
x=torch.randn_like(x,dtype=torch.float)
- 通过shape或者size()来获取Tensor的形状
print(x.size())
print(x.shape)
还有一些其他操作,可见github中的数据操作的内容 。
算术操作
- 加法形式一
y = torch.rand(5, 3)
print(x + y)
- 加法形式二
print(torch.add(x, y))
- 还可指定输出:
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
- 加法形式三
# adds x to y
y.add_(x)
print(y)
索引切片
我们还可以使用类似NumPy的索引操作来访问 Tensor 的⼀部分,需要注意的是:索引出来的结果与原数据共享内存,也即修改⼀个,另⼀个会跟着修改。
y = x[0, :]
y += 1
print(y)
print(x[0, :]) # 源tensor也被改了了
改变形状
y=x.view(15)
y=x.view(-1,5) #-1所指的维度可以根据其他维度的值推出来
view()返回的新tensor与源tensor共享内存
- 使用clone可以实现深copy
x_cp=x.clone().view(15)
- 使用item返回标量
x=torch.randn(1)
print(x)
print(x.item())
线性代数
pytorch提供了线性代数操作
广播操作
x = torch.arange(1, 3).view(1, 2)
print(x)
y = torch.arange(1, 4).view(3, 1)
print(y)
print(x + y)
输出:
tensor([[1, 2]])
tensor([[1],
[2],
[3]])
tensor([[2, 3],
[3, 4],
[4, 5]])
运算内存开销
y=y+x #y会开辟新的内存
y[:]=y+x #y不会开辟新的内存空间
torch.add(x, y, out=y) #y不会开辟新的内存空间
y += x
y.add_(x) #y不会开辟新的内存空间
Numpy数组转Tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a, b)
a += 1
print(a, b)
b += 1
print(a, b)
自动求梯度
- Tensor核心类
- 激活梯度
- 反向传播
- 冻结梯度
- Function函数的作用
- .grad_fn根据Tensor是否运算而来,与Function产生联合
梯度
Tensor.grad提供了累积梯度,记得及时清零。
y.backward(),y必须是标量的tensor,我们不不允许张量量对张量求导,只允许标量对张量求导,求导结果是和⾃变量同形的张量。
如果我们想修改tensor的数据,但又不想被autograd记录,那么我们可以对tensor.data进行操作。