How to choose loss ?训练时,如何选择损失函数?

站在巨人的肩膀上:肩膀左、肩膀右


当学习神经网络到一定程度时,不难发现优化器和损失函数是神经网络模型不可缺少的部分。

损失函数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


1 损失函数:

  • 网络模型最想达到的是什么?其实就是希望估值(估计出的值)尽可能逼近真值(真实值),但是,毕竟经过了模型,必然会存在损失,那么此时就考虑是否可以利用损失带回网络去做优化,减小损失?损失函数诞生。
  • 具体来说,损失函数就是用于计算估值和真值之间差异的函数。

2 典型损失函数:

2.1 nn.L1loss 

估值与真值差的绝对值的平均数。

loss(x,y)=\frac{1}{N}\sum_{i=1}^{N}\left | x-y \right |

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 

2.2 nn.SmoothL1oss / HuberLoss

估值与真值的误差在(-1,1)之间,为平方损失,否则为L1损失。

loss(x,y)=\frac{1}{N}\begin{cases} \frac{1}{2}\left (x _{i} -y _{i} \right )^{2} & \text{ if } |x _{i} -y _{i}| <1\\ |x _{i} -y _{i}|-\frac{1}{2} & \text otherwise \end{cases}

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  
###################################################################

2.3 nn.MSELoss

估值和真值差的平方和的平均值,平方损失。

loss(x,y)=\frac{1}{N}\sum_{i=1}^{N}{|x-y|^{2}}

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
###################################################################

2.4 nn.BCELoss

二分类的交叉熵,公式较为复杂。

loss(o,t)=-\frac{1}{N}\sum_{i=1}^{N}\left [ t_{i} *log(o_{i}))-(1-t_{i} )*log(1-o_{i}))\right ]

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
###################################################################

2.5 nn.CrossEntropyLoss

交叉熵损失,图像分类神经网络常用。

loss(x,label)=-log\frac{e^{x_{label}}}{\sum_{j=1}^{N}e^{x_{j}}}=-x_{label}+log\sum_{j=1}^{N}e^{x_{j}}

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 损失函数
用于图像识别验证的,对输入参数有各种要求,
在图像识别一文中会有正确的使用方法。

2.6 nn.NLLLoss

负对数似然损失函数(Negative Log Likelihood),在前面接上一个 LogSoftMax 层就等价于交叉熵损失。注意,xlabel是经过 log 运算后的数值,与交叉熵损失的xlabel不一样。图像识别模型上常用。

loss(x,label)=-x_{label}

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 比较多。

2.7 nn.NLLLoss2d

和上面类似,但是多了几个维度,一般用在图片上。比如用全卷积网络做分类时,最后图片的每个点都会预测一个类别标签。

  • input (N,C,H,W)
  • input (N,H,W)
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)                         #输出结果报错,不能这么用!
###################################################################

仅此先说明部分不合乎常规语句,具有一定条件性!

结合训练,后期会重新规划不正确的代码!

你可能感兴趣的:(【深度学习笔记】,深度学习,机器学习,人工智能)