python pytorch tensorflow transforms 模型培训脚本

环境准备

https://www.doubao.com/thread/w5e26d6401c003bb2

执行培训脚本

bash 复制代码
import torch
from torch.utils.data import Dataset, DataLoader
from transformers import DistilBertTokenizer, DistilBertForSequenceClassification, AdamW
import numpy as np


# 自定义数据集类
class SentimentDataset(Dataset):
    def __init__(self, texts, labels, tokenizer, max_length):
        self.texts = texts
        self.labels = labels
        self.tokenizer = tokenizer
        self.max_length = max_length

    def __len__(self):
        return len(self.texts)

    def __getitem__(self, idx):
        text = self.texts[idx]
        label = self.labels[idx]
        encoding = self.tokenizer.encode_plus(
            text,
            add_special_tokens=True,
            max_length=self.max_length,
            padding='max_length',
            truncation=True,
            return_tensors='pt'
        )
        return {
            'input_ids': encoding['input_ids'].flatten(),
            'attention_mask': encoding['attention_mask'].flatten(),
            'labels': torch.tensor(label, dtype=torch.long)
        }


# 新增问答数据
qa_texts = ["李白是那个朝代的诗人?", "地球的卫星是什么?", "中国的首都是哪里?", "水的化学式是什么?", "苹果公司的创始人是谁?"]
qa_labels = [1, 2, 3, 4, 5]  # 为每个问题分配一个唯一的标签

# 合并数据
all_texts = qa_texts
all_labels = qa_labels

# 初始化 tokenizer
tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-uncased')

# 创建数据集和数据加载器
dataset = SentimentDataset(all_texts, all_labels, tokenizer, max_length=128)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

# 初始化模型,注意 num_labels 需要根据总标签数调整
model = DistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased', num_labels=8)

# 定义优化器,加入 weight_decay 进行正则化
optimizer = AdamW(model.parameters(), lr=1e-4, weight_decay=0.01)

# 训练模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

# 早停策略相关参数
best_loss = float('inf')
patience = 3
counter = 0

for epoch in range(20):  # 增加训练轮数,但结合早停策略
    total_loss = 0
    model.train()
    for batch in dataloader:
        input_ids = batch['input_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        labels = batch['labels'].to(device)

        optimizer.zero_grad()
        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
        loss = outputs.loss
        loss.backward()
        optimizer.step()
        total_loss += loss.item()

    avg_loss = total_loss / len(dataloader)
    print(f'Epoch {epoch + 1}, Loss: {avg_loss}')

    # 早停策略
    if avg_loss < best_loss:
        best_loss = avg_loss
        counter = 0
    else:
        counter += 1
        if counter >= patience:
            print("Early stopping triggered!")
            break

# 处理提问的函数
def handle_query(model, tokenizer, query_text, device):
    model.eval()
    with torch.no_grad():
        encoding = tokenizer(query_text, return_tensors='pt', padding=True, truncation=True, max_length=128).to(device)
        logits = model(**encoding).logits
        predictions = np.argmax(logits.cpu().numpy(), axis=1)
        return predictions

# 情感标签映射
label_mapping = {
    1: "唐朝",
    2: "月球",
    3: "北京",
    4: "H2O",
    5: "史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗恩·韦恩"
}

# 针对新增的5条数据提问
query_text = ["李白是那个朝代的诗人?", "地球的卫星是什么?", "中国的首都是哪里?", "水的化学式是什么?", "苹果公司的创始人是谁?"]
result = handle_query(model, tokenizer, query_text, device)
readable_result = [label_mapping[pred] for pred in result]
print("Query result:", readable_result)
相关推荐
雨墨✘4 分钟前
PHP怎么执行Shell命令_exec与shell_exec区别说明【说明】
jvm·数据库·python
2201_7568473325 分钟前
mysql字段长度不够用了怎么办_使用alter table扩大varchar长度
jvm·数据库·python
祁_z29 分钟前
Python项目依赖管理:venv与conda
python
overmind30 分钟前
oeasy Python 120[专业选修]列表_直接赋值_浅拷贝_shallowcopy_深拷贝_deepcopy
linux·windows·python
ZC跨境爬虫36 分钟前
海南大学交友平台开发实战 day11(实现性别图标渲染与后端数据关联+Debug复盘)
前端·python·sqlite·html·json
星星也在雾里42 分钟前
Anaconda命令行配置Jupyter Notebook虚拟环境
python·jupyter
极光代码工作室42 分钟前
基于机器学习的信用卡欺诈检测系统设计
人工智能·python·深度学习·机器学习
迷藏4941 小时前
**超融合架构下的Go语言实践:从零搭建高性能容器化微服务集群**在现代云原生时代,*
java·python·云原生·架构·golang
深度学习lover1 小时前
<数据集>yolo 船舶识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·船舶分类识别
测试秃头怪1 小时前
Python+selenium搭建Web自动化测试框架
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例