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

如何修改已微调7分类BERT模型以适配16分类任务?

解决7分类BERT转16分类微调的结构问题

你现有一个完成7分类微调的BERT模型,在16分类数据集上再次微调时,出现以下错误:

Node:
'sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits'
Received a label value of 9 which is outside the valid range of [0, 8). Label values: 6 2 0 6 0 9 6 6 0 6 6 0 7 2 2 2
[[{{node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]] [Op:__inference_train_function_43224]

问题根源是原模型的最终分类层仅适配7分类任务,输出维度对应7个类别,无法兼容16分类的标签范围,需要修改模型分类头的输出类别数为16,具体修改代码如下:

修改后的模型构建代码

MODEL_NAME_OR_PATH = 'some pretrained model for 7 class classification on huggingface repo'
model = build_model(MODEL_NAME_OR_PATH, learning_rate=LEARNING_RATE)

def build_model(model_name, learning_rate=3e-5):
    # 指定16分类,允许权重维度不匹配以重新初始化分类头
    model = TFBertForSequenceClassification.from_pretrained(
        model_name,
        num_labels=16,
        ignore_mismatched_sizes=True
    )

    optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    metric = tf.keras.metrics.SparseCategoricalAccuracy('accuracy')
    model.compile(optimizer=optimizer, loss=loss, metrics=[metric])

    return model

r = model.fit(
    train_dataset,
    validation_data=valid_dataset,
    steps_per_epoch=train_steps,
    validation_steps=valid_steps,
    epochs=EPOCHS,
    verbose=1)

关键修改说明

  • num_labels=16:明确告知模型当前任务是16分类,让模型创建对应维度的输出层(输出16个类别的logits)。
  • ignore_mismatched_sizes=True:由于原模型的分类层权重是针对7分类训练的,维度与16分类不匹配,该参数会跳过加载原分类层的权重,自动重新初始化新的分类层权重,避免维度冲突错误。

额外注意:确保你的16分类数据集标签是0到15的连续整数,因为当前使用的SparseCategoricalCrossentropy要求标签为稀疏格式(即每个样本对应一个整数标签,范围覆盖所有类别)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:57:53