文章目录
梯度
梯度包括大小和方向,是一个向量。
寻找最小值:
learning rate设置为0.001
激活函数
torch.sigmoid()
torch.tanh()
torch.relu()
nn.LeakyReLU()
ReLU在小于零的情况下,也有可能出现梯度弥散,这时候使用Leaky ReLU激活函数。
softmax
在分类问题中常配合 Cross Entropy Loss 使用
梯度:
import torch
import torch.nn.functional as F
a = torch.FloatTensor([1.,2.,3.])
print(a) # tensor([1., 2., 3.])
p = F.softmax(a,dim=0) # 构建图。dim指定维度,在第0维上操作
print(p) # tensor([0.0900, 0.2447, 0.6652])
loss函数
均方差 (Mean Squared Error)
import torch
import torch.nn.functional as F
x = torch.ones(1)
print('x:', x) # x: tensor([1.])
w = torch.full([1], 2, dtype=torch.float)
print('w:', w) # w: tensor([2.])
w.requires_grad_() # 对w进行更新,_告诉pytorchw参数是需要grad梯度信息的
mse = F.mse_loss(torch.ones(1), x*w) # 动态图建图。完成计算mse_loss的过程。(laber value,predicted value)
print('mse:', mse) # mse: tensor(1., grad_fn=<MeanBackward0>)
mse.backward() # 自动从后往前传播,计算出的gradent会附加在成员变量的.grad参数上
print(w.grad) # tensor([2.])
Cross Entropy
分类算法不能使用最大化准确度作为目标,因为:
Entropy:用来表述不确定性,不确定性越高,Entropy越大。
a =torch.full([4],1/4)
print(a) # tensor([0.2500, 0.2500, 0.2500, 0.2500])
print(-(a*torch.log2(a)).sum()) # tensor(2.)
a = torch.tensor([0.1, 0.1, 0.1, 0.7])
print(-(a*torch.log2(a)).sum()) # tensor(1.3568)
a = torch.tensor([0.001, 0.001, 0.001, 0.997])
print(-(a*torch.log2(a)).sum()) # tensor(0.0342)
Cross Entropy:表述两个分布的差距
以二元猫狗分类为例:
最小化H(P,Q):
- 当y=1时,最大化log( p ),最大化p
- 当y=0时,最大化log(1-p),最小化p
当预测准确度越高时,H(P1,Q1)越小。
Pytorch中,Softmax和Cross-entropy有一个现成的结构。Softmax和Cross-entropy如果分开的话,会出现数据不稳定的情况。所以最好得到Logit以后,直接使用现有结构处理。
torch.nn.functional.cross_entropy函数相当于:先做了softmax操作;然后做log操作;最后做了nll_loss操作。
import torch
from torch.nn import functional as F
x = torch.randn(1,784)
w = torch.randn(10,784)
logits = x@w.t() # x*w+b b为零
print('logits:',logits)
pred = F.softmax(logits,dim=1)
print('pred:',pred)
pred_log = torch.log(pred) # e对数
print(F.cross_entropy(logits, torch.tensor([3]))) # torch.tensor([3])在这里是真实值
'''使用cross_entropy()的时候,使用的是logits,而不是pred'''
print(F.nll_loss(pred_log,torch.tensor([3])))
'''如果想使用pred做cross_entropy运算,需要先对pred做log运算,然后使用F.nll_loss'''
'''cross_entropy函数相当于:先做了softmax操作;然后做log操作;最后做了nll_loss操作'''