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

微调Flair NER模型出现RuntimeError(state_dict键缺失)的解决方法

解决Flair NER微调时state_dict缺失key的问题

问题原因

你加载的预训练ner模型自带一套固定结构的嵌入层,但你自定义了新的StackedEmbeddings却没有替换到预训练模型中,导致模型权重加载时,预训练权重的结构和当前模型的嵌入层结构不匹配,从而触发Missing key(s) in state_dict错误。

解决方案

核心是将自定义的嵌入层替换掉预训练模型中原有的嵌入层,确保模型结构和权重加载逻辑一致。修正后的完整代码如下:

from flair.embeddings import WordEmbeddings, StackedEmbeddings
from flair.models import SequenceTagger
from flair.trainers import ModelTrainer
from flair.data import Corpus

# 定义自定义嵌入层
embedding_types = [
    WordEmbeddings('glove'),
    WordEmbeddings('extvec'),
    WordEmbeddings('crawl'),
]
embeddings = StackedEmbeddings(embeddings=embedding_types)

# 加载预训练NER模型
pretrained_model = SequenceTagger.load('ner')

# 替换模型的嵌入层为自定义版本
pretrained_model.embeddings = embeddings

# 初始化训练器并启动微调
trainer = ModelTrainer(pretrained_model, corpus)
trainer.train(
    'resources/taggers/example-ner',
    learning_rate=0.1,
    mini_batch_size=32,
    max_epochs=3
)

补充说明

  • 替换嵌入层后,新嵌入层的权重会随机初始化,而模型的其他组件(如序列编码器、标签分类器)会保留预训练权重,这是符合微调逻辑的设置。
  • 若希望嵌入层参与训练,无需额外设置(默认embeddings.trainable = True);如果需要冻结嵌入层,可添加embeddings.trainable = False。
  • 不要尝试通过修改权重字典来匹配结构,直接替换嵌入层是最简洁可靠的方式。

内容的提问来源于stack exchange,提问作者nasr el hamzaoui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:42:40