持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
前面的博客讲到了整个模型的工作原理,其中网络在进行前向传播之后会产生一个输出,这个输出与我们的标签值进行比较,差值越小就表明模型的训练结果越好,当然这需要排除过拟合的情况。这其中,用来度量网络的输出与标签值的函数,我们习惯称之为损失函数,通过损失函数,我们的网络可以进行反向传播,从而更新网络的权值,使得整个模型朝着好的方向进行训练。
我们常用的损失函数有下面几个:
1.交叉熵损失
首先,从公式入手,理解一下交叉熵损失
然后,在pytorch中,调用交叉熵损失的代码如下
先导入需要的包,此处只写一次,后面不再重复
import torch
import torch.nn as nn
在pytorch函数原型
torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
调用举例
s = nn.Sigmoid()
input = torch.randn(4, requires_grad=True)
print(input)
dest = torch.empty(4).random_(3)
loss = nn.BCELoss()
output = loss(s(input), dest)
# output.backward()
print(output)
输出结果
2.二分类交叉熵损失
数学公式如下
pytorch中函数原型
torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')
调用举例
s = nn.Sigmoid()
input = torch.randn(4, 5,requires_grad=True)
print(input)
dest = torch.empty(4, dtype=torch.long).random_(3)
loss = nn.CrossEntropyLoss()
output = loss(s(input), dest)
# output.backward()
print(output)
输出结果
3.L1损失
数学公式如下
函数原型如下
torch.nn.L1Loss(size_average=None, reduce=None, reduction='mean')
调用举例
s = nn.Sigmoid()
input = torch.randn(4, requires_grad=True)
print(input)
dest = torch.empty(4).random_(3)
loss = nn.L1Loss()
output = loss(s(input), dest)
# output.backward()
print(output)
结果输出
4 SmoothL1(平滑L1)损失
数学原理
函数原型
torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction='mean', beta=1.0)
调用实例
s = nn.Sigmoid()
input = torch.randn(4, requires_grad=True)
print(input)
dest = torch.empty(4).random_(3)
loss = nn.SmoothL1Loss()
output = loss(s(input), dest)
# output.backward()
print(output)
输出结果
5 MSE损失
数学公式
函数原型
torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')
调用实例
s = nn.Sigmoid()
input = torch.randn(4, requires_grad=True)
print(input)
dest = torch.empty(4).random_(3)
loss = nn.MSELoss()
output = loss(s(input), dest)
# output.backward()
print(output)
目前常用到的损失函数主要就是这几个,损失函数的种类还有一些未全部列出,但是其原理基本相似,都是为了度量输出与标签的差距进行设立,然后通过梯度的反向传播进行参数的更新。
至此,对于一个简单网络结构的剖析主要就是这些,后面的博客中将利用这些简单的组合,逐渐构建相对较为复杂的网络,包括网络的训练、网络的测试等等。
整体来说,pytorch功能太强大,只有通过实践才能快速的掌握,否则了解再多的原理也白搭。