From d43a83e37a6ccb0087db8f77c916761d81c94afa Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 9 Oct 2017 03:35:40 +0200 Subject: [PATCH] Allow parser.add_label for pretrained models --- spacy/syntax/nn_parser.pyx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 153f7a484..daebcac7b 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -51,7 +51,7 @@ from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune from .._ml import Residual, drop_layer, flatten from .._ml import link_vectors_to_models from .._ml import HistoryFeatures -from ..compat import json_dumps +from ..compat import json_dumps, copy_array from . import _parse_features from ._parse_features cimport CONTEXT_SIZE @@ -781,12 +781,22 @@ cdef class Parser: self.moves.finalize_doc(doc) def add_label(self, label): + resized = False for action in self.moves.action_types: added = self.moves.add_action(action, label) if added: # Important that the labels be stored as a list! We need the # order, or the model goes out of synch self.cfg.setdefault('extra_labels', []).append(label) + resized = True + if self.model not in (True, False, None) and resized: + # Weights are stored in (nr_out, nr_in) format, so we're basically + # just adding rows here. + smaller = self.model[-1]._layers[-1] + larger = Affine(self.moves.n_moves, smaller.nI) + copy_array(larger.W[:smaller.nO], smaller.W) + copy_array(larger.b[:smaller.nO], smaller.b) + self.model[-1]._layers[-1] = larger def begin_training(self, gold_tuples, pipeline=None, **cfg): if 'model' in cfg: