From cb17be247ede863ac3ecfce585e3b4008575fefd Mon Sep 17 00:00:00 2001 From: yukun-hh Date: Sun, 3 May 2026 16:58:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Finetune.py | 19 ++++++++++++++++++- Train.py | 16 +++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Finetune.py b/Finetune.py index f8031a3..d70baf7 100644 --- a/Finetune.py +++ b/Finetune.py @@ -12,6 +12,7 @@ import matplotlib.pyplot as plt from Model import Net from Dataloader import create_dataloaders import os +import csv def compute_macro_f1(predicted, targets, num_classes=4): @@ -112,6 +113,9 @@ def freeze_base_layers(model): for name, param in model.stage2.named_parameters(): param.requires_grad = False frozen_layers.append(f'stage2.{name}') + for name, param in model.stage3.named_parameters(): + param.requires_grad = False + frozen_layers.append(f'stage3.{name}') trainable = sum(p.numel() for p in model.parameters() if p.requires_grad) total = sum(p.numel() for p in model.parameters()) @@ -134,11 +138,16 @@ def finetune(model, train_loader, val_loader, epochs=30, lr=0.0001, device='cuda history = { 'train_loss': [], 'train_f1': [], + 'train_acc': [], 'val_loss': [], - 'val_f1': [] + 'val_f1': [], + 'val_acc': [] } best_val_f1 = 0.0 + log_file = open('finetune_log.csv', 'w', newline='') + log_writer = csv.writer(log_file) + log_writer.writerow(['epoch', 'train_loss', 'train_f1', 'train_acc', 'val_loss', 'val_f1', 'val_acc', 'lr', 'best']) for epoch in range(epochs): print(f'\n{"=" * 50}') @@ -153,18 +162,26 @@ def finetune(model, train_loader, val_loader, epochs=30, lr=0.0001, device='cuda history['train_loss'].append(train_loss) history['train_f1'].append(train_f1) + history['train_acc'].append(train_acc) history['val_loss'].append(val_loss) history['val_f1'].append(val_f1) + history['val_acc'].append(val_acc) print(f'Train Loss: {train_loss:.4f} | Train Acc: {train_acc:.2f}% | Train Macro-F1: {train_f1:.4f}') print(f'Val Loss: {val_loss:.4f} | Val Acc: {val_acc:.2f}% | Val Macro-F1: {val_f1:.4f}') print(f'Learning Rate: {optimizer.param_groups[0]["lr"]:.6f}') + best_mark = '' if val_f1 > best_val_f1: best_val_f1 = val_f1 torch.save(model.state_dict(), 'finetuned_model.pth') + best_mark = 'best' print(f'✓ 保存最佳微调模型 (Macro-F1: {val_f1:.4f})') + lr = optimizer.param_groups[0]['lr'] + log_writer.writerow([epoch + 1, train_loss, train_f1, train_acc, val_loss, val_f1, val_acc, lr, best_mark]) + log_file.flush() + print(f'\n{"=" * 50}') print(f'微调完成!最佳验证 Macro-F1: {best_val_f1:.4f}') diff --git a/Train.py b/Train.py index 7c98d5a..528d2a4 100644 --- a/Train.py +++ b/Train.py @@ -14,6 +14,7 @@ import matplotlib.pyplot as plt from Model import Net from Dataloader import create_dataloaders import os +import csv def compute_macro_f1(predicted, targets, num_classes=4): @@ -121,11 +122,16 @@ def train(model, train_loader, val_loader, epochs=50, lr=0.001, device='cuda'): history = { 'train_loss': [], 'train_f1': [], + 'train_acc': [], 'val_loss': [], - 'val_f1': [] + 'val_f1': [], + 'val_acc': [] } best_val_f1 = 0.0 + log_file = open('training_log.csv', 'w', newline='') + log_writer = csv.writer(log_file) + log_writer.writerow(['epoch', 'train_loss', 'train_f1', 'train_acc', 'val_loss', 'val_f1', 'val_acc', 'lr', 'best']) # 3. 开始训练 for epoch in range(epochs): @@ -145,8 +151,10 @@ def train(model, train_loader, val_loader, epochs=50, lr=0.001, device='cuda'): # 记录 history['train_loss'].append(train_loss) history['train_f1'].append(train_f1) + history['train_acc'].append(train_acc) history['val_loss'].append(val_loss) history['val_f1'].append(val_f1) + history['val_acc'].append(val_acc) # 打印结果 print(f'Train Loss: {train_loss:.4f} | Train Acc: {train_acc:.2f}% | Train Macro-F1: {train_f1:.4f}') @@ -154,11 +162,17 @@ def train(model, train_loader, val_loader, epochs=50, lr=0.001, device='cuda'): print(f'Learning Rate: {optimizer.param_groups[0]["lr"]:.6f}') # 保存最佳模型 + best_mark = '' if val_f1 > best_val_f1: best_val_f1 = val_f1 torch.save(model.state_dict(), 'best_model.pth') + best_mark = 'best' print(f'✓ 保存最佳模型 (Macro-F1: {val_f1:.4f})') + lr = optimizer.param_groups[0]['lr'] + log_writer.writerow([epoch + 1, train_loss, train_f1, train_acc, val_loss, val_f1, val_acc, lr, best_mark]) + log_file.flush() + # 4. 绘制训练曲线 print(f'\n{"=" * 50}')