Я пытаюсь реализовать систему ответов на вопросы, которая работает с большим входным текстом: поэтому идея состоит в том, чтобы разбить большой входной текст на подпоследовательности из 510 токенов, после того как я сгенерирую представление каждой последовательности независимо и используя пул слой для генерации окончательного представления входной последовательности.
Я использую модель CamemBERT для французского языка.
Я пробовал следующий код:
class CamemBERTQA(nn.Module):
# the initialization of the model
def __init__(self, do_lower_case: bool = True):
super(CamemBERTQA, self).__init__()
self.config_keys = ['do_lower_case']
self.do_lower_case = do_lower_case
self.camembert = CamembertForQuestionAnswering.from_pretrained('fmikaelian/camembert-base-fquad')
self.tokenizer = CamembertTokenizer.from_pretrained('fmikaelian/camembert-base-fquad', do_lower_case=do_lower_case)
self.cls_token_id = self.tokenizer.convert_tokens_to_ids([self.tokenizer.cls_token])[0]
self.sep_token_id = self.tokenizer.convert_tokens_to_ids([self.tokenizer.sep_token])[0]
self.pool = nn.MaxPool2d(2, 2)
# Split long input text into subsequences with overlapping
def split_text(self, text, max_length, overlapp): #511 max
f = []
text = text.split()
for i in range(0, int(len(text)-overlapp),(max_length-overlapp)):
f.append(" ".join(text[i:i+max_length]))
# print (f)
return f
# Generate representation of a text,
def text_representation(self, l): # l here is a list
result = []
for i in l:
input_ids = torch.tensor([self.tokenizer.encode(i, add_special_tokens=True)])
with torch.no_grad():
last_hidden_states = model(input_ids)[0] # Models outputs are now tuples
result.append(last_hidden_states)
# print(last_hidden_states[0])
return result
def forward(self, text, input_ids):
# Split input text to subsequences of 511 with overlapping
subsequences = self.split_text(text, 511, 10)
# Generate IDs of each subsequence (Sequence representation)
input_ids_list = self.text_representation(subsequences)
print("input_ids_list")
# Pooling layer
# pool = self.pool(...)
########### The problem is here: how can I add a pooling layer #################
# input_ids = # the final output of the pooling layer, the result should contain 510 elements/tokens
# generate the start and end logits of the answer
start_scores, end_scores = self.camembert(torch.tensor([input_ids]))
start_logits = torch.argmax(start_scores)
end_logits = torch.argmax(end_scores)+1
outputs = (start_logits, end_logits,)
# print(outputs)
return outputs
Так как я Я новичок в pyTorch, я не уверен, должен ли код быть таким.
Пожалуйста, если у вас есть какой-либо совет или если вам нужна дополнительная информация, свяжитесь со мной.