参考教程:https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py
基于Python的科学计算软件包
构造一个未初始化的5x3矩阵:
>>>print(torch.empty(5,3))
tensor([[-6.1483e-36, 7.2167e-43, -6.1483e-36],
[ 7.2167e-43, -6.1483e-36, 7.2167e-43],
[-6.1483e-36, 7.2167e-43, -6.1483e-36],
[ 7.2167e-43, -6.1483e-36, 7.2167e-43],
[-6.1483e-36, 7.2167e-43, -6.1483e-36]])
官方教程:
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
构造一个随机初始化的矩阵:
>>> print(torch.rand(5,3))
tensor([[0.1840, 0.9601, 0.7408],
[0.0262, 0.8068, 0.9519],
[0.2338, 0.2868, 0.6574],
[0.4804, 0.9962, 0.4141],
[0.9522, 0.9061, 0.3496]])
构造一个矩阵填充的零和dtype long:
>>>print(torch.zeros(5, 3, dtype=torch.long))
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
直接从数据构造:
>>> print(torch.tensor([5.5, 3]))
tensor([5.5000, 3.0000])
得到大小size()上例》》》【5,3】
+ add(x,y,result(可省略))
任何使原位张量变形的操作都是用_
。后固定的。例如:x.copy_(y)
,将x copy成y,x.t_()
,将x进行t改变
使用标准的NumPy索引:
print(x[:, 1])
tensor([-0.5250, -0.7616, 0.0352, -1.9016, 0.7071])
整张量/重塑张量,可以使用torch.view
:
x = torch.randn(6, 6)
y = x.view(36)
z = x.view(-1, 18) # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())
结果:torch.Size([6, 6]) torch.Size([36]) torch.Size([2, 18])
用元素.item()
获取数字值
将Torch Tensor转换为NumPy阵列是一件轻而易举的事(反之亦然)。
Torch Tensor和NumPy阵列将共享其底层内存位置(如果Torch Tensor在CPU上),更改一个将改变另一个。
将NumPy数组转换为Torch Tensor:
>>> import numpy as np
>>> a = np.ones(5)
>>> b = torch.from_numpy(a)
>>> np.add(a, 1, out=a)
array([2., 2., 2., 2., 2.])
>>> print(a)
[2. 2. 2. 2. 2.]
>>> print(b)
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
将Torch Tensor转换为NumPy数组
>>> c = torch.ones(5)
>>> print(c)
tensor([1., 1., 1., 1., 1.])
>>> d = c.numpy()
>>> print(d)
[1. 1. 1. 1. 1.]
>>> c.add_(4)
tensor([5., 5., 5., 5., 5.])#自动出现
>>> print(c)
tensor([5., 5., 5., 5., 5.])
>>> print(d)
[5. 5. 5. 5. 5.]
https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html
autograd
包中是PyTorch中所有神经网络的核心。
autograd
软件包为Tensors上的所有操作提供自动求导。torch.Tensor
是包的核心类。如果将其属性.requires_grad
设置为True
,则会开始跟踪其上的所有操作。完成计算后,可以调用.backward()
并自动计算所有渐变。该张量的梯度将累积到.grad
属性中。
要阻止张量跟踪历史记录,可以调用.detach()
它将其从计算历史记录中分离出来,并防止将来的计算被跟踪。
要防止跟踪历史记录(和使用内存),还可以将代码块包装在其中。
with torch.no_grad():
requires_grad =True
这在评估模型时尤其有用,因为模型可能具有可训练的参数,但我们不需要梯度。
还有一个类对于autograd实现非常重要 - a Function
。
Tensor和
Function
互相连接并构建一个非循环图,它编码完整的计算历史。每个张量都有一个.grad_fn
属性,该属性引用已创建的属性Tensor的Function
(除了用户创建的张量 grad_fn is None
)。
如果你想计算导数,你可以调用.backward()
a Tensor
。如果Tensor
是标量(即它包含一个元素数据),则不需要指定任何参数backward()
,但是如果它有更多元素,则需要指定一个gradient
匹配形状的张量的参数。
>>> import torch
>>> import numpy
>>> x=torch.ones(2,2,requires_grad=True)
>>> print(x)
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
>>> y=x+2
>>> print(y)
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward0>)
>>> print(y.grad_fn)
>>> z=y*y*3
>>> out=z.mean()
>>> print(z,out)
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
.requires_grad_( ... )
改变现有的Tensor 的requires_grad
的标志。如果没有给出,输入默认为false。
向量函数的雅可比行列式是该函数的偏导数的矩阵。
矢量雅可比矩阵便于将外部梯度馈送到具有非标量输出的模型中。
>>> import torch
>>> import numpy
>>> x = torch.randn(3, requires_grad=True)
>>>
>>> y = x * 2
>>> while y.data.norm() < 1000:
... y = y * 2
...
>>> print(y)
tensor([-208.2775, 1347.0818, -227.7476], grad_fn=
现在在这种情况下y
不再是标量。torch.autograd
无法直接计算完整雅可比行列式,但如果我们只想要矢量雅可比行列式,只需将向量传递给 backward
参数:
>>> v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
>>> y.backward(v)
>>>
>>> print(x.grad)
tensor([5.1200e+01, 5.1200e+02, 5.1200e-02])
还可以.requires_grad=True
通过包装代码块来 停止在Tensors上跟踪历史记录的autogradwith torch.no_grad():
>>> print(x.requires_grad)
True
>>> print((x ** 2).requires_grad)
True
>>>
>>> with torch.no_grad():
... print((x ** 2).requires_grad)
...
False