3 神经网络常见的损失函数

一、损失函数公式

1.均方误差(MSE):是真实值与预测值的差的平方和的均值。设真实值为y,预测值为pred,则其公式为:

loss=\frac{1}{n}\sum_{i=1}^{n}\left ( y_{i}-pred_{i} \right )^{2}

2.交叉熵损失函数(cross entropy error):设真实值为y,预测值为pred,则其公式为:

loss=-\frac{1}{n}\sum_{i=1}^{n}\left [ -y_{i}logpred_{i}-\left ( 1-y_{i}\right ) log\left ( 1-pred_{i} \right )\right ]

二、代码实现

1.均方误差(MSE)

import torch

#pred:预测值    target:真实值
def MES_Loss(pred,target):
    return torch.pow(pred-target,2)


if __name__ == "__main__":

    #1.随机生成pred和target,两个的维度相同
    pred=torch.randn(2,3)
    target= torch.randn(2, 3)
    
    #2.求真实值与预测值的差的平方
    ss=MES_Loss(pred,target)
    print(ss.sum(),ss.shape[0]*ss.shape[1])
    
    #3.对平方差求均值
    result=ss.sum()/(ss.shape[0]*ss.shape[1])
    print(result)

2.交叉熵损失函数(cross entropy error)

import torch

#1.预测值不能等于0或者1,否则公式中的对数没有意义,所以这个函数将预测值pred限定在[t_min,t_max]包含于(0,1)内
  #t是预测值,t_min是最小值,t_max是最大值
def clip_by_tensor(t, t_min, t_max):

    #t是浮点型
    t = t.float()

    #如果t大于t_min,则取t本身,否则若t小于t_min,则取取值为t_min
    result = (t >= t_min).float() * t + (t < t_min).float() * t_min

    # 如果t小于t_max,则取t本身,否则若t大于t_max,则取取值为t_max
    result = (result <= t_max).float() * result + (result > t_max).float() * t_max

    #返回修正后的t值result
    return result

#2.交叉熵损失函数

代码如下:

import torch

#1.预测值不能等于0或者1,否则公式中的对数没有意义,所以这个函数将预测值pred限定在[t_min,t_max]包含于(0,1)内
  #t是预测值,t_min是最小值,t_max是最大值
def clip_by_tensor(t, t_min, t_max):

    #t是浮点型
    t = t.float()

    #如果t大于t_min,则取t本身,否则若t小于t_min,则取取值为t_min
    result = (t >= t_min).float() * t + (t < t_min).float() * t_min

    # 如果t小于t_max,则取t本身,否则若t大于t_max,则取取值为t_max
    result = (result <= t_max).float() * result + (result > t_max).float() * t_max

    #返回修正后的t值result
    return result

#2.交叉熵损失函数
def BCELoss( pred, target):

    #x_min=1e-7,x_max=1-(1e-7)
    epsilon = 1e-7

    #对pred进行修正,将其限定在[x_min,x_max]内
    pred    = clip_by_tensor(pred, epsilon, 1.0 - epsilon)

    #将修正后的pred和target带入交叉熵公式
    output  = - target * torch.log(pred) - (1.0 - target) * torch.log(1.0 - pred)

    return output


if __name__ == "__main__":

    #1.随机生成pred和target,两个的维度相同
    pred=torch.randn(2,3)
    target= torch.randn(2, 3)

    #2.求真实值与预测值的差的平方交叉熵损失
    ss=BCELoss(pred,target)
    print(ss.sum(),ss.shape[0]*ss.shape[1])

    #3.对交叉熵损失求均值
    result=ss.sum()/(ss.shape[0]*ss.shape[1])
    print(result)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值