【发布时间】:2021-05-02 23:30:39
【问题描述】:
我有一个多标签分类问题,其中每个数据点恰好有 3 个标签(在许多标签中,比如 1000 个)。在我的模型中,我选择了前 5 个预测标签。
这是一个模型代码的sn-p:
def top_labels(true_label, pred_label):
return tf.keras.metrics.top_k_categorical_accuracy(true_label, pred_label, k=5))
model = Sequential()
model.add(Embedding(10000, 128, input_length=250))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(len(classes), activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy', top_labels])
我的问题是:预期的 top_k_categorical_accuracy 结果是什么?
如果我的训练数据如下:
data_idx features true_labels
1 blabla 2,3,4
2 blabla 1,2,3
而预测结果是
data_idx top_5 predicted_labels
1 1,4,5,8,9
2 4,5,6,7,8
我有两个猜测:
-
0.5:因为对于第一个数据点,有一个标签匹配(标签4),对于第二个数据点,没有标签匹配。
-
1/6:因为对于第一个数据点,3个真实标签中只有一个标签匹配,而对于第二个数据点,3个标签中没有一个标签匹配。
我觉得答案是 1),但是在测试了以下代码后我很困惑:
y_true = [[1, 1, 0, 0]] # assume 2 labels for a data point
y_pred = [[0, 0.9, 0.05, 0.95]]
m = tf.keras.metrics.top_k_categorical_accuracy(y_true, y_pred, k=3)
m.numpy() # result: array([0.], dtype=float32)
所以看起来 top_k_categorical_accuracy 只能处理 一个 真正的标签而不是多个真正的标签(它只接受第一个真正的标签而忽略其余的标签)。
但是,我不确定将最后一层的激活设置为sigmoid 是否会改变评估行为。
有人可以澄清一下吗?谢谢。
【问题讨论】:
标签: tensorflow machine-learning keras multilabel-classification