Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对于具有极高正负比的多标签分类,使用哪种损失函数和指标?_Python_Machine Learning_Keras_Multilabel Classification_Vgg Net - Fatal编程技术网

Python 对于具有极高正负比的多标签分类,使用哪种损失函数和指标?

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激活功能和分类交叉熵来检查其

我正在训练一个用于检测衣服属性的多标签分类模型。我正在Keras中使用迁移学习,对vgg-19模型的最后几层进行再培训

属性的总数是1000,其中99%是0。准确度、准确度、召回率等指标都会失败,因为该模型可以预测所有零,但仍然会获得很高的分数。二进制交叉熵、汉明损失等,在损失函数的情况下不起作用

我正在使用deep fashion数据集


那么,我可以使用哪些指标和损失函数来正确衡量我的模型呢?

我也遇到过类似的情况,就像你的情况一样

您可以使用输出层中的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函数中,您正在迭代不同的类。在成本函数中,您将迭代当前小批量中的示例