TraceDetect-AI / train_text_model.py
nchdlhbctm's picture
Upload 13 files
646535a verified
Raw
History Blame Contribute Delete
3.42 kB
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from torch.optim import AdamW
from tqdm import tqdm
# 1. 定义专属的 PyTorch 文本数据集
class AITextDataset(Dataset):
def __init__(self, csv_file, tokenizer, max_len=128):
self.data = pd.read_csv(csv_file)
self.tokenizer = tokenizer
self.max_len = max_len
def __len__(self):
return len(self.data)
def __getitem__(self, index):
text = str(self.data.iloc[index, 0])
label = int(self.data.iloc[index, 1])
# 将汉字切成 token 序列
encoding = self.tokenizer(
text,
add_special_tokens=True,
max_length=self.max_len,
padding='max_length',
truncation=True,
return_attention_mask=True,
return_tensors='pt',
)
return {
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'labels': torch.tensor(label, dtype=torch.long)
}
def train_text():
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"💻 当前计算设备: {device}")
if device.type == 'cpu':
print("⚠️ 警告:当前使用 CPU 炼丹。NLP模型参数量巨大,这可能需要一些时间,请耐心等待...")
print("正在加载预训练的中文 BERT 分词器与模型权重...")
# 【核心修复】:换成了官方真实存在、最经典的 bert-base-chinese
model_name = "bert-base-chinese"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)
model = model.to(device)
print("正在封装数据...")
dataset = AITextDataset('./data/text_dataset.csv', tokenizer, max_len=128)
# 批量大小设为 8,防止 CPU 内存吃紧
dataloader = DataLoader(dataset, batch_size=8, shuffle=True)
optimizer = AdamW(model.parameters(), lr=2e-5)
epochs = 1
print("\n🚀 --- 开始文本模型微调 ---")
model.train()
for epoch in range(epochs):
progress_bar = tqdm(dataloader, desc=f"第 {epoch + 1}/{epochs} 轮", leave=True, colour='blue')
running_loss = 0.0
for batch in progress_bar:
optimizer.zero_grad()
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['labels'].to(device)
outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
loss = outputs.loss
loss.backward()
optimizer.step()
running_loss += loss.item()
progress_bar.set_postfix({'loss': f"{loss.item():.4f}"})
print(f"✅ 第 {epoch + 1} 轮完成 | 平均 Loss: {running_loss / len(dataloader):.4f}")
# 保存咱们微调后的专属大模型权重
save_dir = "./finetuned_text_model"
model.save_pretrained(save_dir)
tokenizer.save_pretrained(save_dir)
print(f"\n🎉 炼丹成功!专属的文本鉴别模型已保存在: {save_dir} 文件夹中。")
if __name__ == "__main__":
train_text()