Huggingface Trainer.train () выдает «IndexError: Target -1 is out of bounds» во время анализа настроений предложений на словацком языке с использованием SlovakBert

Моя цель — обучить классификатор, способный выполнять анализ настроений на словацком языке, используя загруженную модель SlovakBert и библиотеку HuggingFace. Код выполняется в Google Colaboratory.

Мой набор данных читается из одного CSV-файла для тестирования:

https://raw.githubusercontent.com/kinit-sk/slovakbert-auxiliary/main/sentiment_reviews/kinit_golden_games.csv

и один файл csv для обучения:

https://raw.githubusercontent.com/kinit-sk/slovakbert-auxiliary/main/sentiment_reviews/kinit_golden_accomodation.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})

но вылетает та же ошибка.

0 ответов

Другие вопросы по тегам