Huggingface Trainer.train () выдает «IndexError: Target -1 is out of bounds» во время анализа настроений предложений на словацком языке с использованием SlovakBert
Моя цель — обучить классификатор, способный выполнять анализ настроений на словацком языке, используя загруженную модель SlovakBert и библиотеку HuggingFace. Код выполняется в Google Colaboratory.
Мой набор данных читается из одного CSV-файла для тестирования:
и один файл csv для обучения:
Данные имеют два столбца: столбец предложений и второй столбец меток, которые указывают на тональность предложения. Метки имеют значения -1, 0 или 1.
После выполнения train.train() возникает ошибка:
Num examples = 89
Num Epochs = 3
Instantaneous batch size per device = 8
Total train batch size (w. parallel, distributed & accumulation) = 8
Gradient Accumulation steps = 1
Total optimization steps = 36
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-11-44bfec8c5f70> in <module>()
40 )
41 #Then fine-tune your model by calling train():
---> 42 trainer.train()
43
44 trainer.evaluate()
7 frames
/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py in cross_entropy(input, target, weight, size_average, ignore_index, reduce, reduction, label_smoothing)
2994 if size_average is not None or reduce is not None:
2995 reduction = _Reduction.legacy_get_string(size_average, reduce)
-> 2996 return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index, label_smoothing)
2997
2998
IndexError: Target -1 is out of bounds.
Код:
!pip install transformers==4.10.0 -qqq
!pip install datasets -qqq
from re import M
import numpy as np
from datasets import load_metric, load_dataset, Dataset
from transformers import TrainingArguments, Trainer, AutoModelForSequenceClassification, AutoTokenizer, DataCollatorWithPadding
import pandas as pd
from textblob import TextBlob
from textblob.sentiments import NaiveBayesAnalyzer
#links to dataset
test = 'https://raw.githubusercontent.com/kinit-sk/slovakbert-auxiliary/main/sentiment_reviews/kinit_golden_games.csv'
train = 'https://raw.githubusercontent.com/kinit-sk/slovakbert-auxiliary/main/sentiment_reviews/kinit_golden_accomodation.csv'
model_name = 'gerulata/slovakbert'
#Load data
dataset = load_dataset('csv', data_files={'train': train, 'test': test}, on_bad_lines='skip', column_names=["text", "label"], delimiter = ",")
#Preparing dataset
def tokenize_function(examples):
return tokenizer(examples['text'])
tokenized_datasets = dataset.map(tokenize_function, batched=True)
data_collator = DataCollatorWithPadding(tokenizer=tokenizer, padding="max_length")
#Train
#Load model
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=3)
#Specify place where we save checkpoints
training_args = TrainingArguments(output_dir="test_trainer")
#Metrics
metric = load_metric("accuracy")
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
# Create a Trainer object with your model, training arguments, training and test datasets, and evaluation function
training_args = TrainingArguments(output_dir="test_trainer", evaluation_strategy="epoch")
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets['train'],
eval_dataset=tokenized_datasets['test'],
compute_metrics=compute_metrics,
data_collator=data_collator
)
#Then fine-tune your model by calling train():
trainer.train()
trainer.evaluate()
В чем причина этой ошибки и как ее решить?
Изменить: я попытался изменить строку:
model =AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=3)
к:
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=3, id2label={"LABEL_0": -1, "LABEL_1": 0, "LABEL_2": 1})
но вылетает та же ошибка.