bert 多标签分类

qv7cva1a  于 3个月前  发布在  其他
关注(0)|答案(8)|浏览(49)

如何修改run_classifier.py以进行多类分类?我的意思是数据集中的一个项目可以属于多个类别,而不仅仅是一个类别。例如,一句话可以分配多个标签,如“weather”(关于天气)和“safety”(关于安全)。(即句子既与天气有关,也与安全有关)。

6bc51xsx

6bc51xsx1#

要轻松地做到这一点,可以在核心网络的顶部"插入"多个分类头(线性层),对每个标签执行一对一对多的二元分类任务。

c0vxltue

c0vxltue2#

@rodgzilla 损失函数是否也需要做任何更改?

wh6knrhe

wh6knrhe3#

如果你有 n 个不同的标签,你应该看到模型的输出为 n 个二分类输出。
(免责声明:我不习惯使用 TF,这可能不是 正确的方法 )
假设你有 batch_size 个数据点,其中有 4 个不同的标签,输入 X 的数据点属于标签 [True, False, True, False] ,意味着它属于类别 02
如果你使用我描述的方法,你的模型的输出将具有形状 [batch_size, n_labels, 2] (在我们的情况下为 [10, 4, 2] ),目标将具有形状 [batch_size, n_labels] (在我们的情况下为 [10, 4] )。
要使用 tf.nn.sparse_softmax_cross_entropy_with_logits ,你应该将Tensor重塑为形状为 [batch_size * n_labels, 2] 的logits和形状为 [batch_size * n_labels] 的目标(分别在我们的案例中为 [40, 2][40] )。
也许可以使用某种二元交叉熵损失来简化此操作,但如我之前所说,我不熟悉 TF。

vqlkdk9b

vqlkdk9b4#

如何修改run_classifier.py以进行多类分类?我的意思是数据集中的一个项目可以属于多个类别 - 而不仅仅是一个类别。例如,一个句子可以分配多个标签,如“weather”和“safety”(即句子关于天气和安全)。
将softmax层更改为sigmoid层,您可以查看https://github.com/yajian/bert.git

pgky5nke

pgky5nke5#

为什么性能如此低?
评估准确率 = 0.05
评估损失 = 0.1684

mbjcgjjk

mbjcgjjk6#

为什么性能如此低?
eval_accuracy = 0.05
eval_loss = 0.1684
嘿!我遇到了同样的问题!!!你找到解决方案了吗?谢谢!

dohp0rv5

dohp0rv57#

关于标签的问题。
https://github.com/yajian/bert.git中,标签是类别。而在MultiLabelTextProcessor中,从函数get_labels得到的结果是类别而不是数值(0或1)。但是在训练数据集中,标签是数值型的。

wribegjk

wribegjk8#

@NancyLele
数据集中的数值标签来自kaggle。classes.txt仅显示0和1的意义。

相关问题