Hi I am working on implementing a multi-classification model (5 classes) with the new SpaCy Model en_pytt_bertbaseuncased_lg
. The code for the new pipe is here:
nlp = spacy.load('en_pytt_bertbaseuncased_lg')
textcat = nlp.create_pipe(
'pytt_textcat',
config={
"nr_class":5,
"exclusive_classes": True,
}
)
nlp.add_pipe(textcat, last = True)
textcat.add_label("class1")
textcat.add_label("class2")
textcat.add_label("class3")
textcat.add_label("class4")
textcat.add_label("class5")
The code for the training is as follows and is based on the example from here(https://pypi.org/project/spacy-pytorch-transformers/):
def extract_cat(x):
for key in x.keys():
if x[key]:
return key
# get names of other pipes to disable them during training
n_iter = 250 # number of epochs
train_data = list(zip(train_texts, [{"cats": cats} for cats in train_cats]))
dev_cats_single = [extract_cat(x) for x in dev_cats]
train_cats_single = [extract_cat(x) for x in train_cats]
cats = list(set(train_cats_single))
recall = {}
for c in cats:
if c is not None:
recall['dev_'+c] = []
recall['train_'+c] = []
optimizer = nlp.resume_training()
batch_sizes = compounding(1.0, round(len(train_texts)/2), 1.001)
for i in range(n_iter):
random.shuffle(train_data)
losses = {}
batches = minibatch(train_data, size=batch_sizes)
for batch in batches:
texts, annotations = zip(*batch)
nlp.update(texts, annotations, sgd=optimizer, drop=0.2, losses=losses)
print(i, losses)
So the structure of my data looks like this:
[('TEXT TEXT TEXT',
{'cats': {'class1': False,
'class2': False,
'class3': False,
'class4': True,
'class5': False}}), ... ]
I am not sure why I get the following error:
TypeError Traceback (most recent call last)
<ipython-input-32-1588a4eadc8d> in <module>
21
22
---> 23 optimizer = nlp.resume_training()
24 batch_sizes = compounding(1.0, round(len(train_texts)/2), 1.001)
25
TypeError: Model() got multiple values for argument 'nr_class'
EDIT:
if I take out the nr_class argument, I get this error here:
ValueError: operands could not be broadcast together with shapes (1,2) (1,5)
I actually thought this would happen because I didn't specify the nr_class argument. Is that correct?
This is a regression in the most recent version we released of spacy-pytorch-transformers
. Sorry about this!
The root cause is, this is another case of the evils of **kwargs
. I'm looking forward to refining the spaCy API to prevent these issues in future.
You can see the offending line here: https://github.com/explosion/spacy-pytorch-transformers/blob/c1def95e1df783c69bff9bc8b40b5461800e9231/spacy_pytorch_transformers/pipeline/textcat.py#L71 . We provide the nr_class
positional argument, which overlaps with the explicit argument you passed in during the config.
In order to workaround the problem, you can simply remove the nr_class
key from your the config
dict you're passing into spacy.create_pipe()
.