#python #deep-learning #pytorch
Вопрос:
Из библиотеки, которую я использую (все они используют ). LongformerModel, LongformerTokenizerFast, LongformerConfig
from_pretrained("allenai/longformer-base-4096")
Когда я это сделаю
longformer(input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)
Я получаю такую ошибку:
~/tfproject/tfenv/lib/python3.7/site-packages/transformers/modeling_longformer.py in forward(self, input_ids, token_type_ids, position_ids, inputs_embeds)
177 if inputs_embeds is None:
178 inputs_embeds = self.word_embeddings(input_ids)
--> 179 position_embeddings = self.position_embeddings(position_ids)
180 token_type_embeddings = self.token_type_embeddings(token_type_ids)
181
~/tfproject/tfenv/lib/python3.7/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
548 result = self._slow_forward(*input, **kwargs)
549 else:
--> 550 result = self.forward(*input, **kwargs)
551 for hook in self._forward_hooks.values():
552 hook_result = hook(self, input, result)
~/tfproject/tfenv/lib/python3.7/site-packages/torch/nn/modules/sparse.py in forward(self, input)
112 return F.embedding(
113 input, self.weight, self.padding_idx, self.max_norm,
--> 114 self.norm_type, self.scale_grad_by_freq, self.sparse)
115
116 def extra_repr(self):
~/tfproject/tfenv/lib/python3.7/site-packages/torch/nn/functional.py in embedding(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq, sparse)
1722 # remove once script supports set_grad_enabled
1723 _no_grad_embedding_renorm_(weight, input, max_norm, norm_type)
-> 1724 return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
1725
1726
IndexError: index out of range in self
В Интернете я обнаружил, что это может означать, что мой ввод в модель содержит больше токенов, чем максимальный размер ввода модели.
Но я проверил, и все входные данные содержат ровно 4098 токенов (что соответствует максимальной длине модели входного размера) (было применено заполнение). Маркировщик имеет тот же размер vocab, что и модель.
Я понятия не имею, что случилось.
Комментарии:
1. Может быть, один из ваших
position_ids
больше, чемnum_embeddings
вposition_embeddings
слое. В этом случае вам придется переиндексировать свойposition_ids
. Просто предположение.2. У вас
token_type_ids
может быть только 4098 уникальных значений, но вы столкнетесь с этой ошибкой, если какое-либо изtoken_type_ids
них превышает 4098.3. @NihalSangeeth, привет, спасибо за ответ, мне уже удалось это исправить. Вы правы, мне пришлось переиндексировать свой
position_ids
. Это неtoken_type_ids
было проблемой, потому что я вручную настроил их на проверку.
Ответ №1:
Мне удалось исправить это, переиндексировав мой position_ids
.
Когда PyTorch создавал этот тензор, по какой-то причине некоторое значение в position_ids
было больше 4098.
Я использовал:
position_ids = torch.stack([torch.arange(config.max_position_embeddings) for a in range(val_dataloader.batch_size)]).to(device)
для создания position_ids
всего пакета.
Имейте в виду, что это может быть не лучшим решением. Проблема может потребовать дополнительной отладки. Но для быстрого исправления это работает.