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

13 篇文章 0 订阅

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


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

损失函数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)=rac{1}{N}sum_{i=1}^{N}left | x-yight |

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)=rac{1}{N}egin{cases} rac{1}{2}left (x _{i} -y _{i}ight )^{2} & 	ext{ if } |x _{i} -y _{i}| <1\ |x _{i} -y _{i}|-rac{1}{2} & 	ext 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)=rac{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)=-rac{1}{N}sum_{i=1}^{N}left [ t_{i} *log(o_{i}))-(1-t_{i} )*log(1-o_{i}))ight ]

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)=-lograc{e{x_{label}}}{sum_{j=1}{N}e{x_{j}}}=-x_{label}+logsum_{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) #输出结果报错,不能这么用!
    ###################################################################

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

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

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。

由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!

全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值