一、损失函数公式
1.均方误差(MSE):是真实值与预测值的差的平方和的均值。设真实值为y,预测值为pred,则其公式为:
2.交叉熵损失函数(cross entropy error):设真实值为y,预测值为pred,则其公式为:
二、代码实现
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)