目录
1.加载预训练模型
#加载预训练模型
from transformers import AutoTokenizer
#预训练模型:distilgpt2
#use_fast=True:用rust语言写的分词器,速度比python语言写的分词器快很多
tokenizer = AutoTokenizer.from_pretrained(r'../data/model/distilgpt2/', use_fast=True)
tokenizer.batch_encode_plus([
'hide new secretions from the parental units',
'this moive is great'
])
#输出:
#{'input_ids': [[24717, 649, 3200, 507, 422, 262, 21694, 4991], [5661, 6941, 425, 318, 1049]], 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]}
print(tokenizer)
GPT2TokenizerFast(name_or_path='../data/model/distilgpt2/', vocab_size=50257, model_max_length=1024, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'bos_token': '<|endoftext|>', 'eos_token': '<|endoftext|>', 'unk_token': '<|endoftext|>'}, clean_up_tokenization_spaces=False), added_tokens_decoder={ 50256: AddedToken("<|endoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=True, special=True), }
#预测最后一个词:是一个多分类问题
#针对这个vocab_size=50257的问题,分类类别就是50257个类别
2 从本地加载数据集
from datasets import load_from_disk
dataset = load_from_disk(r'E:/ALOT/10_deep_learning/data/datasets/glue_sst2/')
dataset
DatasetDict({ train: Dataset({ features: ['sentence', 'label', 'idx'], num_rows: 67349 }) validation: Dataset({ features: ['sentence', 'label', 'idx'], num_rows: 872 }) test: Dataset({ features: ['sentence', 'label', 'idx'], num_rows: 1821 }) })
3.数据集处理
#预测下一个词,只需要数据集中的sentence, 不需要label和idx
#使用map函数做映射。处理只剩下sentence
def f(dataset, tokenizer):
return tokenizer.batch_encode_plus(dataset['sentence'])
#num_proc=8 查看任务管理器--性能--逻辑处理器的数量
dataset = dataset.map(f, batched=True, batch_size=1000, num_proc=8,
remove_columns=['sentence', 'label', 'idx'],
fn_kwargs={'tokenizer': tokenizer})
dataset
DatasetDict({ train: Dataset({ features: ['input_ids', 'attention_mask'], num_rows: 67349 }) validation: Dataset({ features: ['input_ids', 'attention_mask'], num_rows: 872 }) test: Dataset({ features: ['input_ids', 'attention_mask'], num_rows: 1821 }) })
#规定一个句子最小要有8个单词
#过滤掉太短的句子
def f_1(dataset):
return [len(i) >=8 for i in dataset['input_ids']] #i是每一句话
dataset = dataset.filter(f_1, batched=True, batch_size=1000, num_proc=8)
dataset
DatasetDict({ train: Dataset({ features: ['input_ids', 'attention_mask'], num_rows: 39905 }) validation: Dataset({ features: ['input_ids', 'attention_mask'], num_rows: 848 }) test: Dataset({ features: ['input_ids', 'attention_mask'], num_rows: 1730 }) })
#截断句子
def f_2(dataset):
#分别获取截断之后的input_ids, attention_mask
dataset['input_ids'] = [i[:8] for i in dataset['input_ids']]
dataset['attention_mask'] = [[1] * 8] * len(dataset['attention_mask'])
#预测最后一个词,前七个单词输入,最后一个输入
#模型帮我们做了偏移量问题, 这里输入和输出保持一致即可
datase