多分类问题的soft cross entropy 损失函数

在做多分类问题的时候,分类结果的损失函数经常使用交叉熵损失函数,对于预测结果,先经过softmax,然后经过log,然后再根据One hot向量只取得其中的一个值作为损失函数的吸收值,比如,logsoftmax后的值为[-0.6, -0.12 , -0.33, -0.334, -0.783],假设one hot label 为[ 0,0,0,0,1 ],则损失函数的值为 Loss = 0.783,,也就是说,只有一个值纳入了计算,我就在想,可不可以将所有的值都纳入计算呢,如果这样的话,就得将label转为soft label ,为 [0.2, 0.2 , 0.2, 0.2, 1],将0 Label 的地方设置为 1/(label.shape[0]),再进行计算损失,则这个对应的损失函数的pytorch实现如下所示:

class softcrossentropy(nn.Module):
    def __init__(self):
        super( softcrossentropy, self ).__init__()
        self.cel = nn.CrossEntropyLoss()
        self.logsoftmax = nn.LogSoftmax(dim=1)

    def forward(self, inputs, labels):
        loss_tra_cel = self.cel( inputs, labels )

        ls = (-1) * self.logsoftmax(inputs)
        ls_sum = torch.sum(ls, dim=1) / inputs.shape[1]

        loss_soft_cel = torch.sum( ls_sum ) / inputs.shape[0]

        loss = loss_tra_cel + loss_soft_cel
        return loss

     分别利用上面的softccrossentroy和正常的crossentropy作为分类损失函数损失函数,对market1501进行行人重试别的训练,记录每个mini batch的train loss 、train accuracy、val loss 、val accuracy,在训练过程中将这些数据都保存起来,后期进行比对分析。训练的数据在这了:链接: https://pan.baidu.com/s/18jYFFd9LaPrbd72OdHjdpw  密码: hg9r

利用训练保留的数据进行后期分析比对,文件目录如下所示:

mat.py的代码如下:

import scipy.io
import matplotlib.pyplot as plt
# train_acc
# train_loss
# val_loss
# val_acc

soft_res = scipy.io.loadmat('soft_mini_batch_data.mat')
soft_train_acc = soft_res['train_acc']

tra_res = scipy.io.loadmat('tra_mini_batch_data.mat')
tra_train_acc = tra_res['train_acc']

soft_acc_list = soft_train_acc[0].tolist()
train_acc_list = tra_train_acc[0].tolist()

data_length = int(len( soft_acc_list )/10)
x_label = [ i for i in range(data_length) ]

fig, ax = plt.subplots()
ax.plot( x_label, soft_acc_list[0:data_length],label = 'soft' )
ax.plot( x_label, train_acc_list[0:data_length], label = 'tra' )
ax.set_xlabel('mini batch num')
ax.set_ylabel('accuracy')
ax.set_title('god bless')
ax.legend()
plt.show()

      这里比较了在不同的criterion下使用同样的方法,对同样的数据进行训练的过程中的几个数值的变化情况。这个代码只比较了每个Mini batch的准确率情况。对比图如下所示:

如果在面试中被问到CrossEntropy这个函数,你可以先简单介绍一下CrossEntropy的定义和用途,然后再详细说明它的计算公式和实现方法,最后可以举一个实际的例子来展示如何使用CrossEntropy函数进行模型训练。 具体来说,你可以按照以下步骤回答该问题: 1. 简单介绍CrossEntropy的定义和用途,例如: - CrossEntropy是一种常用的损失函数,通常用于分类问题中的模型训练。 - 它基于信息论的概念,用于衡量两个概率分布之间的交叉熵距离。 - 在模型训练中,我们将模型输出的概率分布与真实标签的概率分布进行比较,计算它们之间的交叉熵,作为模型的损失函数,通过反向传播算法进行优化,从而提高模型的准确性。 2. 详细说明CrossEntropy的计算公式和实现方法,例如: - CrossEntropy的计算公式为:$CE(p,q)=-\sum_{i=1}^n p_i \log q_i$,其中$p$是真实标签的概率分布,$q$是模型输出的概率分布,$n$是类别数。 - 在PaddlePaddle中,可以使用`paddle.nn.functional.cross_entropy`函数来计算CrossEntropy损失,其函数原型为:`paddle.nn.functional.cross_entropy(input, label, weight=None, reduction='mean', ignore_index=-100, soft_label=False)`。其中,`input`是模型的输出张量,`label`是真实标签张量,`weight`是各类别的权重,`reduction`指定损失的规约方式,`ignore_index`指定忽略的标签,`soft_label`指定是否使用软标签。 3. 举一个实际的例子来展示如何使用CrossEntropy函数进行模型训练,例如: - 假设我们有一个分类模型,要将输入的图像分为10个类别。 - 我们使用CrossEntropy损失作为模型的损失函数,通过反向传播算法来优化模型。 - 在训练过程中,我们将模型的输出张量和真实标签张量送入`paddle.nn.functional.cross_entropy`函数中,计算模型输出的概率分布与真实标签的概率分布之间的交叉熵,作为模型的损失。 - 通过反向传播算法,更新模型的参数,从而提高模型的准确性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值