出现 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 |
排查步骤清单
- 打印模型类型,确认当前实际 BERT 类
print(type(model))
- 查看 forward 签名,核对接口参数
import inspect
print(inspect.signature(model.forward))
- 判断:如果是 BertModel,直接二选一改造
- 方案 A:更换加载方式,使用 ForSequenceClassification 系列
- 方案 B:不传 labels,拿到 outputs.last_hidden_state 后,外部自己写 CrossEntropyLoss
- 如果是自定义模型,修改 forward 函数,增加 labels 入参,内部实现 loss 计算
- 改完后重新运行,不再传入不存在的关键字参数
错误示例和正确示例
❌ 错误写法(用 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
评论列表(4条)
我是乌兰科技网的签约作者“雾棱关守使”!
希望本篇文章《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 计算挪到模型外面。