【Pytorch神经网络实战案例】34 使用GPT-2模型实现句子补全功能(手动加载)

本文涉及的产品
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: GPT-2 就是一个语言模型,能够根据上文预测下一个单词,所以它就可以利用预训练已经学到的知识来生成文本,如生成新闻。也可以使用另一些数据进行微调,生成有特定格式或者主题的文本,如诗歌、戏剧。

1 GPT-2 模型结构


GPT-2的整体结构如下图,GPT-2是以Transformer为基础构建的,使用字节对编码的方法进行数据预处理,通过预测下一个词任务进行预训练的语言模型。


930874a38b444ca589cea4a275fb5a7d.png


1.1 GPT-2 功能简介


GPT-2 就是一个语言模型,能够根据上文预测下一个单词,所以它就可以利用预训练已经学到的知识来生成文本,如生成新闻。也可以使用另一些数据进行微调,生成有特定格式或者主题的文本,如诗歌、戏剧。


2 手动加载GPT-2模型并实现语句与完整句子预测


使用GPT-2模型配套的PreTrainedTokenizer类,所需要加载的词表文件比BERT模型多了一个merges文件。


2.1 代码实现:手动加载GPT-2模型并实现下一个单词预测---GPT2_make.py(第1部分)


import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel
# 案例描述:Transformers库中的GPT-2模型,并用它实现下一词预测功能,即预测一个未完成句子的下一个可能出现的单词。
# 下一词预测任务是一个常见的任务,在Transformers库中有很多模型都可以实现该任务。也可以使用BERT模型来实现。选用GPT-2模型,主要在于介绍手动加载多词表文件的特殊方式。
# 1.1 加载词表文件
# 自动加载预训练模型(权重)
# tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
# 手动加载词表文件:gpt2-merges.txt gpt2-vocab.json。
# from_pretrained方法是支持从本地载入多个词表文件的,但对载入的词表文件名称有特殊的要求:该文件名称必须按照源码文件tokenization_gpt2.py的VOCAB_FILES_NAMES字典对象中定义的名字来命名。
# 故使用from_pretrained方法,必须对已经下载好的词表文件进行改名将/gpt2/gpt2-vocab.json和/gpt2/gpt2-merges.txt这两个文件,分别改名为“gpt2/vocab.json和/gpt2/merges.txt
tokenizer = GPT2Tokenizer.from_pretrained(r'./models/gpt2') # 自动加载改名后的文件
# 编码输入
indexed_tokens = tokenizer.encode("Who is Li BiGor ? Li BiGor is a")
print("输入语句为:",tokenizer.decode(indexed_tokens))
tokens_tensor = torch.tensor([indexed_tokens])  # 将输入语句转换为张量
# 自动加载预训练模型(权重)
# model = GPT2LMHeadModel.from_pretrained('gpt2')
# 手动加载:配置文件gpt2-config.json 与 权重文件pt2-pytorch_model.bin
model = GPT2LMHeadModel.from_pretrained('./models/gpt2/gpt2-pytorch_model.bin',config='./models/gpt2/gpt2-config.json')
# 将模型设置为评估模式
model.eval()
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
tokens_tensor = tokens_tensor.to(DEVICE)
model.to(DEVICE)
# 预测所有标记
with torch.no_grad():
    outputs = model(tokens_tensor)
    predictions = outputs[0]
# 得到预测的下一词
predicted_index = torch.argmax(predictions[0, -1, :]).item()
predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])
print("输出语句为:",predicted_text) # GPT-2模型没有为输入文本添加特殊词。
# 输出:Who is Li BiGor? Li BiGor is a Chinese


2.2 代码实现:手动加载GPT-2模型并实现完整句子预测---GPT2_make.py(第2部分)


# 案例描述:Transformers库中的GPT-2模型,通过循环生成下一词,实现将一句话补充完整。
# 1.2 生成一段完整的话 这里有BUg 暂不会改
stopids = tokenizer.convert_tokens_to_ids(["."])[0] # 定义结束符
# 在循环调用模型预测功能时,使用了模型的past功能。该功能以使模型进入连续预测状态,即在前面预测结果的基础之上进行下一词预测,而不需要在每预测时,对所有句子进行重新处理。
# past功能是使用预训练模型时很常用的功能,在Transformers库中,凡是带有下一词预测功能的预训练模型(如GPT,XLNet,CTRL等)都有这个功能。
# 但并不是所有模型的past功能都是通过past参数进行设置的,有的模型虽然使用的参数名称是mems,但作用与pat参数一样。
past = None # 定义模型参数
for i in range(100):    # 循环100次
    with torch.no_grad():
        output, past = model(tokens_tensor, past=past)  # 预测下一次
    token = torch.argmax(output[..., -1, :])
    indexed_tokens += [token.tolist()]  # 将预测结果收集
    if stopids == token.tolist():   # 当预测出句号时,终止预测。
        break
    tokens_tensor = token.unsqueeze(0)  # 定义下一次预测的输入张量
sequence = tokenizer.decode(indexed_tokens) # 进行字符串编码
print(sequence)


3 GPT2_make.py(汇总)


import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel
# 案例描述:Transformers库中的GPT-2模型,并用它实现下一词预测功能,即预测一个未完成句子的下一个可能出现的单词。
# 下一词预测任务是一个常见的任务,在Transformers库中有很多模型都可以实现该任务。也可以使用BERT模型来实现。选用GPT-2模型,主要在于介绍手动加载多词表文件的特殊方式。
# 1.1 加载词表文件
# 自动加载预训练模型(权重)
# tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
# 手动加载词表文件:gpt2-merges.txt gpt2-vocab.json。
# from_pretrained方法是支持从本地载入多个词表文件的,但对载入的词表文件名称有特殊的要求:该文件名称必须按照源码文件tokenization_gpt2.py的VOCAB_FILES_NAMES字典对象中定义的名字来命名。
# 故使用from_pretrained方法,必须对已经下载好的词表文件进行改名将/gpt2/gpt2-vocab.json和/gpt2/gpt2-merges.txt这两个文件,分别改名为“gpt2/vocab.json和/gpt2/merges.txt
tokenizer = GPT2Tokenizer.from_pretrained(r'./models/gpt2') # 自动加载改名后的文件
# 编码输入
indexed_tokens = tokenizer.encode("Who is Li BiGor ? Li BiGor is a")
print("输入语句为:",tokenizer.decode(indexed_tokens))
tokens_tensor = torch.tensor([indexed_tokens])  # 将输入语句转换为张量
# 自动加载预训练模型(权重)
# model = GPT2LMHeadModel.from_pretrained('gpt2')
# 手动加载:配置文件gpt2-config.json 与 权重文件pt2-pytorch_model.bin
model = GPT2LMHeadModel.from_pretrained('./models/gpt2/gpt2-pytorch_model.bin',config='./models/gpt2/gpt2-config.json')
# 将模型设置为评估模式
model.eval()
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
tokens_tensor = tokens_tensor.to(DEVICE)
model.to(DEVICE)
# 预测所有标记
with torch.no_grad():
    outputs = model(tokens_tensor)
    predictions = outputs[0]
# 得到预测的下一词
predicted_index = torch.argmax(predictions[0, -1, :]).item()
predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])
print("输出语句为:",predicted_text) # GPT-2模型没有为输入文本添加特殊词。
# 输出:Who is Li BiGor? Li BiGor is a Chinese
# 案例描述:Transformers库中的GPT-2模型,通过循环生成下一词,实现将一句话补充完整。
# 1.2 生成一段完整的话 这里有BUg 暂不会改
stopids = tokenizer.convert_tokens_to_ids(["."])[0] # 定义结束符
# 在循环调用模型预测功能时,使用了模型的past功能。该功能以使模型进入连续预测状态,即在前面预测结果的基础之上进行下一词预测,而不需要在每预测时,对所有句子进行重新处理。
# past功能是使用预训练模型时很常用的功能,在Transformers库中,凡是带有下一词预测功能的预训练模型(如GPT,XLNet,CTRL等)都有这个功能。
# 但并不是所有模型的past功能都是通过past参数进行设置的,有的模型虽然使用的参数名称是mems,但作用与pat参数一样。
past = None # 定义模型参数
for i in range(100):    # 循环100次
    with torch.no_grad():
        output, past = model(tokens_tensor, past=past)  # 预测下一次
    token = torch.argmax(output[..., -1, :])
    indexed_tokens += [token.tolist()]  # 将预测结果收集
    if stopids == token.tolist():   # 当预测出句号时,终止预测。
        break
    tokens_tensor = token.unsqueeze(0)  # 定义下一次预测的输入张量
sequence = tokenizer.decode(indexed_tokens) # 进行字符串编码
print(sequence)


目录
相关文章
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
这篇文章介绍了如何使用PyTorch框架,结合CIFAR-10数据集,通过定义神经网络、损失函数和优化器,进行模型的训练和测试。
243 2
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
|
7天前
|
机器学习/深度学习 编解码 自动驾驶
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
31 3
RT-DETR改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
|
20天前
|
机器学习/深度学习 搜索推荐 PyTorch
基于昇腾用PyTorch实现传统CTR模型WideDeep网络
本文介绍了如何在昇腾平台上使用PyTorch实现经典的WideDeep网络模型,以处理推荐系统中的点击率(CTR)预测问题。
185 66
|
12天前
|
机器学习/深度学习 编解码 自动驾驶
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
39 16
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
|
12天前
|
机器学习/深度学习 存储
YOLOv11改进策略【模型轻量化】| PP-LCNet:轻量级的CPU卷积神经网络
YOLOv11改进策略【模型轻量化】| PP-LCNet:轻量级的CPU卷积神经网络
37 15
YOLOv11改进策略【模型轻量化】| PP-LCNet:轻量级的CPU卷积神经网络
|
4月前
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
607 2
|
7天前
|
机器学习/深度学习 存储
RT-DETR改进策略【模型轻量化】| PP-LCNet:轻量级的CPU卷积神经网络
RT-DETR改进策略【模型轻量化】| PP-LCNet:轻量级的CPU卷积神经网络
24 0
RT-DETR改进策略【模型轻量化】| PP-LCNet:轻量级的CPU卷积神经网络
|
1月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
97 15
|
2月前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
85 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
3月前
|
机器学习/深度学习 运维 安全
图神经网络在欺诈检测与蛋白质功能预测中的应用概述
金融交易网络与蛋白质结构的共同特点是它们无法通过简单的欧几里得空间模型来准确描述,而是需要复杂的图结构来捕捉实体间的交互模式。传统深度学习方法在处理这类数据时效果不佳,图神经网络(GNNs)因此成为解决此类问题的关键技术。GNNs通过消息传递机制,能有效提取图结构中的深层特征,适用于欺诈检测和蛋白质功能预测等复杂网络建模任务。
132 2
图神经网络在欺诈检测与蛋白质功能预测中的应用概述

热门文章

最新文章