前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >好评or坏评?AI用Hugging Face和PyTorch解码答案

好评or坏评?AI用Hugging Face和PyTorch解码答案

作者头像
Tom2Code
发布2024-02-22 14:23:42
2060
发布2024-02-22 14:23:42
举报
文章被收录于专栏:Tom

先来科普一下huggingface:

代码语言:javascript
复制
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的镜像:

代码语言:javascript
复制
https://hf-mirror.com/

今天是初体验,就来体验一下这个镜像站

首先最简单的就是安装咯:

代码语言:javascript
复制
pip install transformers

然后就是我们今天的初体验:

首页是这个样子,左边是分类,右边是模型,上面有个搜索框

然后开始我们今天的教程:

  1. 先介绍我们的数据集:是一个教授整理的酒店中文评价数据集,5000条正向评价,标签是1 ,然后2000多条负面评价,标签是0

数据集截图:

那我们接下来开始加载数据集:

2.加载数据集

代码语言:javascript
复制
import pandas as pd
data=pd.read_csv("ChnSentiCorp_htl_all.csv")
data.head()

输出:

打印一下数据集看一下数据集的信息和介绍:

然后就输数据清洗,删除空行和一些无效的数据

3.创建数据集:

代码语言:javascript
复制
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)
    

经典三部曲:

打印一下看看:

代码语言:javascript
复制
dataset=MyDataSet()
for i in range(10):
    print(dataset[i])

可以看到数据集的内容是中文的然后最后的标签是0or1 代表了差评和好评

4.划分训练集和验证集

代码语言:javascript
复制
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:

代码:

代码语言:javascript
复制
from transformers import AutoModelForSequenceClassification
model=AutoModelForSequenceClassification.from_pretrained('rbt3')

打印一下model看看:

这就是加载成功了。

还可以这样加载分词器tokenizer:

代码语言:javascript
复制
from transformers import AutoTokenizer
tokenizer=AutoTokenizer.from_pretrained('rbt3')

分词器也加载成功了

我们继续下一步

6.然后就是创建dataloader:

代码语言:javascript
复制
import torch
from torch.utils.data import DataLoader

在定义一个处理dataset中每一个batch的数据的函数:

代码语言:javascript
复制
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的创建:

代码语言:javascript
复制
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.创建模型&优化器

代码语言:javascript
复制
from torch.optim import Adam
model=AutoModelForSequenceClassification.from_pretrained('rbt3')
optimizer=Adam(model.parameters(),lr=2e-5)
# 因为微调 所以学习率不用很大

8.训练与验证

代码语言:javascript
复制
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自己想的句子

代码语言:javascript
复制
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())}")

模型预测的结果是好评,看来预测的还是很准确的。

或者我们也可以使用另外一种方法进行模型的加载和预测:

代码语言:javascript
复制
from transformers import pipeline
pipe=pipeline("text-classification",model=model,tokenizer=tokenizer)
pipe(sen)

运行结果:

可以看到预测结构还是1,也就是说这条评价“这家民宿的床很舒服,隔音很好,投影仪配合100寸大幕布超级nice ”还是好评

如果本教程对您有用,可以带一个再看,创作不易,十分感谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom的小院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档