如何修改run_classifier.py以进行多类分类?我的意思是数据集中的一个项目可以属于多个类别,而不仅仅是一个类别。例如,一句话可以分配多个标签,如“weather”(关于天气)和“safety”(关于安全)。(即句子既与天气有关,也与安全有关)。
6bc51xsx1#
要轻松地做到这一点,可以在核心网络的顶部"插入"多个分类头(线性层),对每个标签执行一对一对多的二元分类任务。
c0vxltue2#
@rodgzilla 损失函数是否也需要做任何更改?
wh6knrhe3#
如果你有 n 个不同的标签,你应该看到模型的输出为 n 个二分类输出。(免责声明:我不习惯使用 TF,这可能不是 正确的方法 )假设你有 batch_size 个数据点,其中有 4 个不同的标签,输入 X 的数据点属于标签 [True, False, True, False] ,意味着它属于类别 0 和 2 。如果你使用我描述的方法,你的模型的输出将具有形状 [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。
n
batch_size
X
[True, False, True, False]
0
2
[batch_size, n_labels, 2]
[10, 4, 2]
[batch_size, n_labels]
[10, 4]
[batch_size * n_labels, 2]
[batch_size * n_labels]
[40, 2]
[40]
vqlkdk9b4#
如何修改run_classifier.py以进行多类分类?我的意思是数据集中的一个项目可以属于多个类别 - 而不仅仅是一个类别。例如,一个句子可以分配多个标签,如“weather”和“safety”(即句子关于天气和安全)。将softmax层更改为sigmoid层,您可以查看https://github.com/yajian/bert.git。
pgky5nke5#
为什么性能如此低?评估准确率 = 0.05评估损失 = 0.1684
mbjcgjjk6#
为什么性能如此低?eval_accuracy = 0.05eval_loss = 0.1684嘿!我遇到了同样的问题!!!你找到解决方案了吗?谢谢!
dohp0rv57#
关于标签的问题。在https://github.com/yajian/bert.git中,标签是类别。而在MultiLabelTextProcessor中,从函数get_labels得到的结果是类别而不是数值(0或1)。但是在训练数据集中,标签是数值型的。
wribegjk8#
@NancyLele数据集中的数值标签来自kaggle。classes.txt仅显示0和1的意义。
8条答案
按热度按时间6bc51xsx1#
要轻松地做到这一点,可以在核心网络的顶部"插入"多个分类头(线性层),对每个标签执行一对一对多的二元分类任务。
c0vxltue2#
@rodgzilla 损失函数是否也需要做任何更改?
wh6knrhe3#
如果你有
n
个不同的标签,你应该看到模型的输出为n
个二分类输出。(免责声明:我不习惯使用 TF,这可能不是 正确的方法 )
假设你有
batch_size
个数据点,其中有 4 个不同的标签,输入X
的数据点属于标签[True, False, True, False]
,意味着它属于类别0
和2
。如果你使用我描述的方法,你的模型的输出将具有形状
[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。
vqlkdk9b4#
如何修改run_classifier.py以进行多类分类?我的意思是数据集中的一个项目可以属于多个类别 - 而不仅仅是一个类别。例如,一个句子可以分配多个标签,如“weather”和“safety”(即句子关于天气和安全)。
将softmax层更改为sigmoid层,您可以查看https://github.com/yajian/bert.git。
pgky5nke5#
为什么性能如此低?
评估准确率 = 0.05
评估损失 = 0.1684
mbjcgjjk6#
为什么性能如此低?
eval_accuracy = 0.05
eval_loss = 0.1684
嘿!我遇到了同样的问题!!!你找到解决方案了吗?谢谢!
dohp0rv57#
关于标签的问题。
在https://github.com/yajian/bert.git中,标签是类别。而在MultiLabelTextProcessor中,从函数get_labels得到的结果是类别而不是数值(0或1)。但是在训练数据集中,标签是数值型的。
wribegjk8#
@NancyLele
数据集中的数值标签来自kaggle。classes.txt仅显示0和1的意义。