Python 对于具有极高正负比的多标签分类,使用哪种损失函数和指标?
我正在训练一个用于检测衣服属性的多标签分类模型。我正在Keras中使用迁移学习,对vgg-19模型的最后几层进行再培训 属性的总数是1000,其中99%是0。准确度、准确度、召回率等指标都会失败,因为该模型可以预测所有零,但仍然会获得很高的分数。二进制交叉熵、汉明损失等,在损失函数的情况下不起作用 我正在使用deep fashion数据集Python 对于具有极高正负比的多标签分类,使用哪种损失函数和指标?,python,machine-learning,keras,multilabel-classification,vgg-net,Python,Machine Learning,Keras,Multilabel Classification,Vgg Net,我正在训练一个用于检测衣服属性的多标签分类模型。我正在Keras中使用迁移学习,对vgg-19模型的最后几层进行再培训 属性的总数是1000,其中99%是0。准确度、准确度、召回率等指标都会失败,因为该模型可以预测所有零,但仍然会获得很高的分数。二进制交叉熵、汉明损失等,在损失函数的情况下不起作用 我正在使用deep fashion数据集 那么,我可以使用哪些指标和损失函数来正确衡量我的模型呢?我也遇到过类似的情况,就像你的情况一样 您可以使用输出层中的softmax激活功能和分类交叉熵来检查其
那么,我可以使用哪些指标和损失函数来正确衡量我的模型呢?我也遇到过类似的情况,就像你的情况一样 您可以使用输出层中的softmax激活功能和分类交叉熵来检查其他指标,如精度、召回率和f1分数。您可以使用sklearn库,如下所示:
from sklearn.metrics import classification_report
y_pred = model.predict(x_test, batch_size=64, verbose=1)
y_pred_bool = np.argmax(y_pred, axis=1)
print(classification_report(y_test, y_pred_bool))
至于训练阶段,据我们所知,准确度指标如下
model.compile(loss='categorical_crossentropy'
, metrics=['acc'], optimizer='adam')
如果有帮助,您可以使用matplotlib按如下方式绘制培训阶段损失和准确性的培训历史记录:
hist = model.fit(x_train, y_train, batch_size=24, epochs=1000, verbose=2,
callbacks=[checkpoint],
validation_data=(x_valid, y_valid)
)
# Plot training & validation accuracy values
plt.plot(hist.history['acc'])
plt.plot(hist.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
# Plot training & validation loss values
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
哈桑的建议是不正确的- 分类交叉熵损失或Softmax损失是Softmax激活加上交叉熵损失。如果我们使用这种损失,我们将训练CNN为每个图像输出C类的概率。它用于多类分类 您需要的是多标签分类,因此您将使用二进制交叉熵损失或Sigmoid交叉熵损失。这是一个S形激活加上交叉熵损失。与Softmax损耗不同,它对每个矢量分量(类)是独立的,这意味着为每个CNN输出矢量分量计算的损耗不受其他分量值的影响。这就是为什么它被用于多标签分类,其中对属于某个类的元素的洞察不应该影响另一个类的决策
现在,为了处理类不平衡,可以使用加权的Sigmoid交叉熵损失。因此,您将根据正面示例的数量/比率对错误预测进行惩罚。实际上,您应该使用tf.nn.weighted\u cross\u entropy\u和logits。
它不仅适用于多标签分类,而且还具有一个pos_权重,可以像您所期望的那样关注正类。多类和二元类分类确定输出单元的数量,即最后一层中的神经元数量。 多标签和单标签决定了应使用的最终层激活功能和丢失功能的选择。 对于单个标签,标准选择是带分类交叉熵的Softmax;对于多标签,切换到具有二进制交叉熵的Sigmoid激活 分类交叉熵: 二元交叉熵:
C
是类数,m
是当前小批量中的示例数L
是损失函数,J
是成本函数。你也可以看到。
在loss函数中,您正在迭代不同的类。在成本函数中,您将迭代当前小批量中的示例