The model did not return a loss from the inputs - LabSE error
I want to fine tune LabSE for Question answering using squad dataset. and i got this error:
ValueError: The model did not return a loss from the inputs, only the following keys: last_hidden_state,pooler_output. For reference, the inputs it received are input_ids,token_type_ids,attention_mask.
I am trying to fine tune the model using pytorch. I tried to use smaller batch size and i took just 10% of training dataset because i had problems with memory allocation.
If memory allocation problems are gone this error happens.
To be honest i'm stuck with it. Do you have any hints?
I'm trying to use huggingface tutorial, but i want to use other evaluation (i want to do it myself ) so i skipped using evaluation part of dataset.
from datasets import load_dataset
raw_datasets = load_dataset(&quot;squad&quot;, split='train')


from transformers import BertTokenizerFast, BertModel
from transformers import AutoTokenizer


model_checkpoint = &quot;setu4993/LaBSE&quot;
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
model = BertModel.from_pretrained(model_checkpoint)



max_length = 384
stride = 128


def preprocess_training_examples(examples):
    questions = [q.strip() for q in examples[&quot;question&quot;]]
    inputs = tokenizer(
        questions,
        examples[&quot;context&quot;],
        max_length=max_length,
        truncation=&quot;only_second&quot;,
        stride=stride,
        return_overflowing_tokens=True,
        return_offsets_mapping=True,
        padding=&quot;max_length&quot;,
    )

    offset_mapping = inputs.pop(&quot;offset_mapping&quot;)
    sample_map = inputs.pop(&quot;overflow_to_sample_mapping&quot;)
    answers = examples[&quot;answers&quot;]
    start_positions = []
    end_positions = []

    for i, offset in enumerate(offset_mapping):
        sample_idx = sample_map[i]
        answer = answers[sample_idx]
        start_char = answer[&quot;answer_start&quot;][0]
        end_char = answer[&quot;answer_start&quot;][0] + len(answer[&quot;text&quot;][0])
        sequence_ids = inputs.sequence_ids(i)

        # Find the start and end of the context
        idx = 0
        while sequence_ids[idx] != 1:
            idx += 1
        context_start = idx
        while sequence_ids[idx] == 1:
            idx += 1
        context_end = idx - 1

        # If the answer is not fully inside the context, label is (0, 0)
        if offset[context_start][0] &gt; start_char or offset[context_end][1] &lt; end_char:
            start_positions.append(0)
            end_positions.append(0)
        else:
            # Otherwise it's the start and end token positions
            idx = context_start
            while idx &lt;= context_end and offset[idx][0] &lt;= start_char:
                idx += 1
            start_positions.append(idx - 1)

            idx = context_end
            while idx &gt;= context_start and offset[idx][1] &gt;= end_char:
                idx -= 1
            end_positions.append(idx + 1)

    inputs[&quot;start_positions&quot;] = start_positions
    inputs[&quot;end_positions&quot;] = end_positions
    return inputs


train_dataset = raw_datasets.map(
    preprocess_training_examples,
    batched=True,
    remove_columns=raw_datasets.column_names,
)
len(raw_datasets), len(train_dataset)

from transformers import TrainingArguments

args = TrainingArguments(
    &quot;bert-finetuned-squad&quot;,
    save_strategy=&quot;epoch&quot;,
    learning_rate=2e-5,
    num_train_epochs=3,
    weight_decay=0.01,
)

from transformers import Trainer

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=train_dataset,
    tokenizer=tokenizer,
)
trainer.train()


Hi,
Please make sure you are good with the below :

You may need to pass the label_names argument in TrainingArguments with the label column or key which you are providing, else you need to know what is the default forward argument which is accepted by the model of your choice

For example : with BertForQuestionAnswering model, at huggingface github
we can see we need start_positions and end_positions as key/column_name, which is what gets accepted by model during forward pass.

Also, from the same link, you need to verify what is the shape required by your labels/target(s) at Trainer ( this can be different from the logits shape ), and provide the one as per link.

Let me know if you or someone is able to resolve the error with the mentioned fix!
Thanks!
