我正在训练CNN按主题对文本进行分类。当我使用二进制交叉熵时,我得到~80%的准确率,使用分类交叉熵时,我得到~50%的准确率。
我不明白为什么会这样。这是一个多类问题,这是不是意味着我必须使用分类交叉熵而二元交叉熵的结果是没有意义的?
model.add(embedding_layer)
model.add(Dropout(0.25))
# convolution layers
model.add(Conv1D(nb_filter=32,
filter_length=4,
border_mode='valid',
activation='relu'))
model.add(MaxPooling1D(pool_length=2))
# dense layers
model.add(Flatten())
model.add(Dense(256))
model.add(Dropout(0.25))
model.add(Activation('relu'))
# output layer
model.add(Dense(len(class_id_index)))
model.add(Activation('softmax'))
然后我用categorical_crossentropy作为损失函数编译它:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
or
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
直观地说,我为什么要使用分类交叉熵,我不明白为什么我用二进制得到好的结果,而用分类得到的结果很差。
一个简单的例子下一个多类设置来说明
假设您有4个类(其中一个是编码的),下面只有一个预测
True_label = [0,1,0,0]
Predicted_label = [0,0,1,0]
当使用categorical_crossentropy时,准确率仅为0,它只关心你是否得到了相关的类。
然而,当使用binary_crossentropy时,对所有类都计算精度,这个预测的准确率为50%。最终结果将是两种情况下个体准确度的平均值。
对于多类(类是互斥的)问题,建议使用categorical_crossentropy;对于多标签问题,建议使用binary_crossentropy。
一个简单的例子下一个多类设置来说明
假设您有4个类(其中一个是编码的),下面只有一个预测
True_label = [0,1,0,0]
Predicted_label = [0,0,1,0]
当使用categorical_crossentropy时,准确率仅为0,它只关心你是否得到了相关的类。
然而,当使用binary_crossentropy时,对所有类都计算精度,这个预测的准确率为50%。最终结果将是两种情况下个体准确度的平均值。
对于多类(类是互斥的)问题,建议使用categorical_crossentropy;对于多标签问题,建议使用binary_crossentropy。
您正在传递一个形状的目标数组(x-dim, y-dim),同时使用作为损失categorical_crossentropy。Categorical_crossentropy期望目标是形状(样本,类)的二进制矩阵(1和0)。如果你的目标是整数类,你可以通过以下方法将它们转换为预期的格式:
from keras.utils import to_categorical
y_binary = to_categorical(y_int)
或者,您也可以使用损失函数sparse_categorical_crossentropy,它需要整数目标。
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])