Spacy实体链接器结合Transformer Listener遇维度未设置错误
问题:使用Transformer嵌入的Spacy实体链接器维度错误
问题背景
我有一个由Transformer和NER组件构成的预训练管道,尝试创建一个使用Transformer生成的嵌入而非CNN的实体链接器,添加链接器的代码如下:
entity_linker = nlp.add_pipe("entity_linker",config = { "labels_discard": [], "n_sents": 0, "incl_prior": True, "incl_context": True, "model": { "@architectures": "spacy.EntityLinker.v2", "tok2vec": { "@architectures" : "spacy-transformers.TransformerListener.v1", "pooling" : {"@layers":"reduce_mean.v1"}, "upstream" : "*" }, "nO": 768 }, "entity_vector_length": 768, "get_candidates": {'@misc': 'spacy.CandidateGenerator.v1'}, "threshold": None, })
运行时触发维度未设置错误:
File "/home/blanco/wiki_kb/.venv/lib/python3.9/site-packages/spacy_transformers/layers/listener.py", line 64, in forward width = model.get_dim("nO") File "/home/blanco/wiki_kb/.venv/lib/python3.9/site-packages/thinc/model.py", line 175, in get_dim raise ValueError(err)ValueError: Cannot get dimension 'nO' for model 'transformer-listener': value unset
查资料得知这个错误通常在微调管道后期组件且冻结Transformer时出现,但我还没到这个阶段。我的最终目标是让链接器用Transformer嵌入处理实体和上下文(可学习线性层降维或不训练),对比同一预训练管道生成的知识库嵌入。
当前环境:
- Python 3.9.13
- spacy 3.4.4
- spacy-alignments 0.9.0
- spacy-legacy 3.0.12
- spacy-loggers 1.0.4
解决方案
这个错误是因为TransformerListener无法自动获取Transformer输出的维度,需要显式指定nO参数,同时要确保Listener和上游Transformer的维度匹配。修改后的配置如下:
entity_linker = nlp.add_pipe("entity_linker", config={ "labels_discard": [], "n_sents": 0, "incl_prior": True, "incl_context": True, "model": { "@architectures": "spacy.EntityLinker.v2", "tok2vec": { "@architectures": "spacy-transformers.TransformerListener.v1", "pooling": {"@layers": "reduce_mean.v1"}, "upstream": "*", "nO": 768 # 显式设置与Transformer输出一致的维度 }, "nO": 768 }, "entity_vector_length": 768, "get_candidates": {'@misc': 'spacy.CandidateGenerator.v1'}, "threshold": None, })
额外注意事项:
- 如果使用的是其他Transformer模型(比如
roberta-large输出维度为1024),需要对应修改nO的数值,确保和模型输出维度一致 - 确保Transformer组件已正确添加到管道中,且运行顺序在实体链接器之前
- 初始化管道时调用
nlp.initialize(),可让Spacy自动完成维度推断,避免潜在的维度不匹配问题
内容的提问来源于stack exchange,提问作者gblanco10
相关产品推荐
相关产品推荐

