pytorch入门:60分钟闪电战

什么是pytorch?

参考教程:https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py

  • 基于Python科学计算软件包

  • NumPy的替代品,可以使用GPU的强大功能
  • 深入学习研究平台,提供最大的灵活性和速度

torch中的张量

构造一个未初始化的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.]

AUTOGRAD:自动求导

https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html

autograd包中是PyTorch中所有神经网络的核心

  • autograd软件包为Tensors上的所有操作提供自动求导
  • 它是一个逐个运行的框架,这意味着反向传播backprop由代码运行方式定义,并且每个迭代都可以不同。

张量

torch.Tensor是包的核心类。如果将其属性.requires_grad设置为True,则会开始跟踪其上的所有操作。完成计算后,可以调用.backward()并自动计算所有渐变。该张量的梯度将累积到.grad属性中。

阻止张量跟踪历史记录,可以调用.detach()它将其从计算历史记录中分离出来,并防止将来的计算被跟踪。

防止跟踪历史记录(和使用内存),还可以将代码块包装在其中。

with torch.no_grad():requires_grad =True

这在评估模型时尤其有用,因为模型可能具有可训练的参数,但我们不需要梯度。

还有一个类对于autograd实现非常重要 - a Function

TensorFunction互相连接并构建一个非循环图,它编码完整的计算历史。每个张量都有一个.grad_fn属性,该属性引用已创建的属性Tensor的Function(除了用户创建的张量 grad_fn is None)。

如果你想计算导数,你可以调用.backward()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)
<AddBackward0 object at 0x000002BAC9D94F60>
>>> 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=<MulBackward0>)

现在在这种情况下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

发布了46 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36808245/article/details/98873107