Transformer实战案例
本文档提供了多个完整的Transformer实战案例,帮助您从零开始构建Transformer应用。
案例1:文本分类系统
项目概述
构建一个基于BERT的文本分类系统,能够对新闻文章进行自动分类。
技术栈
- 模型:BERT-base-chinese
- 框架:PyTorch + Transformers
- 数据处理:Pandas + NumPy
- 评估:sklearn
实施步骤
步骤1:环境准备
pip install torch transformers pandas numpy scikit-learn
步骤2:数据准备
import pandas as pd
from sklearn.model_selection import train_test_split
# 加载数据
df = pd.read_csv('news_data.csv')
train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)
print(f"训练集大小: {len(train_df)}")
print(f"测试集大小: {len(test_df)}")
步骤3:模型训练
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
import torch
# 加载模型和分词器
model_name = 'bert-base-chinese'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(
model_name,
num_labels=10 # 10个分类
)
# 准备数据集
class NewsDataset(torch.utils.data.Dataset):
def __init__(self, texts, labels, tokenizer, max_length=128):
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 = str(self.texts[idx])
label = self.labels[idx]
encoding = self.tokenizer(
text,
truncation=True,
padding='max_length',
max_length=self.max_length,
return_tensors='pt'
)
return {
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'labels': torch.tensor(label, dtype=torch.long)
}
train_dataset = NewsDataset(
train_df['text'].tolist(),
train_df['label'].tolist(),
tokenizer
)
# 训练参数
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
)
# 训练器
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
)
# 开始训练
trainer.train()