为了账号安全,请及时绑定邮箱和手机立即绑定

Keras binary_crossentropy vs categorical

Keras binary_crossentropy vs categorical

倚天杖 2019-09-19 10:56:53
我正在尝试培训CNN按主题对文本进行分类。当我使用二进制交叉熵时,我得到~80%的准确度,使用分类交叉熵我得到~50%的准确度。我不明白为什么会这样。这是一个多类问题,这是不是意味着我必须使用分类交叉熵,而二元交叉熵的结果是没有意义的?model.add(embedding_layer)model.add(Dropout(0.25))# convolution layersmodel.add(Conv1D(nb_filter=32,                    filter_length=4,                    border_mode='valid',                    activation='relu'))model.add(MaxPooling1D(pool_length=2))# dense layersmodel.add(Flatten())model.add(Dense(256))model.add(Dropout(0.25))model.add(Activation('relu'))# output layermodel.add(Dense(len(class_id_index)))model.add(Activation('softmax'))然后我使用它categorical_crossentropy作为损失函数编译它:model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])要么model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

这一切都取决于您正在处理的分类问题的类型。主要有三类;

  • 二元分类(两个目标类)

  • 多级分类(超过两个独家目标)

  • 多标签分类(超过两个非独占目标),其中多个目标类可以同时打开

在第一种情况下,应该使用二进制交叉熵,并且应该将目标编码为单热矢量。

在第二种情况下,应该使用分类交叉熵,并且应该将目标编码为单热矢量。

在最后一种情况下,应该使用二进制交叉熵,并且应该将目标编码为单热矢量。每个输出神经元(或单位)被视为一个单独的随机二进制变量,整个输出向量的损失是单个二进制变量丢失的乘积。因此,它是每个单个输出单元的二元交叉熵的乘积。

二元交叉熵定义如下: 二元交叉熵 和分类交叉熵定义如下: 分类交叉熵


查看完整回答
反对 回复 2019-09-19
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我遇到了一个“倒置”的问题 - 我使用categorical_crossentropy(有2个类)并且使用binary_crossentropy很差。似乎问题是错误的激活功能。正确的设置是:

  • for binary_crossentropy:sigmoid激活,标量目标

  • for categorical_crossentropy:softmax激活,单热编码目标


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 2959 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信