首页 > 其他分享 >利用huggingface尝试的第一个简单的文本分类任务

利用huggingface尝试的第一个简单的文本分类任务

时间:2025-01-05 14:33:17浏览次数:1  
标签:尝试 torch huggingface batch print device model 文本 data

`'''
这是一个简单的文本分类任务,基本的流程步骤还是挺清晰完整的,和之前那个简单的cnn差不多,
用到了transformers包,还需用到huggingface的模型rbt3,
但是好像连接不上``
'''
'''
遇到的问题:
1.导入的包不可用,从AutoModelForTokenClassification换成了AutoModelForSequenceClassification
2.模型加载不出来,然后选择将模型下载到本地进行加载,但是这样的话会非常耗内存,后续考虑设置一个代理
3.数据处理的问题,在处理完数据,进行训练的时候,没有处理好设备选择问题,导致部分数据在cpu,部分数据在gpu
'''

step1 导入相关包

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

step2 加载数据

import pandas as pd

data = pd.read_csv("./ChnSentiCorp_htl_all.csv")
data = data.dropna()

step3 创建Dataset

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()

step4 划分数据集

from torch.utils.data import random_split

trainset, validset = random_split(dataset, lengths=[0.9, 0.1])

step5 创建Dataloader

tokenizer = AutoTokenizer.from_pretrained("./hfl/rbt3")

def collate_func(batch): # 自定义的数据合并函数,负责将一个批次(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")

# 确保把所有输入移到正确的设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
inputs = {key: value.to(device) for key, value in inputs.items()}
inputs["labels"] = torch.tensor(labels).to(device)  # labels 也移到相同设备
return inputs

from torch.utils.data import DataLoader

trainloader = DataLoader(trainset, batch_size=32, shuffle=True, collate_fn=collate_func)
validloader = DataLoader(validset, batch_size=64, shuffle=False, collate_fn=collate_func)

step6 创建模型及优化器

from torch.optim import Adam

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = AutoModelForSequenceClassification.from_pretrained("./hfl/rbt3").to(device)
optimizer = Adam(model.parameters(), lr=2e-5)

step7 训练与验证

def evaluate():
model.eval() # 设置模型为评估模式
acc_num = 0
# 打印模型设备信息(只在验证开始时打印一次)
print(f"验证开始:\n模型设备: {next(model.parameters()).device}")
with torch.no_grad():
for batch in validloader:
batch = {k: v.to(device) for k, v in batch.items()} # 将数据移到指定设备
# 只需要在第一次 batch 时打印一次输入数据设备信息
if acc_num == 0:
print(f"输入数据设备: {batch['input_ids'].device}")
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=1, log_step=100):
global_step = 0
for ep in range(epoch):
model.train() # 设置模型为训练模式
# 打印模型和输入数据设备信息(只在每个 epoch 开始时打印一次)
print(f"Epoch {ep} 开始:")
print(f"模型设备: {next(model.parameters()).device}")
for batch in trainloader:
batch = {k: v.to(device) for k, v in batch.items()} # 移动到正确设备
# 只需要在第一次 batch 时打印一次输入数据设备信息
if global_step == 0:
print(f"输入数据设备: {batch['input_ids'].device}")
optimizer.zero_grad()
output = model(**batch)
output.loss.backward()
optimizer.step()
if global_step % log_step == 0:
print(f"ep:{ep}, global_step:{global_step}, loss:{output.loss.item()}")
global_step += 1
acc = evaluate() # 调用evaluate函数
print(f"ep:{ep}, acc:{acc}")

step8 模型训练

train()

step9 模型预测

sen = "我觉得这家酒店真不错,饭很好吃!"
id2_label = {0: "差评", 1: "好评"}
model.eval()

with torch.no_grad():
inputs = tokenizer(sen, return_tensors="pt")
inputs = {k: v.to(device) for k, v in inputs.items()} # 确保输入在正确的设备
# 只在预测开始时打印一次设备信息
print(f"预测开始:\n模型设备: {next(model.parameters()).device}")
print(f"输入数据设备: {inputs['input_ids'].device}")
logits = model(**inputs).logits
pred = torch.argmax(logits, dim=-1)
print(f"输入:{sen}\n模型预测结果:{id2_label.get(pred.item())}")

更简单的做法

from transformers import pipeline

model.config.id2label = id2_label
pipe = pipeline("text-classification", model=model, tokenizer=tokenizer, device=0 if torch.cuda.is_available() else -1)
print(pipe(sen))
`
最终运行的结果是这样的:

标签:尝试,torch,huggingface,batch,print,device,model,文本,data
From: https://www.cnblogs.com/hhhhappy/p/18653339

相关文章

  • 【Linux系列】Vim 编辑器中的高效文本编辑技巧:删除操作
    ......
  • linux文本操作
    gpasswd-d用户名附加组名文件(文件夹)-rw-rw-r--1bdbd0Jul2321:29bb.txtdrwxrwxr-x3bdbd4096Jul2215:32environmentdrwxrwxr-x3bdbd4096Jul2321:42pydrwxrwxr-x3bdbd4096Jul2321:27pycase-rw-rw-r--1bdbd20Jul2321:38tes......
  • vue3使用TinyMCE富文本编辑器步骤
    目录1.安装2.引入并使用3.效果1.安装在对应文件安装tinymce包2.引入并使用3.效果......
  • 大语言模型提示技巧(四)-文本概括
    文本概括是大语言模型的常用功能之一,我们总结一段文字、一篇文章的主要内容,一篇论文的摘要,甚至一本书的简介都属于文本概括的范畴。听起来文本概括对文字工作者有帮助,但事实上文本概括的应用可不止于此,例如一个常见的场景是电商商家对客户海量、冗长的评论进行概括,服务商能够高效......
  • 浅谈文本匹配
    文本匹配,即比较两个文本是否在某个维度上匹配,通常是比较两个文本之间是否在表达相同的意思,所以文本匹配一般也归结为计算两个文本之间的相似性。当然“相同的意思”也是不太好定义的,鉴于语言的复杂性,文本匹配通常是在相对直接的层次计算文本之间的相似性。目录:目录字面匹配&语......
  • 要做到单行文本超出时,中间部分显示...有什么方法?
    在前端开发中,如果你想要实现单行文本超出容器宽度时,中间部分显示省略号(...)的效果,可以通过结合CSS的text-overflow、overflow、white-space属性来实现。不过,通常情况下,text-overflow:ellipsis是用于文本超出容器时在尾部显示省略号的。若要在中间显示省略号,可能需要一些额外的技巧......
  • Unity 中一些常见的富文本标签
    Unity支持的富文本标签主要用于在Text和TextMeshPro中格式化和控制文本的显示效果。以下是Unity中一些常见的富文本标签:1.字体样式<b>和</b>:粗体<i>和</i>:斜体<u>和</u>:下划线<s>和</s>:删除线<size=xx>和</size>:设置文本大小,其中xx可以是整数......
  • 小白也能懂文本挖掘之LDA主题模型及代码详解
    文章主要重实际应用,不做过多理论推导  LDA(LatentDirichletAllocation)主题分析模型,即潜在狄利克雷分配模型,是一种文档生成模型,也是一种无监督机器学习技术。(无监督学习即需要手动输入主题数量,下一期进行讲解如何确定LDA主题数)一、LDA模型的基本概念  LDA模型认为一......
  • ABAP excel上传时,数字带文本逗号 转ABAP数量QUAN金额CURR 格式
    主要使用 函数MOVE_CHAR_TO_NUM或者 UNITS_STRING_CONVERT  第二个需要限制客户SU3参数配置X或者函数入参默认X,excel导出默认时X格式, 样例参考代码*&---------------------------------------------------------------------**&ReportYWWZ_TEST57*&----------......
  • 【代码】Python|Windows 批量尝试密码去打开加密的 Word 文档(docx和doc)
    文章目录前言完整代码Githubdocxdoc代码解释1.msoffcrypto方法(用于解密.docx文件)read_secret_word_file函数密码生成与解密尝试try_decrypt_file函数2.comtypes方法(用于解密.doc文件)read_secret_word_file函数注意事项总结结语前言加密永远只能拦住......