【深度学习Pytorch】三、神经网络的损失函数

一、误差平方和SSE

回归类神经网络最常见损失函数SSE

SSE = \sum_{i=1}^{m}(z_{i}-z\bar{}_{i})^{2}

全部样本的评价损失MSE

MSE = \frac{1}{m}\sum_{i=1}^{m}(z_{i}-z\bar{}_{i})^{2}

from torch.nn import MSELoss  #导入类

yhat = torch.randn(size=(50,),dtype=torch.float32)
y = torch.randn(size=(50,),dtype=torch.float32)

criterion = MSELoss()  #实例化一个类
loss = criterion(yhat,y)
loss #没有设置随机数种子,所以每次运行的数字都会不一致

#在MSELoss中有重要的参数,reduction
#当reduction = "mean" (默认也是mean),则输出MSE
#当reduction = "sum",则输出SSE
criterion = MSELoss(reduction = "mean") #实例化
criterion(yhat,y)
criterion = MSELoss(reduction = "sum")
criterion(yhat,y)

二、二分类交叉熵损失函数

L(w) = -\sum_{i=1}^{m}(y_{i}*ln(\sigma _{i})+(1-y_{i})*ln(1-\sigma _{i}))

1、Pytorch实现二分类交叉熵损失

#tensor实现二分类交叉熵损失
import torch
#Loss=-(y*ln(sigma)+(1-y)*ln(1-sigma))
#y - 真实标签
#sigma - sigmoid(z)
#z=Xw
#X,w 假设M个样本

m = 3*pow(10,3)
torch.random.manual_seed(99)
X = torch.rand((m,4),dtype=torch.float32)
w = torch.rand((4,1),dtype=torch.float32)
y = torch.randint(low=0,high=2,size=(m,1),dtype=torch.float32)

zhat = torch.mm(X,w) #矩阵相乘用torch.mm
sigma = torch.sigmoid(zhat)
sigma.shape

loss = -(1/m)*torch.sum(y*torch.log(sigma) + (1-y)*torch.log(1-sigma))
loss

2、调用类实现二分类交叉熵损失

nn模块中的类

class BCEWithLogitsLoss

class BCELoss


BCEWithLogitsLoss内置了sigmoid函数与交叉熵函数,它会自动计算输入值的sigmoid值,因此需要输入zhat与真实标签,且顺序不能变化,zhat必须在前。
BCELoss中只有交叉熵函数,没有sigmoid层,因此需要输入sigma与真实标签,且顺序不能变化。
同时,这两个函数都要求预测值与真实标签的数据类型以及结构(shape)必须相同,否则运行就会报错。

import torch.nn as nn

criterion = nn.BCELoss(reduction="mean") #实例化
loss = criterion(sigma,y)
loss

#当你有较高的精度要求,使用如下
criterion = nn.BCEWithLogitsLoss(reduction="sum")
loss = criterion(zhat,y)
loss

三、多分类交叉熵损失函数

1、Pytorch实现多分类交叉熵损失

import torch
import torch.nn as nn

m = 3*pow(10,3)
torch.random.manual_seed(99)
X = torch.rand((m,4),dtype=torch.float32)
w = torch.rand((4,3),dtype=torch.float32)
y = torch.randint(low=0,high=3,size=(m,),dtype=torch.float32)

zhat = torch.mm(X,w) 
#sigma = torch.softmax(zat)
#Logsoftmax - long + softmax,输入为zhat
#NLLLoss

logsm = nn.LogSoftmax(dim=1)  #实例化完成
logsm

logsigma = logsm(zhat)
logsigma

criterion = nn.NLLLoss()
criterion(logsigma,y.long())

2、调用类实现多分类交叉熵损失

criterion = nn.CrossEntropyLoss()#(reduction = "mean"/"sum"/"None")
criterion(zhat,y.long())

运行结果相同:

无论时二分类还是多分类,PyTorch都提供了包含输出层激活函数和不包含输出层激活函数的类两种选择。在实际神经网络建模中,类可以被放入定义好的Model类中去构建神经网络的结构,因此是否包含激活函数,就需要由用户来自行选择。
重视展示网络结构和灵活性,应该使用不包含输出层激活函数的类
通常在Model类中,__init__中层的数量与forward函数中对应的激活函数的数量是一致的,如果我们使用内置sigmoid/logsoftmax功能的类来计算损失函数,forward函数在定义时就会少一层(输出层),网络结构展示就不够简单明了,对于结构复杂的网络而言,结构清晰就更为重要。同时,如果激活函数是单独写的,要修改激活函数就变得很容易,如果混在损失函数中,要修改激活函数时就得改掉整个损失函数的代码,不利于维护。
重视稳定性和运算精度,使用包含输出层激活函数的类
如果在一个Model中,很长时间我们都不会修改输出层的激活函数,并且模型的稳定运行更为要紧,我们就使用内置了激活函数的类来计算损失函数。同时,就像之前提到的,内置激活函数可以帮助我们推升运算的精度。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyTorch是一个基于Python的开源机器学习框架,它提供了一个强大的深度神经网络工具包,被广泛应用于深度学习领域。 深度神经网络是一类由多层神经元组成的人工神经网络,可以用于解决各种复杂的机器学习问题。PyTorch提供了一套丰富的工具和函数,使得构建和训练深度神经网络变得简单而直观。 在 PyTorch 中,使用深度神经网络可以通过定义一个神经网络模型的类来实现。这个类可以包含多个层和神经元,并通过前向计算和反向传播实现梯度更新。PyTorch提供了各种不同类型的层,例如全连接层、卷积层、循环神经网络层等,可以根据具体的任务需求灵活选择不同的层类型。 PyTorch 的深度神经网络还支持在不同的计算设备上进行训练,例如CPU和GPU。通过简单的代码更改,可以实现在GPU上运行,加速训练过程。 在训练深度神经网络时,PyTorch提供了一套优化器(optimizer)来优化模型参数。常用的优化器包括随机梯度下降(SGD)、Adam、RMSprop等。此外,PyTorch还提供了一套完整的工具来监测和评估模型的性能,例如定义损失函数、计算准确率等。 总之,PyTorch深度神经网络是一个功能强大的框架,可以帮助研究人员和开发人员轻松构建和训练深度神经网络模型。它的简单易用和灵活性使得它成为当前深度学习领域广泛使用的工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wing以一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值