HuggingFace-Трансформеры — НЕ одно предложение/примерное предсказание

#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 может быть выполнена (по крайней мере) двумя способами:

  1. AutoModel.from_pretrained('./my_model_own_custom_training.pth', from_tf=False)
  2. 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)