1. 获取损失值
在训练过程中,损失值可以通过训练循环中的损失函数计算得到。以下是一个简化的代码示例:
Python复制
import torch
import torch.optim as optim
from torchvision.models.detection import fasterrcnn_resnet50_fpn
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
from torchvision.datasets import VOCDetection
from torchvision import transforms
from torch.utils.data import DataLoader# 定义数据集和数据加载器
transform = transforms.Compose([transforms.ToTensor(),transforms.RandomHorizontalFlip(0.5)
])train_dataset = VOCDetection(root='path_to_voc', year='2012', image_set='train', download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=2, shuffle=True)# 加载 Faster R-CNN 模型
model = fasterrcnn_resnet50_fpn(pretrained=True)
num_classes = 21 # VOC 数据集有 20 个类别 + 背景
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.005, momentum=0.9, weight_decay=0.0005)# 训练循环
num_epochs = 10
train_losses = []for epoch in range(num_epochs):model.train()total_loss = 0.0for images, targets in train_loader:images = [image.to(device) for image in images]targets = [{k: v.to(device) for k, v in t.items()} for t in targets]optimizer.zero_grad()loss_dict = model(images, targets)losses = sum(loss for loss in loss_dict.values())losses.backward()optimizer.step()total_loss += losses.item()avg_loss = total_loss / len(train_loader)train_losses.append(avg_loss)print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {avg_loss:.4f}')
2. 获取精确度均值
精确度可以通过在验证集上评估模型来计算。以下是一个简化的代码示例:
Python复制
from torchvision.datasets import VOCDetection
from torch.utils.data import DataLoader# 定义验证数据集和数据加载器
val_dataset = VOCDetection(root='path_to_voc', year='2012', image_set='val', download=True, transform=transform)
val_loader = DataLoader(val_dataset, batch_size=1, shuffle=False)# 验证循环
val_losses = []
model.eval()
with torch.no_grad():for images, targets in val_loader:images = [image.to(device) for image in images]targets = [{k: v.to(device) for k, v in t.items()} for t in targets]loss_dict = model(images, targets)losses = sum(loss for loss in loss_dict.values())val_losses.append(losses.item())avg_val_loss = sum(val_losses) / len(val_losses)
print(f'Validation Loss: {avg_val_loss:.4f}')
3. 获取迭代耗时
可以通过记录每次迭代的开始和结束时间来计算迭代耗时。以下是一个简化的代码示例:
Python复制
import time# 训练循环
num_epochs = 10
train_losses = []
iteration_times = []for epoch in range(num_epochs):model.train()total_loss = 0.0start_time = time.time()for i, (images, targets) in enumerate(train_loader):start_iter_time = time.time()images = [image.to(device) for image in images]targets = [{k: v.to(device) for k, v in t.items()} for t in targets]optimizer.zero_grad()loss_dict = model(images, targets)losses = sum(loss for loss in loss_dict.values())losses.backward()optimizer.step()total_loss += losses.item()end_iter_time = time.time()iteration_times.append(end_iter_time - start_iter_time)avg_loss = total_loss / len(train_loader)train_losses.append(avg_loss)end_time = time.time()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {avg_loss:.4f}, Time: {end_time - start_time:.2f}s')# 打印每次迭代的平均耗时
avg_iteration_time = sum(iteration_times) / len(iteration_times)
print(f'Average Iteration Time: {avg_iteration_time:.4f}s')
4. 可视化损失值
可以使用 Matplotlib 绘制损失值的变化曲线:
Python复制
import matplotlib.pyplot as plt# 绘制训练损失曲线
plt.plot(range(num_epochs), train_losses, label='Train Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.legend()
plt.show()# 绘制验证损失曲线
plt.plot(range(len(val_losses)), val_losses, label='Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Validation Loss')
plt.legend()
plt.show()
通过上述代码,你可以在 Faster R-CNN 的训练过程中获取损失值、精确度均值和迭代耗时等数据,并进行可视化分析。