forward () got an unexpected keyword argument 'labels' 报错,优先核对实际 BERT 类与 forward

出现 forward () got an unexpected keyword argument 'labels' 这个报错,最常见原因是你加载的 BERT 底层类是 BertModel,而不是带分类头、支持 labels 入参的 BertForSequenceClassification 这类任务专用模型,BertModel 的 forward 接口本身不接收 labels 参数,你传 labels 进去就直接触发参数异常,排查的核心思路就是打印、核对当前实际加载的 BERT 模型类,确认 forward 接口定义。很多新手混用 AutoModel 和 AutoModelForSequenceClassification,AutoModel 默认加载基础 BertModel,只输出 hidden_states,没有内置 loss 计算逻辑,自然不支持 labels;而带任务头的 BERT 封装类,会在 forward 里面接收 labels,自动计算 loss;还有一种情况是自己手写继承 BERT 的自定义模型,forward 函数没有定义 labels 入参,训练代码却强行传入 labels,也会报这个错;解决时先确认模型类型,选错模型就替换成对应任务版本,自定义模型就要修改 forward 入参或者把 loss 计算挪到模型外面。

不同 BERT 类接口能力清单

模型类是否支持 forward (labels=xxx)用途说明
BertModel / AutoModel❌ 不支持基础 BERT 编码器,只输出隐层向量,无内置 loss
BertForSequenceClassification✅ 支持文本分类,传入 labels 自动返回 loss
BertForTokenClassification✅ 支持实体识别、token 级分类
BertForMaskedLM✅ 支持掩码语言模型预训练
自定义 BERT 子类看代码定义自己写 forward,没写参数就不支持 labels

排查步骤清单

  1. 打印模型类型,确认当前实际 BERT 类

print(type(model))

  1. 查看 forward 签名,核对接口参数

import inspect

print(inspect.signature(model.forward))

  1. 判断:如果是 BertModel,直接二选一改造
  2. 方案 A:更换加载方式,使用 ForSequenceClassification 系列
  3. 方案 B:不传 labels,拿到 outputs.last_hidden_state 后,外部自己写 CrossEntropyLoss
  4. 如果是自定义模型,修改 forward 函数,增加 labels 入参,内部实现 loss 计算
  5. 改完后重新运行,不再传入不存在的关键字参数

错误示例和正确示例

❌ 错误写法(用 BertModel 传 labels)

model = AutoModel.from_pretrained("bert-base-uncased")

out = model(input_ids=ids, attention_mask=mask, labels=labels)

✅ 正确写法 1(换成任务头模型,支持 labels)

model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")

out = model(input_ids=ids, attention_mask=mask, labels=labels)

✅ 正确写法 2(BertModel,外部算 loss)

model = AutoModel.from_pretrained("bert-base-uncased")

out = model(input_ids=ids, attention_mask=mask)

logits = classifier(out.last_hidden_state[:,0])

loss = loss_fn(logits, labels)

【相关 FAQ】

问题 1:forward () got an unexpected keyword argument 'labels' 报错,为什么要先核对实际 BERT 类与接口?

回答 1:forward () got an unexpected keyword argument 'labels' 报错根源是 BERT 模型类不支持 labels 参数,优先核对实际 BERT 类与 forward 接口,才能分清是选错模型,还是自定义 forward 缺少参数。

问题 2:BertModel 和 BertForSequenceClassification,在 forward 接口上关于 labels 的差别是什么?

回答 2:BertModel 的 forward 接口不包含 labels 参数,BertForSequenceClassification 的 forward 接口原生支持 labels,传入 labels 会自动计算分类 loss,这也是 forward () got an unexpected keyword argument 'labels' 高频踩坑点。

问题 3:已经用 BertModel,不想换模型,怎么规避 forward () got an unexpected keyword argument 'labels'?

回答 3:继续使用 BertModel 时不要在 forward 里传 labels,拿到 CLS 隐向量之后,在模型外部单独搭建分类层、手动计算 loss,避开核对实际 BERT 类与接口后发现的参数不匹配问题。

问题 4:我自己继承 BertModel 写自定义模型,报 forward () got an unexpected keyword argument 'labels' 怎么改?

回答 4:自定义 BERT 模型出现这个报错,核对实际 BERT 类与 forward 接口后,要么在 forward 函数定义里加上 labels 入参并实现 loss 逻辑,要么调用 forward 时不再传入 labels 参数。

【参考资料】

[2026-11-09](forward () got an unexpected keyword argument 'labels' BERT 模型类不匹配)CSDN

[2026-11-09](Hugging Face Transformers BertModel 与 BertForSequenceClassification 接口文档)Hugging Face Docs

[2026-11-08](transformers AutoModel、AutoModelForSequenceClassification 区别)Stack Overflow

【免责声明】

本内容针对 forward () got an unexpected keyword argument 'labels' 报错,以核对实际 BERT 类与 forward 接口为核心排查方案;不同 transformers 版本、自定义模型实现逻辑会有差异;部分老版本封装、第三方魔改 BERT 类接口存在变动,本文仅作为调试参考,不覆盖所有二次改造的 BERT 代码。

本文来自作者[雾棱关守使]投稿,不代表乌兰科技网立场,如若转载,请注明出处:https://www.wlcbnews.com/rgzn/202611/578.html

赞 (2)

今日大家都在搜的词:

发表回复

本站作者后才能评论

评论列表(4条)

  • 雾棱关守使
    雾棱关守使 2026年11月09日

    我是乌兰科技网的签约作者“雾棱关守使”!

  • 雾棱关守使
    雾棱关守使 2026年11月09日

    希望本篇文章《forward () got an unexpected keyword argument 'labels' 报错,优先核对实际 BERT 类与 forward》能对你有所帮助!

  • 雾棱关守使
    雾棱关守使 2026年11月09日

    本站[乌兰科技网]内容主要涵盖:互联网行业的追踪与探索

  • 雾棱关守使
    雾棱关守使 2026年11月09日

    本文概览:出现 forward () got an unexpected keyword argument labels 这个报错,最常见原因是你加载的 BERT 底层类是 BertModel,而不是带分类头、支持 labels 入参的 BertForSequenceClassification 这类任务专用模型,BertModel 的 forward 接口本身不接收 labels 参数,你传 labels 进去就直接触发参数异常,排查的核心思路就是打印、核对当前实际加载的 BERT 模型类,确认 forward 接口定义。很多新手混用 AutoModel 和 AutoModelForSequenceClassification,AutoModel 默认加载基础 BertModel,只输出 hidden_states,没有内置 loss 计算逻辑,自然不支持 labels;而带任务头的 BERT 封装类,会在 forward 里面接收 labels,自动计算 loss;还有一种情况是自己手写继承 BERT 的自定义模型,forward 函数没有定义 labels 入参,训练代码却强行传入 labels,也会报这个错;解决时先确认模型类型,选错模型就替换成对应任务版本,自定义模型就要修改 forward 入参或者把 loss 计算挪到模型外面。

联系我们

联系:143 0457 151

工作时间:周一至周五,9:30-18:30,节假日休息

关注我们