Created by: HawChang
BUG说明:
MultiLabelClassifierTask
的predict
函数返回结果有误。期待的返回形式为[{label_1:value_1},{label_2:value_2},...,{label_n:value_n}]
,实际为[{label_x1:value_y1},{label_x2:value_y2},...,{label_xn:value_yn}]
,其中xi!=yi
,即返回结果中的标签名称与实际该位置的标签不符。
BUG复现
- 切换目录到PaddleHub/demo/multi_label_classification/
- 运行run_classifier.sh得到finetune的toxic数据集多标签分类模型,该模型3epoch后auc可达98.28%。
- 修改predict.py文件中,最后预测改为
data=[["Would you both shut up, you don't run wikipedia, especially a stupid kid"]]
,该句在训练数据集中,其标注的多分类标签为"1,0,0,0,1,0"
,由toxic数据集的训练数据集的header可知其类别依次是"toxic,severe_toxic,obscene,threat,insult,identity_hate"
。 - 运行run_predict.sh,可得到步骤3中句子的预测结果为
[[{'severe_toxic': 1}, {'identity_hate': 0}, {'obscene': 0}, {'insult': 0}, {'threat': 1}, {'toxic': 0}]]
。 - 通过分析我们可以看出。
- 完全按预测结果来看,则该预测结果完全不准确,其预测该句子的标签为"severe_toxic"和"threat",而实际标注标签为"toxic"和"insult"。
- 而从另一方面看,预测结果和标注标签按位置一一比较的话,其各位置的标签值和标注的一致,但其对应的标签名不一致。
问题分析:
返回结果中各标签的value顺序是与用来初始化reader
的dataset
中的label_list
一致的,而返回结果中的表签名称的顺序不是。其问题在于MultiLabelClassifierTask
重写_postprocessing
函数时,其确定各位置标签名称时,使用的label_list的生成方法为list(self._base_data_reader.label_map.keys())
,而显然字典的keys()不会保持标签顺序。
问题解决:
直接使用dataset
中的label_list
,该变量中标签名的顺序与输出结果各值对应的标签顺序一致。另外,在评估函数中_calculate_metrics
也应该改为以label_list
中的标签顺序为准。
PS 1. 该pull_request改自#732,将base由release/v1.6改为release/v1.7。 2. 该bug和解决在v1.6验证