“锻火不息,意念初显。情绪识别的钥匙,将引你穿越数据幻境。”
——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 把密钥 已锻完毕。
若你觉得这把钥匙还称手, 请为锻造坊添一点火候 —— 点赞、收藏、留言皆是助燃。
当然!
下一把钥匙,正在炉中铸炼, 我会在锻火旁等你,再一同开锁破局。