модели трансформаторов huggingface: KeyError: сообщение 'input_ids' в начале обучения модели BERT

Используя библиотеку преобразователя Huggingface, я обнаружил ошибку на последнем этапе, когда перехожу к точной настройке языковой модели BERT для задачи моделирования языка с масками. Я ищу, чтобы настроить его для финансового корпуса в предметной области, на котором модель еще не была обучена. Однако при вызове модели для обучения я получаю следующее сообщение об ошибке: KeyError: 'input_ids'. Ниже приведены шаги и код, которые я сделал. Любые идеи приветствуются!

Сначала я создал объект набора данных из фрейма данных pandas, который, в свою очередь, был создан из файла csv с 1 столбцом из многих строк текста:

unlabelled_dataset = Dataset.from_pandas(unlabelled)    

Во-вторых, я токенизировал набор данных с помощью следующего кода:

tokenizerBERT = BertTokenizerFast.from_pretrained('bert-base-uncased')  #BERT model tokenization & check
tokenizerBERT(unlabelled_dataset['paragraphs'], padding=True, truncation=True)
tokenizerBERT.save_pretrained('tokenizers/pytorch/labelled/BERT/')

В-третьих, я создал сборщик данных в соответствии с инструкциями:

data_collator_BERT = DataCollatorForLanguageModeling(tokenizer=tokenizerBERT, mlm=True, mlm_probability=0.15)

Затем я выбираю свою модель from_pretrained, чтобы получить преимущества трансферного обучения:

model_BERT = BertForMaskedLM.from_pretrained("bert-base-uncased")

Затем я передал свои тренировочные аргументы тренеру трансформатора и инициализировал:

training_args_BERT = TrainingArguments(
    output_dir="./BERT",
    num_train_epochs=10,
    evaluation_strategy='steps',
    warmup_steps=10000,
    weight_decay=0.01,
    per_gpu_train_batch_size=64,    
)

trainer_BERT = Trainer(
    model=model_BERT,
    args=training_args_BERT,
    data_collator=data_collator_BERT,
    train_dataset=unlabelled_dataset,
)

Наконец, я вызываю модель для обучения и получаю ошибку KeyError: 'input_ids'

trainer_BERT.train()

Есть идеи о том, как отладить этот подход к обучению модели?

Ниже приводится точное полученное сообщение об ошибке:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-9-83b7063dea0b> in <module>
----> 1 trainer_BERT.train()
      2 trainer.save_model("./models/royalBERT")

~/anaconda3/lib/python3.7/site-packages/transformers/trainer.py in train(self, model_path, trial)
    755             self.control = self.callback_handler.on_epoch_begin(self.args, self.state, self.control)
    756 
--> 757             for step, inputs in enumerate(epoch_iterator):
    758 
    759                 # Skip past any already trained steps if resuming training

~/anaconda3/lib/python3.7/site-packages/torch/utils/data/dataloader.py in __next__(self)
    361 
    362     def __next__(self):
--> 363         data = self._next_data()
    364         self._num_yielded += 1
    365         if self._dataset_kind == _DatasetKind.Iterable and \

~/anaconda3/lib/python3.7/site-packages/torch/utils/data/dataloader.py in _next_data(self)
    401     def _next_data(self):
    402         index = self._next_index()  # may raise StopIteration
--> 403         data = self._dataset_fetcher.fetch(index)  # may raise StopIteration
    404         if self._pin_memory:
    405             data = _utils.pin_memory.pin_memory(data)

~/anaconda3/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py in fetch(self, possibly_batched_index)
     45         else:
     46             data = self.dataset[possibly_batched_index]
---> 47         return self.collate_fn(data)

~/anaconda3/lib/python3.7/site-packages/transformers/data/data_collator.py in __call__(self, examples)
    193     ) -> Dict[str, torch.Tensor]:
    194         if isinstance(examples[0], (dict, BatchEncoding)):
--> 195             examples = [e["input_ids"] for e in examples]
    196         batch = self._tensorize_batch(examples)
    197         if self.mlm:

~/anaconda3/lib/python3.7/site-packages/transformers/data/data_collator.py in <listcomp>(.0)
    193     ) -> Dict[str, torch.Tensor]:
    194         if isinstance(examples[0], (dict, BatchEncoding)):
--> 195             examples = [e["input_ids"] for e in examples]
    196         batch = self._tensorize_batch(examples)
    197         if self.mlm:

KeyError: 'input_ids'

person mickeymnemonic    schedule 19.11.2020    source источник


Ответы (1)


Хотя токенизатор передается через DataCollator, я думаю, что мы должны выполнить токенизацию данных:

Следовательно, нам нужно выполнить токенизацию данных как:

train_dataset = tokenizer.encode(unlabeled_data, add_special_tokens=True, return_tensors="pt")
trainer_BERT = Trainer(
    model=model_BERT,
    args=training_args_BERT,
    data_collator=data_collator_BERT,
    train_dataset=train_dataset,
)

person Ashwin Geet D'Sa    schedule 19.11.2020
comment
Хотя я совершенно новичок в этой библиотеке, я понял, что токенизация произошла с помощью вызова ниже: - person mickeymnemonic; 20.11.2020
comment
Да, мы должны ожидать, что токенизация произойдет внутри компании. Однако это не так. Например, ["input_ids"] должен был быть частью словаря входных данных, переданных в модель, но этого не произошло. Кроме того, - person Ashwin Geet D'Sa; 20.11.2020
comment
Сообщите мне, если проблема решена. Или если вы столкнетесь с какой-то другой проблемой. - person Ashwin Geet D'Sa; 20.11.2020