站在巨人的肩膀上:肩膀左、肩膀右
当学习神经网络到一定程度时,不难发现优化器和损失函数是神经网络模型不可缺少的部分。
损失函数loss
目录
1 损失函数:
2 典型损失函数:
2.1 nn.L1loss
2.2 nn.SmoothL1oss / HuberLoss
2.3 nn.MSELoss
2.4 nn.BCELoss
2.5 nn.CrossEntropyLoss
2.6 nn.NLLLoss
2.7 nn.NLLLoss2
估值与真值差的绝对值的平均数。
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2)) #sample 的值为:[[1,1],[1,1]]
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a) #target 的值为:[[0,1],[2,3]]
###################################################################
criterion = nn.L1Loss()
loss = criterion(sample, target)
print(loss) #输出结果为 1
###################################################################
过程:
1 计算绝对差总和:|0-1|+|1-1|+|2-1|+|3-1|=4
2 取平均: 4/4=1
3 输出结果: 1
估值与真值的误差在(-1,1)之间,为平方损失,否则为L1损失。
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2)) #sample 的值为:[[1,1],[1,1]]
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a) #target 的值为:[[0,1],[2,3]]
###################################################################
criterion = nn.SmoothL1Loss()
loss = criterion(sample, target)
print(loss) #输出结果为 0.625
###################################################################
估值和真值差的平方和的平均值,平方损失。
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2)) #sample 的值为:[[1,1],[1,1]]
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a) #target 的值为:[[0,1],[2,3]]
###################################################################
criterion = nn.MSELoss()
loss = criterion(sample, target)
print(loss) #输出结果为 1.5
###################################################################
二分类的交叉熵,公式较为复杂。
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2)) #sample 的值为:[[1,1],[1,1]]
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a) #target 的值为:[[0,1],[2,3]]
###################################################################
criterion = nn.BCELoss()
loss = criterion(sample, target)
print(loss) #输出结果为 1.5
###################################################################
交叉熵损失,图像分类神经网络常用。
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2)) #sample 的值为:[[1,1],[1,1]]
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a) #target 的值为:[[0,1],[2,3]]
###################################################################
criterion = nn.CrossEntropyLoss()
loss = criterion(sample, target)
print(loss) #输出结果报错,不能这么用!
###################################################################
nn.CrossEntropyLoss 损失函数
用于图像识别验证的,对输入参数有各种要求,
在图像识别一文中会有正确的使用方法。
负对数似然损失函数(Negative Log Likelihood),在前面接上一个 LogSoftMax 层就等价于交叉熵损失。注意,xlabel是经过 log 运算后的数值,与交叉熵损失的xlabel不一样。图像识别模型上常用。
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2)) #sample 的值为:[[1,1],[1,1]]
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a) #target 的值为:[[0,1],[2,3]]
###################################################################
criterion = F。nll_loss()
loss = criterion(sample, target)
print(loss)
loss = F.nll_loss(sample, target) #输出结果报错,不能这么用!
###################################################################
Nn.NLLLoss 和 nn.CrossEntropyLoss 的功能是非常相似的!
对输入参数有各种要求,
通常都是用在多分类模型中,
实际应用中一般用 NLLLoss 比较多。
和上面类似,但是多了几个维度,一般用在图片上。比如用全卷积网络做分类时,最后图片的每个点都会预测一个类别标签。
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2)) #sample 的值为:[[1,1],[1,1]]
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a) #target 的值为:[[0,1],[2,3]]
###################################################################
criterion = nn.NLLLoss2d()
loss = criterion(sample, target)
print(loss) #输出结果报错,不能这么用!
###################################################################
仅此先说明部分不合乎常规语句,具有一定条件性!
结合训练,后期会重新规划不正确的代码!