pythonnlphuggingface-transformershuggingfacenlp-question-answering

AutoModelForQuestionAnswering: ValueError: too many values to unpack (expected 2)


When I initialized AutoModelForQuestionAnswering from pretrained indobenchmark/indobert-base-p1 it won’t produce any outputs and shows ValueError, below is the code:

from transformers import AutoModelForQuestionAnswering, AutoTokenizer

model = AutoModelForQuestionAnswering.from_pretrained('indobenchmark/indobert-base-p1')
tokenizer = AutoTokenizer.from_pretrained('indobenchmark/indobert-base-p1')

context = 'Sindrom Bazex: acrokeratosis paraneoplastica.'
question = 'Nama sinonim dari Acrokeratosis paraneoplastica.'

inputs = tokenizer(question, context, return_tensors='pt')
outputs = model(**inputs)

inputs, outputs

The error shown is:

ValueError                                Traceback (most recent call last) /tmp/ipykernel_28/2363476019.py in <module>
      3 
      4 inputs = tokenizer(question, context, return_tensors='pt')
----> 5 outputs = model(**inputs)
      6 
      7 inputs, outputs

/opt/conda/lib/python3.7/site-packages/torch/nn/modules/module.py in
_call_impl(self, *input, **kwargs)    1128         if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks    1129              or _global_forward_hooks or _global_forward_pre_hooks):
-> 1130             return forward_call(*input, **kwargs)    1131         # Do not call functions when jit is used    1132         full_backward_hooks, non_full_backward_hooks = [], []

/opt/conda/lib/python3.7/site-packages/transformers/models/bert/modeling_bert.py in forward(self, input_ids, attention_mask, token_type_ids, position_ids, head_mask, inputs_embeds, start_positions, end_positions, output_attentions, output_hidden_states, return_dict)   1860     1861         logits = self.qa_outputs(sequence_output)
-> 1862         start_logits, end_logits = logits.split(1, dim=-1)    1863         start_logits = start_logits.squeeze(-1).contiguous()    1864         end_logits = end_logits.squeeze(-1).contiguous()

ValueError: too many values to unpack (expected 2)

But when I initialize the model with from a different repo i.e indolem/indobert-base-uncased, it runs no problem. I only changed the from_pretrained value.

Has this ever happened to anyone? Is it a problem with the model I’m trying to load?


Solution

  • It seems like they haven't cleaned up the config before uploading. The config.json contains a num_labels:5 which initializes your model with an output layer output size of 5. You can fix that as follows:

    from transformers import AutoModelForQuestionAnswering, AutoTokenizer, AutoConfig
    
    model_id = 'indobenchmark/indobert-base-p1'
    
    # Model with wrong output shape
    model = AutoModelForQuestionAnswering.from_pretrained(model_id)
    tokenizer = AutoTokenizer.from_pretrained(model_id)
    print(model.qa_outputs)
    
    # Model with correct output shape
    config = AutoConfig.from_pretrained(model_id)
    config.num_labels = 2
    model = AutoModelForQuestionAnswering.from_pretrained(model_id, config=config)
    tokenizer = AutoTokenizer.from_pretrained(model_id)
    print(model.qa_outputs)
    
    
    context = 'Sindrom Bazex: acrokeratosis paraneoplastica.'
    question = 'Nama sinonim dari Acrokeratosis paraneoplastica.'
    
    inputs = tokenizer(question, context, return_tensors='pt')
    outputs = model(**inputs)
    print(outputs.keys())
    

    Output:

    Linear(in_features=768, out_features=5, bias=True)
    Linear(in_features=768, out_features=2, bias=True)
    odict_keys(['start_logits', 'end_logits'])