Pytorch学习笔记——autograd

一、神经网络
神经网络就是一个”万能的模型+误差修正函数“,每次根据训练得到的结果与预想结果进行误差分析,进而修改权值和阈值,一步一步得到能输出和预想结果一致的模型。机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定一些样本点,用合适的曲线揭示这些样本点随着自变量的变化关系。深度学习同样也是为了这个目的,只不过此时,样本点不再限定为(x, y)点对,而可以是由向量、矩阵等等组成的广义点对(X,Y)。而此时,(X,Y)之间的关系也变得十分复杂,不太可能用一个简单函数表示。然而,人们发现可以用多层神经网络来表示这样的关系,而多层神经网络的本质就是一个多层复合的函数。这个函数含有海量的权值参数、偏置参数,再通过一系列复合的复杂运算,得到结果。
二、梯度下降与反向传播
梯度下降是找损失函数极小值的一种方法,反向传播是求解梯度的一种方法。
在训练阶段,深度神经网络经过前向传播之后,得到的预测值与先前给出真实值之间存在差距。我们可以使用损失函数来体现这种差距。损失函数的作用可以理解为:当前向传播得到的预测值与真实值接近时,取较小值。反之取值增大。并且,损失函数应是以参数(w 权重, b 偏置)为自变量的函数
训练神经网络是指通过输入大量训练数据,使得神经网络中的各参数(w 权重, b 偏置)不断调整“学习”到一个合适的值。使得损失函数最小。
三、Pytorch中的autograd
在整个Pytorch框架中, 所有的神经网络本质上都是一个autograd package(自动求导工具包),autograd package提供了一个对Tensors上所有的操作进行自动微分的功能.
torch.Tensor是整个package中的核心类, 如果将属性**.requires_grad设置为True, 它将追踪在这个类上定义的所有操作. 当代码要进行反向传播的时候, 直接调用.backward()就可以自动计算所有的梯度. 在这个Tensor上的所有梯度将被累加进属性.grad中.
如果想终止一个Tensor在计算图中的追踪回溯, 只需要执行
.detach()就可以将该Tensor从计算图中撤下, 在未来的回溯计算中也不会再计算该Tensor.除了.detach(), 如果想终止对计算图的回溯, 也就是不再进行方向传播求导数的过程, 也可以采用代码块的方式with torch.no_grad():, 这种方式非常适用于对模型进行预测的时候, 因为预测阶段不再需要对梯度进行计算。
torch.Function:Function类是和Tensor类同等重要的一个核心类, 它和Tensor共同构建了一个完整的类, 每一个Tensor拥有一个
.grad_fn**属性, 代表引用了哪个具体的Function创建了该Tensor;如果某个张量Tensor是用户自定义的, 则其对应的grad_fn is None。

from __future__ import print_function
import torch
x1 = torch.ones(3, 3)
x2 = torch.ones(3, 3, requires_grad=True)
print(x1)
print(x2)
y1 = x1+2
y2 = x2+2
print(y1)
print(y2)
print(y1.grad_fn)
print(y2.grad_fn)
z = y2*y2*3
out=z.mean()
print(z,out)
#.requires_grad_(): 该方法可以原地改变Tensor的属性.requires_grad的值. 如果没有主动设定默认为False.
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)              #只记录最后一步操作
#在Pytorch中, 反向传播是依靠.backward()实现的
out.backward()
print(x2.grad)
#关于自动求导的属性设置: 可以通过设置.requires_grad=True来执行自动求导, 也可以通过代码块的限制来停止自动求导.
print((x2*2).requires_grad)
with torch.no_grad():
    print((x2*2).requires_grad)
#可以通过.detach()获得一个新的Tensor, 拥有相同的内容但不需要自动求导
print(x2.requires_grad)
y = x2.detach()
print(y.requires_grad)
print(x2.eq(y).all())

运行结果:

tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], requires_grad=True)
tensor([[3., 3., 3.],
        [3., 3., 3.],
        [3., 3., 3.]])
tensor([[3., 3., 3.],
        [3., 3., 3.],
        [3., 3., 3.]], grad_fn=<AddBackward0>)
None
<AddBackward0 object at 0x0000028507C016A0>
tensor([[27., 27., 27.],
        [27., 27., 27.],
        [27., 27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
False
True
<SumBackward0 object at 0x0000028507C010B8>
tensor([[2., 2., 2.],
        [2., 2., 2.],
        [2., 2., 2.]])
True
False
True
False
tensor(True)

Process finished with exit code 0

你可能感兴趣的:(学习笔记,python,机器学习,深度学习)