#python-3.x #pytorch #huggingface-transformers #huggingface-tokenizers
Вопрос:
Я пытаюсь предсказать с помощью модели NER, как в учебнике от huggingface (он содержит только часть «обучение оценка»).
Я следую этому точному уроку здесь : https://github.com/huggingface/notebooks/blob/master/examples/token_classification.ipynb
Обучение работает безупречно, но проблемы, которые у меня возникают, начинаются, когда я пытаюсь предсказать на простой выборке.
model_checkpoint = "distilbert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
loaded_model = AutoModel.from_pretrained('./my_model_own_custom_training.pth', from_tf=False)
input_sentence = "John Nash is a great mathematician, he lives in France"
tokenized_input_sentence = tokenizer([input_sentence],
truncation=True,
is_split_into_words=False,
return_tensors='pt')
predictions = loaded_model(tokenized_input_sentence["input_ids"])[0]
Предсказания имеют форму (1,13,768)
Как я могу получить конечный результат формы [JOHN <-> ‘B-PER’, … France <-> “B-LOC”]
, где B-PER
и B-LOC
являются двумя метками истинности, представляющими тег для человека и местоположения соответственно?
Результатом предсказания является:
torch.Size([1, 13, 768])
Если я напишу:
print(predictions.argmax(axis=2))
tensor([613, 705, 244, 620, 206, 206, 206, 620, 620, 620, 477, 693, 308])
Я получаю тензор выше.
Однако я ожидал бы получить тензор, представляющий метки основной истины [0…8]
, из аннотаций основной истины.
Сводка при загрузке модели :
loading configuration file ./my_model_own_custom_training.pth/config.json Model config DistilBertConfig { “name_or_path": “distilbert-base-uncased”, “activation”: “gelu”, “architectures”: [ “DistilBertForTokenClassification” ], “attention_dropout”: 0.1, “dim”: 768, “dropout”: 0.1, “hidden_dim”: 3072, “id2label”: { “0”: “LABEL_0”, “1”: “LABEL_1”, “2”: “LABEL_2”, “3”: “LABEL_3”, “4”: “LABEL_4”, “5”: “LABEL_5”, “6”: “LABEL_6”, “7”: “LABEL_7”, “8”: “LABEL_8” }, “initializer_range”: 0.02, “label2id”: { “LABEL_0”: 0, “LABEL_1”: 1, “LABEL_2”: 2, “LABEL_3”: 3, “LABEL_4”: 4, “LABEL_5”: 5, “LABEL_6”: 6, “LABEL_7”: 7, “LABEL_8”: 8 }, “max_position_embeddings”: 512, “model_type”: “distilbert”, “n_heads”: 12, “n_layers”: 6, “pad_token_id”: 0, “qa_dropout”: 0.1, “seq_classif_dropout”: 0.2, “sinusoidal_pos_embds”: false, "tie_weights”: true, “transformers_version”: “4.8.1”, “vocab_size”: 30522 }
Ответ №1:
Ответ немного сложнее, чем ожидалось[Огромные заслуги перед Нильсом Рогге].
Во-первых, загрузка моделей в трансформаторы huggingface может быть выполнена (по крайней мере) двумя способами:
AutoModel.from_pretrained('./my_model_own_custom_training.pth', from_tf=False)
AutoModelForTokenClassification.from_pretrained('./my_model_own_custom_training.pth', from_tf=False)
Похоже, что в соответствии с поставленной задачей AutoModels
необходимо использовать различные подклассы. В этом сценарии, который я опубликовал, это AutoModelForTokenClassification()
то, что нужно использовать.
После этого решением для получения прогнозов было бы сделать следующее:
# forward pass
outputs = model(**encoding)
logits = outputs.logits
predictions = logits.argmax(-1)