先来科普一下huggingface:
Hugging Face是一家专注于自然语言处理(NLP)技术的人工智能公司,致力于开发和提供前沿的NLP工具和大规模预训练模型,以推动自然语言理解和生成的研究与应用。公司成立于2016年,总部位于纽约,其使命是民主化人工智能技术,让开发者、研究人员和公司能够轻松地利用最先进的NLP技术。
Hugging Face背后最著名的产品是transformers库,这是一个开源的机器学习库,提供了数百种NLP模型,如BERT、GPT-2、T5和BART等,支持文本分类、信息提取、文本生成、翻译以及其他多种NLP任务。transformers库以其易用性、灵活性和高效性受到广泛欢迎,成为了自然语言处理领域的事实标准之一。
除了提供强大的transformers库,Hugging Face还运营一个名为Hugging Face Hub的平台,这个平台允许社区成员共享和发现预训练模型和数据集。通过这个平台,用户可以轻松地上传、分享和使用NLP模型,促进了知识的共享和合作。
Hugging Face不仅在开源社区中具有重要影响,也与许多学术机构和企业合作,推动了NLP领域的研究和商业应用。公司持续在自然语言处理、机器学习和人工智能领域进行创新,旨在通过其技术和平台使AI更加普及和易于访问。
huggingface的官网,一般都是打不开的状态。首先,我们来介绍一个huggingface的镜像:
https://hf-mirror.com/
今天是初体验,就来体验一下这个镜像站
首先最简单的就是安装咯:
pip install transformers
然后就是我们今天的初体验:
首页是这个样子,左边是分类,右边是模型,上面有个搜索框
然后开始我们今天的教程:
数据集截图:
那我们接下来开始加载数据集:
2.加载数据集
import pandas as pd
data=pd.read_csv("ChnSentiCorp_htl_all.csv")
data.head()
输出:
打印一下数据集看一下数据集的信息和介绍:
然后就输数据清洗,删除空行和一些无效的数据
3.创建数据集:
from torch.utils.data import Dataset
class MyDataSet(Dataset):
def __init__(self):
super().__init__()
self.data=pd.read_csv('ChnSentiCorp_htl_all.csv')
self.data=self.data.dropna()
def __getitem__(self,index):
return self.data.iloc[index]['review'],self.data.iloc[index]['label']
def __len__(self):
return len(self.data)
经典三部曲:
打印一下看看:
dataset=MyDataSet()
for i in range(10):
print(dataset[i])
可以看到数据集的内容是中文的然后最后的标签是0or1 代表了差评和好评
4.划分训练集和验证集
from torch.utils.data import random_split
trainset,validset=random_split(dataset,lengths=[0.9,0.1])
看一下训练集和验证集的大小:
大概90%是训练集,10%是验证集
5.加载huggingface上的模型:
因为本地网络不好,所以就使用镜像站下载了该模型的pytorch版本的权重文件。
顺便介绍一下我们今天使用的模型是:
rbt3
RBT3是一个由哈工大和华为诺亚方舟实验室合作开发的中文预训练语言模型,隶属于Roberta模型家族。Roberta(Robustly optimized BERT approach)是一个优化过的BERT(Bidirectional Encoder Representations from Transformers)模型
然后使用我们的transformer库来加载我们下载好的模型:
首先确保rbt3的所有权重文件已经下载到了对应的文件夹,我这里是下载到了和我的代码同一个目录下的文件夹里的rbt3:
代码:
from transformers import AutoModelForSequenceClassification
model=AutoModelForSequenceClassification.from_pretrained('rbt3')
打印一下model看看:
这就是加载成功了。
还可以这样加载分词器tokenizer:
from transformers import AutoTokenizer
tokenizer=AutoTokenizer.from_pretrained('rbt3')
分词器也加载成功了
我们继续下一步
6.然后就是创建dataloader:
import torch
from torch.utils.data import DataLoader
在定义一个处理dataset中每一个batch的数据的函数:
def collate_func(batch):
texts,labels=[],[]
for item in batch:
texts.append(item[0])
labels.append(item[1])
inputs=tokenizer(texts,max_length=128,padding="max_length",truncation=True,return_tensors="pt")
inputs["labels"]=torch.tensor(labels)
return inputs
dataloader的创建:
trainloader=DataLoader(trainset,batch_size=16,shuffle=True,collate_fn=collate_func)
validloader=DataLoader(validset,batch_size=16,shuffle=False,collate_fn=collate_func)
现在再来看看我们的数据格式:
已经转化成了tensor的格式了
7.创建模型&优化器
from torch.optim import Adam
model=AutoModelForSequenceClassification.from_pretrained('rbt3')
optimizer=Adam(model.parameters(),lr=2e-5)
# 因为微调 所以学习率不用很大
8.训练与验证
def evaluate():
model.eval()
acc_num=0
with torch.inference_mode():
for batch in validloader:
output=model(**batch)
pred=torch.argmax(output.logits,dim=-1)
acc_num+=(pred.long()==batch['labels'].long()).float().sum()
return acc_num/len(validset)
def train(epoch=3,log_step=100):
global_step=0
for ep in range(epoch):
model.train()
for batch in trainloader:
optimizer.zero_grad()
output=model(**batch)
output.loss.backward()
optimizer.step()
if global_step%log_step:
print(f"ep: {ep}, global_step: {global_step}, loss: {output.loss.item()}",)
global_step+=1
acc=evaluate()
print(f"ep:{ep},acc: {acc}")
因为电脑的gpu too low to use 所以只能用cpu来训练了 -=- 无奈之举
最后的acc还可以,大概80%
9.模型的预测
sen是Tom自己想的句子
sen="这家民宿的床很舒服,隔音很好,投影仪配合100寸大幕布超级nice"
id2_label={0:'差评',1:'好评'}
model.eval()
with torch.inference_mode():
inputs=tokenizer(sen,return_tensors='pt')
logits=model(**inputs).logits
pred=torch.argmax(logits,-1)
print(f"输入:{sen}\n模型预测结果:{id2_label.get(pred.item())}")
模型预测的结果是好评,看来预测的还是很准确的。
或者我们也可以使用另外一种方法进行模型的加载和预测:
from transformers import pipeline
pipe=pipeline("text-classification",model=model,tokenizer=tokenizer)
pipe(sen)
运行结果:
可以看到预测结构还是1,也就是说这条评价“这家民宿的床很舒服,隔音很好,投影仪配合100寸大幕布超级nice ”还是好评
如果本教程对您有用,可以带一个再看,创作不易,十分感谢。