您当前的位置:首页 > IT编程 > 深度学习
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:keras:binary_crossentropy和categorical_crossentropy的区别

51自学网 2020-09-24 17:40:08
  深度学习
这篇教程keras:binary_crossentropy和categorical_crossentropy的区别写得很实用,希望能帮到您。

关于binary_crossentropy和categorical_crossentropy的区别

1.CE

[公式]%20,%20f(xi)->y_hat

二分类举例而言,y=[[0,1],[1,0]]%20(两个样本,一个标签1,一个0)

y_hat%20=[[0.5,0.5],%20[0.8,0.2]]

第一个样本的CE=-[0,1]*ln([0.5,0.5])=-ln(0.5)

第二个样本的CE=-[1,0]*ln([0.8,%200.2])=-ln(0.8)

总CE=两个样本的平均

keras里面的CE是均值的CE,所以上面两个样本需要除以2,所以在keras下面敲代码

CE(y,y_hat)输出是0.458

需要注意的是,keras里面的CE会自动帮你归一化

y_hat=[0.2,0.8] 和 y_hat=[2.,8.]结果是完全一样的

 

2.BCE

之前没有听过这个loss,因为觉得CE可以兼容二分类的情况,今天看到keras里面特意实现了这个,想搞明白,于是找了些资料,这一找,可算是把自己绕了进去,主要来自这篇blog

zhuanlan.zhihu.com/p/48 ,我一度觉得这篇文章是错的,但是最后明白,这篇文章基本还是对的。

[公式]

还是用二分类举例而言,y=[[0,1],[1,0]] (两个样本,一个标签1,一个0)

y_hat =[[0.5,0.5], [0.8,0.2]]

第一个样本的BCE=-([0, 1]*ln([0.5,0.5]) + (1-[0,1])*ln([0.5,0.5]))/2=-ln(0.5)

第二个样本的BCE=-([1,0]*ln([0.8, 0.2]) + (1-[1,0])*ln([0.2,0.8]))/2=-ln(0.8)

这个例子和CE得例子结果一样,是因为两个预测向量的reduce_sum=1,所以BCE的前后两项loss相等,所以CE=BCE,如果reduce_sum!=1,那么输出就不同了。

所以BCE相对于CE加入了一项对非1预测部分的惩罚,CE最大化onehot向量中1那个位置的预测值,而BCE在最大化那个位置的值得同时,降低onehot其他位置值得预测值。

所以直观上,BCE是比CE更好的loss(有待检验)

另外,BCE的代码不会做clip操作

[8,2] and [0.8,0.2]是不同的,在BCE里面,会严格执行1-yi操作,所以[8,2]经过1-yi之后是【-7,-1】keras里面小于eplison的值都会被标成eplison,这时候会发现loss=-7.66,这是bce的极值,输出这个值说明有一个样本的y大于1了

写blog之前觉得,BCE完全可以由CE取代,写的过程中大概明白了,bce每个样本的loss都由两部分组成,在增大1对应预测值的同时,减少非1位置的值,CE只关心1位置的预测值。

对于一个真实类别为[1,0,0]的样本BCE认为[0.8,0.1,0.1]的预测比[0.8,0.2,0]的预测要好,而CE认为他们是一样的。

总结:

二分类问题中,仅当reduce_sum(y_pred)=1的时候,BCE=CE

BCE比CE多一项,这一项希望在预测类别上预测值大的前提下,其他类别上,预测值均匀。CE不考虑其他预测值。

keras里面,BCE没有归一化操作,CE有。 CE里面[8,2]==[0.8,0.2] BCE不等价

BCE的预测值,不要大于1,否则会被置为eplison,从而获得最大loss


keras中两种交叉熵损失函数的探讨
Keras中自定义目标函数(损失函数)
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。