下载HuggingFace 模型
首先打开网址:https://huggingface.co/models 这个网址是huggingface/transformers支持的所有模型,目前大约一千多个。搜索gpt2(其他的模型类似,比如bert-base-uncased等),并点击进去。
进入之后,可以看到gpt2模型的说明页,点击页面中的list all files in model,可以看到模型的所有文件。
通常需要把保存的是三个文件以及一些额外的文件
- 配置文件 -- config.json
- 词典文件 -- vocab.json
- 预训练模型文件
pytorch -- pytorch_model.bin文件
tensorflow 2 -- tf_model.h5文件
额外的文件,指的是merges.txt、special_tokens_map.json、added_tokens.json、tokenizer_config.json、sentencepiece.bpe.model等,这几类是tokenizer需要使用的文件,如果出现的话,也需要保存下来。没有的话,就不必在意。如果不确定哪些需要下,哪些不需要的话,可以把图1中类似的文件全部下载下来。
看下这几个文件都是什么:
- config.json配置文件
包含了模型的类型、激活函数等配置信息
- vocab.json 词典文件
- merges.txt
使用HuggingFace模型
将上述下载的模型存储在本地:
加载本地HuggingFace模型
- import torch
- from transformers import GPT2Tokenizer, GPT2LMHeadModel
复制代码 导入PyTorch框架和HuggingFace Transformers库的GPT-2组件
- tokenizer = GPT2Tokenizer.from_pretrained("../../Models/gpt2/")
- text = "Who was Jim Henson ? Jim Henson was a"
- indexed_tokens = tokenizer.encode(text)
- print(indexed_tokens) # [8241, 373, 5395, 367, 19069, 5633]
- # 转换为torch Tensor
- token_tensor = torch.tensor([indexed_tokens])
- print(token_tensor) # tensor([[ 8241, 373, 5395, 367, 19069, 5633]])
复制代码 tokenizer.encode(text)执行流程如下:
分词器处理:
首先将文本分词为子词(subwords),如:
"Who was Jim Henson ?" → ['Who', 'Ġwas', 'ĠJim', 'ĠHen', 'son', '?']
ID转换:
然后将每个子词转换为对应的整数ID(来自vcab.json),如:
['Who', 'Ġwas', 'ĠJim', 'ĠHen', 'son', '?'] -> [8241, 373, 5395, 367, 19069, 5633]
可以查看vcab.json文件:
返回的是 token ID 列表(整数列表),而非词向量
- # 加载预训练模型
- model = GPT2LMHeadModel.from_pretrained("../../Models/gpt2/")
- # print(model)
- model.eval()
- with torch.no_grad():
- outputs = model(token_tensor)
- predictions = outputs[0]
- # 我们需要预测下一个单词,所以是使用predictions第一个batch,最后一个词的logits去计算
- # predicted_index = 582,通过计算最大得分的索引得到的
- predicted_index = torch.argmax(predictions[0, -1, :]).item()
- # 反向解码为我们需要的文本
- predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])
- # 解码后的文本:'Who was Jim Henson? Jim Henson was a man'
- # 成功预测出单词 'man'
- print(predicted_text)
复制代码 输出结果:
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |