Views
No views yet
1from transformers import pipeline
2from transformers import T5ForConditionalGeneration, T5Tokenizer, Text2TextGenerationPipeline
3
4# Создание pipeline для генерации текста
5PIPELINE = Text2TextGenerationPipeline(model=model, tokenizer=tokenizer, device=0)
6
7def answer_m(list_texts):
8 texts = []
9 for txt in tqdm(list_texts):
10 texts.append(
11 PIPELINE(
12 txt,
13 max_length=256,
14 repetition_penalty=1.5,
15 temperature=0.7,
16 top_k=50,
17 num_return_sequences=1
18 )[0]['generated_text'])
19 return texts
20
21text = 'нападавше иты кроме того при наадении на отдел уиполицииранение получилаи женщина из гражчданских сообщилон анронимныйистточни агентста тасс со ссылкой на источник пишет что у одногао из преступников быиевзрычатычгтка полицейские потребовали чтобнападавшие останвеились после чего те дотали ножи'
22prefix = 'Исправь: '
23text_to_model = prefix + text
24
25answer_m([text_to_model])
26
27# ['Нападавшие иты Кроме того, при нападении на отдел полиции ранение получила женщина из гражданских сообщил один аналогичный источник. Агентство ТАСС со ссылкой на источник пишет, что у одного из преступников были взрывчатка: полицейские потребовали, чтобы напавшие остановились после чего те достали ножы.']
281import torch
2from transformers import T5ForConditionalGeneration, T5Tokenizer
3from torch.utils.data import Dataset, DataLoader
4from transformers import AdamW
5from tqdm.auto import tqdm
6
7raw_model = 'Grpp/T5_spell-base' # предобученная модель
8
9DATASET = "Grpp/t5-russian-spell_I" # Введите наазвание название датасета
10
11model = T5ForConditionalGeneration.from_pretrained(raw_model).cuda();
12tokenizer = T5Tokenizer.from_pretrained(raw_model)
13optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
14
15# Загрузка датасета
16new_dataset = load_dataset(DATASET)
17
18model.to('cuda')
19_ = model.config
20
21batch_size = 8 # сколько примеров показываем модели за один шаг
22report_steps = 1000 # раз в сколько шагов печатаем результат
23epochs = 1 # сколько раз мы покажем данные модели
24
25class TextDataset(Dataset):
26 def __init__(self, tokenizer, pairs):
27 self.tokenizer = tokenizer
28 self.pairs = pairs
29
30 def __len__(self):
31 return len(self.pairs)
32
33 def __getitem__(self, idx):
34 question = self.pairs[idx]['input_text'].replace('Spell correct: ', 'Исправь: ')
35 answer = self.pairs[idx]['label_text']
36 source = self.tokenizer(question, padding='max_length', truncation=True, max_length=256, return_tensors='pt')
37 target = self.tokenizer(answer, padding='max_length', truncation=True, max_length=256, return_tensors='pt')
38 target.input_ids[target.input_ids == 0] = -100
39 return source, target
40
41def train_epoch(model, dataloader, optimizer):
42 model.train()
43 losses = []
44 for i, (x, y) in enumerate(tqdm(dataloader)):
45 optimizer.zero_grad()
46 outputs = model(
47 input_ids=x['input_ids'].squeeze().to(model.device),
48 attention_mask=x['attention_mask'].squeeze().to(model.device),
49 labels=y['input_ids'].squeeze().to(model.device),
50 decoder_attention_mask=y['attention_mask'].squeeze().to(model.device),
51 )
52 loss = outputs.loss
53 loss.backward()
54 optimizer.step()
55
56 losses.append(loss.item())
57 if i % report_steps == 0:
58 print('step', i, 'loss', np.mean(losses[-report_steps:]))
59 return np.mean(losses)
60
61
62# Создаем датасет и даталоадер
63dataset = TextDataset(tokenizer, new_dataset['train'])
64dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
65
66# Оптимизатор
67optimizer = AdamW(model.parameters(), lr=5e-5)
68
69
70model_name_t5 = 'T5_spell-base'
71# Обучение модели
72for epoch in range(epochs):
73 print('EPOCH', epoch + 1)
74 epoch_loss = train_epoch(model, dataloader, optimizer)
75 print(f'Epoch {epoch + 1} Loss: {epoch_loss}')
76
77 # Сохранение модели после каждой эпохи
78 print('saving')
79 model.save_pretrained(model_name_t5)
80 tokenizer.save_pretrained(model_name_t5)