应使用Hugging Face transformers库+TensorFlow后端,而非原生TF实现BERT分类;需显式设from_pt=True加载中文模型,tokenizer与model同名,输入必须为{'input_ids':..., 'attention_mask':...}字典格式。

直接用 transformers 库,别从头搭 TensorFlow BERT
TensorFlow 原生实现 BERT 分类模型不仅冗长、易出错,而且官方已不再主推 TF 版本的 BERT 训练流程。你现在看到的多数 TF 1.x 教程(比如用 tf.keras.layers.BertModel)要么已弃用,要么依赖过时的 tensorflow-hub 模块,加载预训练权重常报 ValueError: Shape mismatch 或 FailedPreconditionError。真正稳定、可复现、支持微调的做法是:用 Hugging Face 的 transformers 库 + TensorFlow 后端——它底层仍用 TF 执行,但封装了 tokenizer、model、trainer 全链路。
TFTrainer 不是必须的,model.fit() 更可控
很多人被文档误导,以为必须走 TFTrainer 流程。其实对标准文本分类任务(单标签、固定长度输入),直接用 Keras 原生训练接口更清晰、调试更方便。关键点在于:
-
TFBertForSequenceClassification返回的是TFSequenceClassifierOutput,但你只需取logits字段传给tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) - 输入必须经
AutoTokenizer处理成input_ids和attention_mask,且要 pad 到统一长度(padding='max_length',不能只用'longest',否则model.fit()会报Input tensors must have the same number of samples) - batch size 超过 8 就容易 OOM,建议先设为 4,用
tf.data.Dataset.from_tensor_slices()构建 dataset,并启用.cache().prefetch(tf.data.AUTOTUNE)
加载中文 BERT 模型时,from_pt=True 是默认陷阱
Hugging Face 中文 BERT 模型(如 bert-base-chinese)权重默认是 PyTorch 格式(.bin)。如果你在 TFBertForSequenceClassification.from_pretrained() 里没显式写 from_pt=True,TensorFlow 会尝试加载 .h5 文件,结果报 OSError: Can't load weights for 'bert-base-chinese'. Error: Unable to load weights...。正确写法是:
model = TFBertForSequenceClassification.from_pretrained(
"bert-base-chinese",
num_labels=2,
from_pt=True # 必须加这一行
)
另外,tokenizer 一定要用同名模型初始化:AutoTokenizer.from_pretrained("bert-base-chinese"),混用 bert-base-uncased 会导致中文 token 全变成 [UNK],准确率掉到接近随机水平。
立即学习“Python免费学习笔记(深入)”;
验证集 loss 不降?检查 attention_mask 是否参与计算
常见静默错误:训练 loss 下降但验证 loss 停滞甚至上升,预测全是同一类。大概率是 attention_mask 没传进 model 输入。BERT 需要 mask 来忽略 padding 位置,否则梯度更新污染。Keras model 输入必须明确包含两个键:
-
{'input_ids': input_ids, 'attention_mask': attention_mask}—— 正确 - 只传
input_ids或用 list 包裹([input_ids, attention_mask])—— 错误,model 会忽略attention_mask
验证时也必须同样构造输入字典,否则评估逻辑和训练不一致。这点在自定义 tf.data.Dataset 的 map 函数里最容易漏掉。
真正卡住的地方往往不是模型结构,而是 tokenizer 与 model 的版本对齐、mask 的键名拼写、以及 padding 策略是否全局一致——这些细节不报红,但会让模型学不到任何东西。


















