深度学习中常见的LOSS函数及代码实现

Introduction

训练深度学习模型地目的只有一个,尽可能的学习到训练数据的分布。像往常的考试一样,考试成绩会有一个分数作为评判标准,评价你对于知识点地掌握情况,以便后续针对性地去学习。深度学习也一样,需要一个数值对训练的效果进行评价。

在有监督学习中,这个数值也就是评价标准被称作loss值,即损失值。对于给定的输入x xx,对应标签值为y yy。定义深度学习模型的映射为f ( x ; θ ) f(x;\theta)f(x;θ)。输出的预测值为y ^ \hat{y}y^,损失函数L o s s LossLoss是用来计算便签值即真实值(Ground-Truth)y yy和预测值y ^ \hat{y}y^之间的差距。根据l o s s lossloss值,模型通过反向传播算法,不断的调整θ \thetaθ来拟合训练集的分布。
注意

  • 代价函数是整个训练集上所有样本误差的平均,本质上看和损失函数是同一个东西
  • 目标函数就是训练模型去拟合的映射

常见的损失函数

首先定义网络

  • 一个hidden layer,100个神经单元
  • in_channel = 10 , out_channels = 10 即输出10个类别
  • ReLU作为激活函数
class model(nn.Module):
    def __init__(self):
        super(model, self).__init__()
        self.fc1 = nn.Linear(10,100)
        self.fc2 = nn.Linear(100,10)

    def forward(self,x):
        out = self.fc1(x)
        out = F.relu(out)
        out = self.fc2(out)
        out = F.relu(out)

        return out

准备input 和 target即真实值y

net = model()
print(net)
x = torch.randn(20,10)
y = torch.randn(20,10)

MSELoss

y_pred = net(x)
mse_loss1 = ((y_pred - y).pow(2).sum()) # mse loss
print(mse_loss1.item())
# 调用torch nn模块中写好的MSEloss 函数 
mse_loss2 = torch.nn.MSELoss(reduction='mean') # 设定输出的loss是mean形式或者是sum
output = mse_loss2(y_pred,y)
print(output.item())
model(
  (fc1): Linear(in_features=10, out_features=100, bias=True)
  (fc2): Linear(in_features=100, out_features=10, bias=True)
)
0.8617805242538452
0.8617805242538452

可以发现两个输出完全一样

交叉熵损失函数

在二分类问题中,不论输出是向量或者标量,模型只会被预测为正负两类,即0或1。
分类问题中最常用的损失函数是交叉熵损失函数(Cross Entropy Loss)

CE可表示为BCE(Binary CE):
− ∑ i = 1 N y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) -\sum_{i=1}^N{y_i\log \left( \hat{y}_i \right)}+\left( 1-y_i \right) \log \left( 1-\hat{y}_i \right)i=1Nyilog(y^i)+(1yi)log(1y^i)
代码实现

import torch
import numpy as np

out = torch.randn(2,3) # 输入为2张图片,数据集共3个类别
print(out)
label = torch.tensor([[1,0,0],[0,0,1]])# 真实的label值

my_sigmoid = torch.nn.Sigmoid() # 实例化sigmoid
print(my_sigmoid(out))  # 将输出映射到(0,1)之间
my_bce_loss = torch.nn.BCELoss(reduction='none')
BCE_out = my_bce_loss(my_sigmoid(out),label.float())
print(BCE_out)

输出为:

OUT:
tensor([[ 1.1360,  0.3006, -1.0718],
        [ 1.2148, -2.8384, -0.8209]])
sigmoid_OUT:
tensor([[0.7569, 0.5746, 0.2551],
        [0.7711, 0.0553, 0.3056]])
BCE_OUT:
tensor([[0.2785, 0.8547, 0.2944],
        [1.4747, 0.0569, 1.1856]])

版权声明:本文为weixin_40756000原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。