Spaces:
Starting
Starting
| 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() |