损失函数binary_crossentropy和categorical_crossentropy在单标签多分类模型中评价效果差异较大的原因

在tensorflow2.0中用cifar10数据集中发现用 binary_crossentropy 和categorical_crossentropy不同的交叉熵损失函数模型在测试集上的效果差异较大,用binary_crossentropy的效果要优于categorical_crossentropy,
在网上查阅资料后发现原因如下,参考来源(https://zhuanlan.zhihu.com/p/48078990)

原文如下
在运行keras的代码时,发现一个有趣的现象,当使用binary_crossentropy和categorical_crossentropy时,其日志中输出的acc有较大差异,后经多方查阅,发现原因是keras对两者使用了不同的metrics计算acc,对于binary_crossentropy使用的是binary_accuracy,对于后者使用的是categorical_accuracy,读者有兴趣可以参考官方源码(https://github.com/keras-team/keras/blob/master/keras/metrics.py)
如果不想使用默认值可以在调用compile手动设置metrics参数:

model.compile(optimizer=optimizers.Adam(lr=args.lr),
              loss=['binary_crossentropy'],
              metrics=["categorical_accuracy"])

在这过程中也顺便了解了binary_crossentropy和categorical_crossentropy损失函数的计算过程,并在程序上逐步进行运行验证,故在此梳理总结下,以加深自己理解。

在网上看资料或是经常听别人说,binary_crossentropy一般用于二分类任务,categorical_crossentropy用于多分类任务,但只是知其然不知其所以然,在了解这两者的概念和公式之后有了小小的了解

categorical_crossentropy(CE)
公式如下,其中x为输入,C为分类类别数,yi为第i个类别对于的真实标签
在这里插入图片描述
1,CE用于二分类,只有一个分类输出,i=1,当标签y为0时,由公式可以知,CE=0,对于负样本而言loss值为0,无法对负样本进行参数调整,相当于对负样本随机预测,若2分类任务对y进行onehot变化,使用softmax+CE是否可行呢?推论来看的话是可行的,实际未进行实践,待验证

2,CE用于单标签多分类,在tf2.0中使用 CE时需要将y值进行onehot变换,对于单个样本而言,CE是一个数值,计算公式为:在这里插入图片描述
例如一个3分类任务中,y标签为2,进行onehot变换后为[0,0,1],CE=-(0logf(x)+0logf(x)+ylogf(x)),同时因为进行CE计算时会先进行softmax归一化操作,使得类别的输出概率和为1,某个类别输出概率会受其他类别影响,故多分类中的CE不会使模型收敛缓慢

binary_crossentropy(BCE)
公式如下,其中x为输入,i属于[1,C]
在这里插入图片描述

1,BCE在进行计算之前会对原始输出进行sigmoid处理,若是多分类中,每个类别的概率在(0,1)之间,类别间的概率是独立的,既对类别进行是或否的判断,从而BCE的结果是一个向量,在loss值计算时是计算向量的平均值,
在这里插入图片描述
2,使用binary_crossentropy在tf2.0用评价指标accuracy是默认使用是binary_accuracy,binary_accuracy的计算是判断类别中的概率是否大于50%,在二分类中若有4个样本y=[0,0,0,1],y_pred=[0.2,0.3,0.7,0.8],binary_accuracy=3/4=75%,
若是多分类中,binary_accuracy又是如何计算的?假设4分类任务中有2个样本,y=[[0,0,0,1],[0,0,1,0]],y_pred=[[0.2,0.3,0.6,0.7],[0.2,0.3,0.8,0.1]],用binary_accuracy进行判断,y_pred=>y_pred1=[[0,0,1,1],[0,0,1,0]],以下为猜测部分,善待验证。binary_accuracy=7/8=87.5%

以上仅是本人的个人理解及备忘笔记,可能存在理解有误的情况,若有发现错漏的地方,烦请指正,

你可能感兴趣的:(tensorflow2,深度学习,tensorflow)