当前位置: 首页 > news >正文

NLP-Huggingface基本使用方法

NLP的网络结构大同小异,只不过训练策略可能会不同。因为与图像cv不同,文本训练数据非常的多,cv可以使用10几张就可以获得特征向量,而文本做不到学几句话就能让计算机听得懂话。因此,我们都需要使用预训练模型,所以模型的结构都差不多,不会有太大的改变。

配置环境

下载Huggingface包,Huggingface可以说是一个社区,集成了很多nlp的模型、数据集、预训练权重文件等等,并且免费,只需要pip install下载即可。

pip install transformers
在这里插入图片描述
测试

import warnings
warnings.filterwarnings("ignore")
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
print(classifier(["I've been waiting for a HuggingFace course my whole life.","I hate this so much!"]
))

在这里插入图片描述
在这里插入图片描述
但是登这个网页需要梯子!

1.分词器tokenizer

from transformers import AutoTokenizer #自动判断模型选用哪种分词器进行分词操作

第一次-联网运行

from transformers import AutoTokenizer
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
raws_inputs = ["I've been waiting for a HuggingFace course my whole life.","I hate this so much!"
]
inputs = tokenizer(raws_inputs,padding=True,truncation=True,return_tensors="pt")
print(inputs)

在执行完会在默认将模型保存在本地,如下图所展示
在这里插入图片描述
在这里插入图片描述
此时我们后续可以直接使用本地模型离线运行(不用挂梯子)

from transformers import AutoTokenizer
tokenizer.save_pretrained("./想要保存的文件夹名")
tokenizer = AutoTokenizer.from_pretrained("./想要保存的文件夹名/")
raws_inputs = ["I've been waiting for a HuggingFace course my whole life.","I hate this so much!"
]
inputs = tokenizer(raws_inputs,padding=True,truncation=True,return_tensors="pt")
print(inputs)

这样就将下图的文件保存至所想要保存的文件夹中,后续可以实现模型本地加载,离线运行,不用挂梯子了。
在这里插入图片描述
那上述的两种代码中都是使用了自动分词器选择,它是由checkpoint指定的预训练模型关联的,不用我们自己选择tokenizer,它自动帮我们选择好了。
tokenizer(raws_inputs,padding=True,truncation=True,return_tensors=“pt”)*中padding代表是否需要自动补零;truncation代表是否需要隔断,默认是true,指不超过计算机的上限512,它也可以被你指定你设定的文本长度然后进行隔断;return_tensors="pt"指的是使用pytorch.
输出结果:
在这里插入图片描述
模型的输入经过tokenizer得到两部分: 1)input_id:它由id、[CLS][SEP]两个特殊字符、补零占位符组成;2)attention_mask:为1的表示可以跟谁算,为0的不会参与到self-attention的进一步计算。
注意: attention_mask和padding是配套使用的,当人为去修改padding的时候,也要把attention_mask里面的参数进行修改。不修改的话计算机会认为人为padding的0占位符是有效位将会参与self-attention计算,那么这时候输出结果会有区别。
注意: 在加载清华gpt模型的tokenizer时候,需要添加trust_remote_code=True,因为清华的tokenizer是额外写在一个py文件中的,如果不指定相信远程调用的话可能会报错,完整代码为:tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b",trust_remote_code=True)

2.模型Model

from transformers import AutoModel #自动在预训练模型中选择模型

在上述代码加入模型部分:

from transformers import AutoTokenizer
from transformers import AutoModel
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)自动加载分词器
model = AutoModel.from_pretrained(checkpoint)#自动加载模型
raws_inputs = ["I've been waiting for a HuggingFace course my whole life.","I hate this so much!"
]
inputs = tokenizer(raws_inputs,padding=True,truncation=True,return_tensors="pt")#输入经过tokenizer得到两部分进行网络输入
outputs = model(**inputs)
print(outputs.last_hidden_state.shape)

在这里插入图片描述
这里面2指的是两个输入,16指的是最长id尺寸,768指定是维度。也就是说输出把每个token都编码成768维度的向量。

3.输出头

NLP任务其实就是做分类,比如情感分析是对一个序列做2分类等等。解决任务不同实际上就是对哪部分做分类。那么用什么做分类就选择什么输出头,就import什么东西。

from transformers import AutoTokenizer
from transformers import AutoModelForSequenceClassification
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
raws_inputs = ["I ve been waiting for a HuggingFace course my whole life.","I hate this so much!"
]
inputs = tokenizer(raws_inputs,padding=True,truncation=True,return_tensors="pt")#可以自己写最大长度max_length=8,truncation=True时超过8会被截断
outputs = model(**inputs)
print(outputs.logits.shape)

在这里插入图片描述
输出结果的含义:[两个文本,两种可能性所得概率]

4.预测

也可以理解为pipline背后实现的流程

import torch
from transformers import AutoTokenizer
from transformers import AutoModelForSequenceClassification
import warnings
warnings.filterwarnings("ignore")#删除警告checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)raws_inputs = ["I ve been waiting for a HuggingFace course my whole life.","I hate this so much!"
]
inputs = tokenizer(raws_inputs,padding=True,truncation=True,return_tensors="pt")outputs = model(**inputs)
logits = torch.nn.functional.softmax(outputs.logits,dim=-1)#对最后一个维度进行softmax,得到概率值
print("输出概率值",logits)
for logit in logits:pred = torch.argmax(logit).item()print("输出对应的标签", pred)result = model.config.id2label.get(pred)print("打印结果",result)print("打印映射关系",model.config.id2label)

在这里插入图片描述

另外一种使用方法,上述代码可以写为下面三横代码形式:

import warnings
warnings.filterwarnings("ignore")from transformers import pipeline
classifier = pipeline("text-classification", model="distilbert-base-uncased-finetuned-sst-2-english")
print(classifier("I love this!"))

在这里插入图片描述


http://www.mrgr.cn/news/80666.html

相关文章:

  • 【机器学习】机器学习的基本分类-无监督学习-t-SNE(t-分布随机邻域嵌入)
  • 全国数据资源入表年度发展报告(2024)(附下载)
  • leetcode 3195.包含所有1的最小矩形面积I
  • 使用C语言连接MySQL
  • 零基础入门Git,快速拉取项目
  • Qt之点击鼠标右键创建菜单栏使用(六)
  • 网络攻与防
  • Javascript面试手撕常见题目(回顾一)
  • linux centos 7 安装 mongodb7
  • vue字母划分选择城市组件(国内国际)
  • docker(wsl)命令 帮助文档
  • 英飞源嵌入式面试题及参考答案
  • 蓝桥杯算法训练 黑色星期五
  • 人工智能在VR展览中扮演什么角色?
  • ios 混合开发应用白屏问题
  • configure错误:“C compiler cannot create executables“
  • java error(2)保存时间带时分秒,回显时分秒变成00:00:00
  • 高并发 - 2.线程池
  • 大模型系列4--开源大模型本地部署到微调(WIP)
  • ubuntu系统版本安装docker容器
  • Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)
  • windows11 24H2 CSOL 闪退问题解决办法
  • Java通过反射破坏单例模式
  • Compose IO
  • Linux介绍与安装CentOS 7操作系统
  • JS实现简单的前端分页功能