Nlp 加载经过训练的en_core_web_trf spacyner模型时出错

Nlp 加载经过训练的en_core_web_trf spacyner模型时出错,nlp,spacy,Nlp,Spacy,加载预训练空间模型后,对自定义数据进行微调 spacy.require_gpu() nlp = spacy.load("en_core_web_trf",exclude=['tagger', 'parser', 'attribute_ruler', 'lemmatizer']) 加载进行验证时出错 model=spacy.load(category_output_dir + "/%s" % itn,exclude=['tagger', 'parser',

加载预训练空间模型后,对自定义数据进行微调

spacy.require_gpu()
nlp = spacy.load("en_core_web_trf",exclude=['tagger', 'parser', 'attribute_ruler', 'lemmatizer'])
加载进行验证时出错

model=spacy.load(category_output_dir + "/%s" % itn,exclude=['tagger', 'parser', 'attribute_ruler', 'lemmatizer'])
文件“/usr/local/lib/python3.6/dist-packages/spacy/init.py”,第47行,已加载 return util.load_model(name,disable=disable,exclude=exclude,config=config) 文件“/usr/local/lib/python3.6/dist-packages/spacy/util.py”,第275行,在load_模型中 从路径(路径(名称),**kwargs)返回加载模型 文件“/usr/local/lib/python3.6/dist-packages/spacy/util.py”,第341行,在load\u model\u from\u路径中 从磁盘返回nlp(模型路径,exclude=exclude) 文件“/usr/local/lib/python3.6/dist-packages/spacy/language.py”,第1705行,从磁盘 util.from_disk(路径、反序列化程序、排除) 文件“/usr/local/lib/python3.6/dist-packages/spacy/util.py”,第1085行,从磁盘 读卡器(路径/键) 文件“/usr/local/lib/python3.6/dist-packages/spacy/language.py”,第1700行,在 p、 排除=[“vocab”] 文件“spacy/pipeline/transition_parser.pyx”,第479行,位于磁盘的spacy.pipeline.transition_parser.parser 文件“/usr/local/lib/python3.6/dist packages/thinc/model.py”,第529行,以from_字节表示 从目录返回自我(msg) 文件“/usr/local/lib/python3.6/dist-packages/thinc/model.py”,第552行,来自 节点。设置尺寸(尺寸,值) 文件“/usr/local/lib/python3.6/dist packages/thinc/model.py”,第188行,在set\u dim中 提升值错误(err) ValueError:尝试将模型“可预计算的_仿射”的维度“否”从78更改为74

下面是代码片段

import random
from tqdm import tqdm
import spacy
import os
import copy
from spacy.tokens import Doc
from spacy.training import Example
from spacy.util import minibatch, compounding, decaying

spacy.require_gpu()
nlp = spacy.load("en_core_web_trf",exclude=['tagger', 'parser', 
'attribute_ruler', 'lemmatizer'])

ner = nlp.get_pipe('ner')
for _, annotations in TRAIN_DATA:
    for ent in annotations.get('entities'):
        ner.add_label(ent[2])

for itn in range(n_iter):
    random.shuffle(TRAIN_DATA)
    losses = {}

for batch in tqdm(minibatch(TRAIN_DATA,size=compounding(4., 64., 1.01))):
    
    for text, annots in batch:
         examples = []
         try:
              examples.append(Example.from_dict(nlp.make_doc(text), annots))
              losses=nlp.update(examples,sgd=optimizer,losses=losses)
            except:
                continue
if use_optimizer_averages:
     with nlp.use_params(optimizer.averages):
         os.mkdir(output_dir + "/%s" % itn)
         nlp.to_disk(output_dir + "/%s" % itn)
         model=spacy.load(output_dir + "/%s" % itn,exclude=['tagger', 'parser', 'attribute_ruler', 'lemmatizer'])
列车数据格式:
TRAIN_DATA=[[“谁是沙卡·汗?”,{“实体”:[(7,17,“朋友”)],“我喜欢伦敦。”,{“实体”:[(7,13,“LOC”)]}]

看起来您在spaCy 3的发行候选版本
v3.0.0rc2
中遇到了一个bug。我们正在为最终3.0版本修复此问题,请参见此处:

同时,我担心您将无法为基于变压器、预培训的NER模型添加其他标签。不过,我建议您从头开始培训一个新的NER组件

在spaCy 3中,我们建议使用配置系统,而不是编写自己的训练循环()。在配置文件中,您可以从其他管道中获取组件,如下所示:

[components.transformer]
source = "en_core_web_trf"
component = "transformer"
这允许您重用预训练模型的变压器权重,并在此基础上创建新的NER模型():

您甚至可以从
en_core\u web\u trf
中获取旧的NER组件,只需将其命名为不同的名称,您将在管道中运行两个NER,每个NER用于一组不同的标签


或者,您也可以使用基于非变压器的模型,例如
en\u core\u web\u lg
。向这样一个预训练的模型添加自定义标签应该可以正常工作,就像以前一样。

看起来您在spaCy 3的候选版本
v3.0.0rc2
中遇到了一个bug。我们正在为最终3.0版本修复此问题,请参见此处:

同时,我担心您将无法为基于变压器、预培训的NER模型添加其他标签。不过,我建议您从头开始培训一个新的NER组件

在spaCy 3中,我们建议使用配置系统,而不是编写自己的训练循环()。在配置文件中,您可以从其他管道中获取组件,如下所示:

[components.transformer]
source = "en_core_web_trf"
component = "transformer"
这允许您重用预训练模型的变压器权重,并在此基础上创建新的NER模型():

您甚至可以从
en_core\u web\u trf
中获取旧的NER组件,只需将其命名为不同的名称,您将在管道中运行两个NER,每个NER用于一组不同的标签


或者,您也可以使用基于非变压器的模型,例如
en\u core\u web\u lg
。向这样一个预训练的模型添加自定义标签应该可以正常工作,就像以前一样。

Hm,您的
model
变量中当前的模型和您试图从磁盘加载的模型之间似乎不兼容。您能提供复制此错误的最小可执行脚本吗?@SofieVL我添加了代码片段来复制错误,谢谢。嗯,看起来您的
model
变量中当前的模型与您试图从磁盘加载的模型不兼容。您能提供复制此错误的最小可执行脚本吗?@SofieVL我已添加代码段以复制错误,谢谢。很高兴报告,这应该从v3.0.0rc3开始修复!很高兴地报告,这应该从v3.0.0rc3开始修复!