原创 · 密钥 · 第05把 · 控心术 · 第02钥 | BERT 情绪分类模型训练与推理实战

“锻火不息,意念初显。情绪识别的钥匙,将引你穿越数据幻境。”

​                                                                 ——KeySmith · 密钥锻造

寻钥之人,欢迎你踏入密钥锻造坊。我是 KeySmith,这里是技术人的打铁间。

此刻你翻开的,是本坊锻造的第 05 把密钥,专为构建与训练 中文 BERT 情绪分类模型 而锻。

无论你是初次来访的学徒,还是久经风雨的同行匠人,愿此钥能应你所困,破你所局,开你所门。

📍 上一节回顾:

你已经完成了以下几件事:

        ✅ 构建 .venv 虚拟环境
        ✅ 安装 PyTorch + Transformers + Accelerate
        ✅ 成功封装 Dataset,并可打印样本

🌟 本节目标

        ✅ 搭建 BERT 中文情绪分类模型

        ✅ 构建训练流程并实现模型保存

        ✅ 完成端到端训练闭环,可复现可验证

🌟 那我们开始吧~!!

“情绪如海,唯有利刃可划。相信你自己,能够向着梦想前行”

🔧 Step 5:模型构建 · BERT 三分类情绪识别

 🔓 KeySmith · 密钥锻造坊

from transformers import BertModel
import torch.nn as nn
​
class SentimentClassifier(nn.Module):
    def __init__(self, dropout=0.3):
        super(SentimentClassifier, self).__init__()
        self.bert = BertModel.from_pretrained("bert-base-chinese")
        self.dropout = nn.Dropout(dropout)
        self.out = nn.Linear(self.bert.config.hidden_size, 3)  # 三分类
​
    def forward(self, input_ids, attention_mask):
        outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)
        pooled_output = outputs.pooler_output
        output = self.dropout(pooled_output)
        return self.out(output)

🌟 如果你的输出如下。那么结果非常完美,说明你的数据准备 + Dataset 封装 + 模型类构建这一整套流程已经完全 运行成功,毫无报错,可以正式进入训练阶段了!


🛠️ Step 6:封装 DataLoader

📦 下载资源 · 数据准备完毕

from torch.utils.data import DataLoader
​
train_loader = DataLoader(dataset, batch_size=16, shuffle=True)

⚙️ Step 7:模型训练准备

🧪 测试中… · 初始化训练组件

import torch
from transformers import AdamW
​
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SentimentClassifier()
model.to(device)
​
optimizer = AdamW(model.parameters(), lr=2e-5)
criterion = nn.CrossEntropyLoss()

🔁 Step 8:训练主循环

🔥 热铁 · 循环锻造,精准打击

from tqdm import tqdm
​
def train(model, dataloader, optimizer, criterion, device):
    model.train()
    total_loss = 0
​
    for batch in tqdm(dataloader):
        input_ids = batch['input_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        labels = batch['labels'].to(device)
​
        outputs = model(input_ids=input_ids, attention_mask=attention_mask)
        loss = criterion(outputs, labels)
​
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
​
        total_loss += loss.item()
    
    avg_loss = total_loss / len(dataloader)
    print(f"训练平均损失:{avg_loss:.4f}")

✅ Step 9:执行训练循环

for epoch in range(3):  # 你可以调整训练轮次
    print(f"第 {epoch+1} 轮训练")
    train(model, train_loader, optimizer, criterion, device)

 🔥到这里你可以看到在训练得过程了哈。需要你稍等一会儿哦,运行速度跟电脑内存等it资源有关系。

最后结果如下:有损失很正常哈。


💾 Step 10:保存模型

📦 下载资源 · 保存锻造成果

torch.save(model.state_dict(), "sentiment_model.pth")
print("模型已保存为 sentiment_model.pth")

🔮 Step 11:加载模型 & 预测推理(Bonus)

🧠 思考 · 情绪预测的未来之钥

model = SentimentClassifier()
model.load_state_dict(torch.load("sentiment_model.pth"))
model.to(device)
model.eval()
​
# 推理示例(假设已编码为 input_ids 与 attention_mask)
with torch.no_grad():
    outputs = model(input_ids=input_ids.to(device), attention_mask=attention_mask.to(device))
    probs = torch.softmax(outputs, dim=1)
    predicted = torch.argmax(probs, dim=1)
    print("预测标签:", predicted.item())

“热铁未冷,锻声犹在。愿此钥,已开你心锁。”

                                                                        ——KeySmith · 密钥锻造坊

本篇第 05 把密钥 已锻完毕。

若你觉得这把钥匙还称手, 请为锻造坊添一点火候 —— 点赞、收藏、留言皆是助燃。

当然!

下一把钥匙,正在炉中铸炼, 我会在锻火旁等你,再一同开锁破局。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0xHack | Python黑洞

打赏一口代码味奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值