首页人工智能Pytorch9.激活函数、损失函数、自...

9.激活函数、损失函数、自动求导

1.激活函数:

  • Sigmoid

将数据映射到0到1之间。

>>> import torch
>>> z = torch.linspace(-100,100,10)
>>> z
tensor([-100.0000,  -77.7778,  -55.5556,  -33.3333,  -11.1111,   11.1111,
          33.3333,   55.5555,   77.7778,  100.0000])
>>> torch.sigmoid(z)
tensor([0.0000e+00, 1.6655e-34, 7.4564e-25, 3.3382e-15, 1.4945e-05, 9.9999e-01,
        1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00])
  • Tanh

将数据映射到-1到1之间,由sigmoid函数变化而来。

>>> z = torch.linspace(-1,1,10)
>>> z
tensor([-1.0000, -0.7778, -0.5556, -0.3333, -0.1111,  0.1111,  0.3333,  0.5556,
         0.7778,  1.0000])
>>> torch.tanh(z)
tensor([-0.7616, -0.6514, -0.5047, -0.3215, -0.1107,  0.1107,  0.3215,  0.5047,
         0.6514,  0.7616])
  • ReLU(Rectified Linear Unit)

是现在深度学习中用得最多的激活函数。ReLU在<0时不响应,在>0时则线性相应。
输入正信号时的导数是1,避免了当输入过大时引起(前面Sigmoid或者Tanh都会出现的)梯度弥散。

>>> z = torch.linspace(-1,1,10)
>>> z
tensor([-1.0000, -0.7778, -0.5556, -0.3333, -0.1111,  0.1111,  0.3333,  0.5556,
         0.7778,  1.0000])
>>> torch.relu(z)
tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1111, 0.3333, 0.5556, 0.7778,
        1.0000])
  • Softmax

用于将多个输出转换成多个概率值,使每个值都符合概率的定义(在0到1且概率相加和为1),非常适合多分类问题。
从上图中可以看出Softmax往往用在最后对输出值y的处理上。它会将原来大的值相对缩放得更大,而原来很小的值压缩到比较密集的空间。

>>> import torch
>>> from torch.nn import functional as F
>>> z = torch.rand(2,requires_grad=True)
>>> z
tensor([0.6355, 0.9841], requires_grad=True)
>>> F.softmax(z,dim=0)
tensor([0.4137, 0.5863], grad_fn=<SoftmaxBackward>)

2.LOSS:

  • Mean Squared Error(均方差/MSE)

MSE和L2范数相比,L2范数是做了开平方操作的,而MSE则没有。

  • Cross Entorpy Loss(交叉熵损失)

可以用于二分类,也适用于多分类,往往和Softmax激活函数搭配使用。

3.自动求导:

  • autograd.grad()方法
>>> import torch
>>> from torch.nn import functional as F
>>> x = torch.ones(1)
>>> w = torch.full([1],2.)
# F.mse_loss(预测值pred,实际值label)
>>> mse = F.mse_loss(torch.ones(1),x*w)
>>> mse
tensor(1.)
# torch.autograd.grad(lossy,自变量[x1,x2,...])
# 此时会报错,这个错误是因为在前面初始化w时,没有设定其需要梯度信息,所以PyTorch在建图的时候就没有设置它具有梯度信息。
>>> torch.autograd.grad(mse,[w])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Anaconda3\lib\site-packages\torch\autograd\__init__.py", line 145, in grad
    inputs, allow_unused)
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
# 更新w,设置其为需要梯度信息
>>> w.requires_grad_()
tensor([2.], requires_grad=True)
# 这里还会报错,是因为PyTorch是动态图,w更新了但是图还是之前的图
>>> torch.autograd.grad(mse,[w])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Anaconda3\lib\site-packages\torch\autograd\__init__.py", line 145, in grad
    inputs, allow_unused)
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
# 因此需要再次计算,从而把图更新一遍
>>> mse = F.mse_loss(torch.ones(1),x*w)
>>> torch.autograd.grad(mse,[w])
(tensor([2.]),)

另外,也可以在建立Tensor时用参数requires_grad=True指明它需要梯度信息。

w = torch.full([1], 2, requires_grad=True)
  • loss.backward()方法
>>> import torch
>>> from torch.nn import functional as F
>>> x = torch.ones(1)
>>> w = torch.full([1],2.,requires_grad=True)
>>> mse = F.mse_loss(torch.ones(1),x*w)
# .backward()方法,让PyTorch做反向的搜索,将需要grad信息的Tensor求出这个LOSS关于它的导数出来
>>> mse.backward()
# 此时不会自动返回,结果附加在每个Tensor的.grad的成员变量上
>>> w.grad
tensor([2.])
RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments