You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TFBertForSequenceClassification多标签分类微调报错排查

波斯语BERT多标签分类微调问题解决

方案1:直接使用TFBertForSequenceClassification的错误修复

错误原因

你误用了损失函数:SparseCategoricalCrossentropy是单标签多分类专用,要求标签为整数索引(形状(batch_size,)),但多标签任务的标签是7维one-hot向量(形状(batch_size,7)),维度完全不匹配;同时未明确指定多标签任务类型,导致模型输出逻辑不符合需求。

修复代码

from transformers import TFBertForSequenceClassification, BertTokenizer
import tensorflow as tf

# 加载分词器与模型
tokenizer = BertTokenizer.from_pretrained("HooshvareLab/bert-fa-base-uncased")
model = TFBertForSequenceClassification.from_pretrained(
    "HooshvareLab/bert-fa-base-uncased",
    num_labels=7,
    problem_type="multi_label_classification"  # 关键:指定多标签任务类型
)

# 配置训练参数
loss = tf.keras.losses.BinaryCrossentropy(from_logits=False)  # 模型自动添加sigmoid,无需传logits
optimizer = tf.keras.optimizers.Adam(learning_rate=2e-5)

model.compile(optimizer=optimizer, loss=loss, metrics=["accuracy"])

# 训练时确保数据集标签为7维one-hot向量,输入为包含input_ids、attention_mask的字典
# model.fit(your_dataset, epochs=3)

关键说明

指定problem_type="multi_label_classification"后,模型会自动在分类头后添加sigmoid激活层,将输出转为每个标签的独立概率值,此时搭配BinaryCrossentropy(多标签任务的标准损失)完全匹配。


方案2:自定义TFBertForMultilabelClassification的错误修复

错误原因

自定义模型时,输入数据格式错误(传入了元组而非字典),导致模型调用时无法识别input_ids、attention_mask的键名;同时可能存在模型输出逻辑的疏漏。

修复代码

from transformers import TFBertModel
import tensorflow as tf

class TFBertForMultilabelClassification(tf.keras.Model):
    def __init__(self, model_name, num_labels):
        super().__init__()
        self.bert = TFBertModel.from_pretrained(model_name)
        self.classifier = tf.keras.layers.Dense(num_labels, activation="sigmoid")

    def call(self, inputs):
        # 接收字典格式的输入,提取input_ids和attention_mask
        bert_output = self.bert(input_ids=inputs["input_ids"], attention_mask=inputs["attention_mask"])
        cls_token = bert_output.last_hidden_state[:, 0, :]  # 取<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]>token的特征输出
        return self.classifier(cls_token)

# 初始化模型
model = TFBertForMultilabelClassification("HooshvareLab/bert-fa-base-uncased", num_labels=7)

# 配置训练参数
loss = tf.keras.losses.BinaryCrossentropy()
optimizer = tf.keras.optimizers.Adam(learning_rate=2e-5)

model.compile(optimizer=optimizer, loss=loss, metrics=["accuracy"])

# 必须将数据集格式转为(输入字典,标签)的结构
def format_dataset(input_ids, attention_mask, labels):
    return {"input_ids": input_ids, "attention_mask": attention_mask}, labels

# 假设your_raw_dataset是包含(input_ids, attention_mask, labels)的原始数据集
formatted_dataset = your_raw_dataset.map(format_dataset)
# model.fit(formatted_dataset, epochs=3)

关键说明

自定义模型的call方法依赖字典格式的输入来提取特征,因此必须通过map方法将原始数据集的元组结构转换为字典输入+标签的形式,避免出现"元组无keys属性"的错误。


核心注意事项

  1. 多标签分类的标签必须是one-hot编码的多维向量,不能用整数索引;
  2. 损失函数固定用BinaryCrossentropy,配合sigmoid激活层实现每个标签的独立二分类判断;
  3. 使用预训练模型时,要么通过problem_type指定任务类型,要么手动构建带sigmoid的分类头。

内容的提问来源于stack exchange,提问作者Areza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:45:49