直接用automodel.from_pretrained()加载的是纯编码器,无分类头;需任务专用类如automodelforsequenceclassification配合num_labels才能微调;tokenizer必须严格匹配模型id,保存加载须整套进行,避免config或分词器缺失。

怎么用 transformers 加载 Hugging Face 上的 BERT 模型
直接用 AutoModel.from_pretrained() 和 AutoTokenizer.from_pretrained() 就能加载,但必须注意模型 ID 是否对应你真正要的任务类型。比如 bert-base-uncased 是通用 BERT,不带下游任务头;而 dslim/bert-base-NER 已经带了命名实体识别头,不能直接拿来当文本分类用。
常见错误是把 from_pretrained("bert-base-uncased") 当成“开箱即用的分类器”——它只是编码器,没 classifier 层。如果你要微调,得自己加或用 AutoModelForSequenceClassification 这类任务专用类。
- 加载纯编码器(适合自定义下游结构):
AutoModel.from_pretrained("bert-base-uncased") - 加载带分类头的模型(推荐初学者):
AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2) - tokenizer 必须匹配模型:同样用
AutoTokenizer.from_pretrained("bert-base-uncased"),别混用不同语言或大小写的 tokenizer
微调时为什么 Trainer 报 ValueError: Expected input batch_size (X) to match target batch_size (Y)
这几乎全是 label 格式不对导致的。BERT 微调要求 labels 是 1D 张量,shape 为 (batch_size,),且 dtype 是 torch.long。常见坑:
- 用了 numpy array 或 Python list 当 labels,没转成 tensor:
torch.tensor(labels, dtype=torch.long) - label 是 2D(比如加了额外维度),例如
labels.reshape(-1, 1)—— 这会让 Trainer 误以为是多标签任务 - dataset 的
__getitem__返回了 dict 但 key 名不是"labels"(Trainer默认只认这个 key) - 用了
TextClassificationPipeline或预测脚本里的逻辑去构造训练数据,结果把 test 数据格式套到了 train 上
微调完怎么保存和复用模型
保存不是只存 .bin 文件就够了。Trainer.save_model() 会同时写入模型权重、config.json、tokenizer_config.json 和 vocab.txt(或 tokenizer.json),缺一不可。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
加载时也必须成套加载,否则可能 token id 对不上、config 缺失导致 num_labels 错乱。最稳妥方式是:
- 保存:
trainer.save_model("./my_bert_finetuned") - 加载模型+tokenizer:
model = AutoModelForSequenceClassification.from_pretrained("./my_bert_finetuned")+tokenizer = AutoTokenizer.from_pretrained("./my_bert_finetuned") - 别手动 copy
pytorch_model.bin到别的目录再单独加载——config 和 tokenizer 信息很可能丢失
为什么在 CPU 上跑微调很慢,甚至 OOM
不是因为模型太大,而是默认 batch size 和 sequence length 太激进。BERT 在长文本上显存/内存消耗是序列长度的平方级增长。
- 先强制降参:
per_device_train_batch_size=4、max_length=128(别一上来就用 512) -
Trainer默认不做梯度裁剪,训练不稳定时加上max_grad_norm=1.0 - CPU 上禁用
fp16=True(会报错),也别设ddp_find_unused_parameters=True(CPU 不支持 DDP) - 如果只是验证流程是否通,用
max_steps=10和evaluation_strategy="steps"快速过一遍
真正容易被忽略的是 tokenizer 的 truncation 和 padding 设置——没开 truncation=True,遇到超长文本会直接 OOM;只开 padding=True 不指定 max_length,padding 会按 batch 内最长样本对齐,反而放大内存波动。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










