2 使用自己的数据训练一个简单的二分类模型

1 下载数据

1null手把手带你实战 Huggingface Transformers 课程视频同步更新在B站与YouTube - transformers-code/01-Getting Started/04-model/ChnSentiCorp_htl_all.csv at master · zyds/transformers-codehttps://github.com/zyds/transformers-code/blob/master/01-Getting%20Started/04-model/ChnSentiCorp_htl_all.csv手把手带你实战 Huggingface Transformers 课程视频同步更新在B站与YouTube - transformers-code/01-Getting Started/04-model/ChnSentiCorp_htl_all.csv at master · zyds/transformers-codehttps://github.com/zyds/transformers-code/blob/master/01-Getting%20Started/04-model/ChnSentiCorp_htl_all.csv巧妇难为无米之炊,先准备数据吧!

1.1 简单数据分析:

2 上代码,上模型

1 整理数据。 2 加载预训练模型。 3 微调。

复制代码
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import pandas as pd
data = pd.read_csv("./data/ChnSentiCorp_htl_all.csv")
data = data.dropna()
# 画图
data.groupby('label').count().plot(kind='bar')



# 变化成模型能够读懂的格式
from torch.utils.data import Dataset

class MyDataset(Dataset):

    def __init__(self) -> None:
        super().__init__()
        self.data = pd.read_csv("./data/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)
# 划分数据集
from torch.utils.data import random_split
dataset = MyDataset()

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


import torch

tokenizer = AutoTokenizer.from_pretrained("./dianping")

# 前面提到了 需要对数据进行处理称模型能够接受的格式: input_ids, token_type_ids,attention_mask
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
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)



# 加载预训练模型,然后优化
from torch.optim import Adam
model = AutoModelForSequenceClassification.from_pretrained("./dianping")

if torch.cuda.is_available():
    model = model.cuda()
# 两个参数, 1 模型参数, 2 学习速率
optimizer = Adam(model.parameters(), lr=2e-5)
def evaluate():
    model.eval()
    acc_num = 0
    with torch.inference_mode():
        for batch in validloader:
            if torch.cuda.is_available():
                batch = {k: v.cuda() for k, v in batch.items()}
            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:
            # 是否使用显卡
            if torch.cuda.is_available():
                batch = {k: v.cuda() for k, v in batch.items()}
            # 梯度归零
            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()
        print(f"ep: {ep}, acc: {acc}")

train()
sen = "真的不错,推荐你来来试试这个过程!"
id2_label = {0: "差评!", 1: "好评!"}
model.eval()
with torch.inference_mode():
    inputs = tokenizer(sen, return_tensors="pt")
    inputs = {k: v.cuda() for k, v in inputs.items()}
    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)
复制代码
输出:
ep: 0, global_step: 0, loss: 0.3093985319137573
ep: 0, global_step: 100, loss: 0.15114116668701172
ep: 0, global_step: 200, loss: 0.18284356594085693
ep: 0, acc: 0.9123711585998535
ep: 1, global_step: 300, loss: 0.06553637981414795
ep: 1, global_step: 400, loss: 0.12580494582653046
ep: 1, acc: 0.907216489315033
ep: 2, global_step: 500, loss: 0.1393854171037674
ep: 2, global_step: 600, loss: 0.024754131212830544
ep: 2, acc: 0.907216489315033

输入:真的不错,推荐你来来试试这个过程!
模型预测结果:好评!

cpu很慢.....

相关推荐
人工智能AI技术2 分钟前
CES 2026启示录:端侧AI部署全攻略——用TensorFlow Lite让AI跑在手机上
人工智能
杀生丸学AI4 分钟前
【世界模型】AI世界模型的两次物理大考(测评)
人工智能·扩散模型·具身智能·视频生成·世界模型·自回归·空间智能
ATM0064 分钟前
专其利AI | 开物之芯团队重磅发布「专其利 AI 专利辅助撰写平台」,30 秒定名、10 分钟出五书!
人工智能·大模型·专利撰写·专其利ai
2401_832298105 分钟前
四大厂商云服务器安全创新对比,筑牢数字化转型安全底座
人工智能
熵减纪元5 分钟前
OpenClaw gateway start 报 401 Invalid API key?一个环境变量的坑
人工智能·aigc
Agentcometoo6 分钟前
2026 AI 元年:当人工智能不再以“创新项目”的形式出现
人工智能·文心一言·2026ai元年·时代趋势
2501_933329556 分钟前
Infoseek数字公关AI中台技术解析:基于AI的智能舆情治理系统架构与实践
人工智能·系统架构
aixiao_xiaoo8 分钟前
【深度学习中计算表面法线计算方法】
人工智能·深度学习
落羽的落羽10 分钟前
【Linux系统】文件IO:理解文件描述符、重定向、缓冲区
linux·服务器·开发语言·数据结构·c++·人工智能·机器学习
爱吃泡芙的小白白13 分钟前
深入权重之核:机器学习权重参数最新技术与实践全解析
人工智能·学习·机器学习