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.])