logo

深度学习PyTorch实战:VGG16三类图像分类与自建数据集指南

作者:搬砖的石头2025.09.26 17:13浏览量:0

简介:本文详述了使用PyTorch框架与VGG16模型实现三类图像分类的实战过程,涵盖自建数据集准备、模型构建、训练优化及评估等关键环节。

引言

深度学习领域,图像分类作为计算机视觉的核心任务之一,具有广泛的应用场景。本文作为“深度学习PyTorch实战”系列的第三篇,将聚焦于使用经典的VGG16网络结构,在自建的三类图像数据集上实现高效的图像分类。通过本文,读者将掌握从数据集构建到模型训练、评估的全流程,为实际项目打下坚实基础。

一、自建三类图像数据集

1.1 数据集规划

首先,明确分类任务的目标:将图像分为三类。例如,可以选择“猫”、“狗”、“鸟”作为三类。数据集应包含足够数量的各类图像,以确保模型能够学习到丰富的特征。建议每类至少收集500-1000张图像,以覆盖不同的姿态、光照条件等变化。

1.2 数据收集与标注

  • 数据收集:可以通过网络爬虫、公开数据集(如ImageNet的子集)或自行拍摄的方式收集图像。
  • 数据标注:使用工具如LabelImg、CVAT等进行图像标注,为每张图像分配对应的类别标签。确保标注准确无误,这对模型性能至关重要。

1.3 数据预处理

  • 图像缩放:将所有图像统一缩放至VGG16输入层要求的尺寸(通常为224x224像素)。
  • 数据增强:通过旋转、翻转、裁剪等操作增加数据多样性,提高模型泛化能力。
  • 归一化:对图像像素值进行归一化处理,通常是将像素值缩放到[0,1]或[-1,1]区间。

1.4 数据集划分

将数据集划分为训练集、验证集和测试集,比例通常为70%:15%:15%。确保每个集合中各类图像的比例大致相同,以避免类别不平衡问题。

二、VGG16模型构建与训练

2.1 导入必要的库

  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. from torchvision import datasets, transforms, models
  5. from torch.utils.data import DataLoader

2.2 加载预训练VGG16模型

  1. model = models.vgg16(pretrained=True)
  2. # 冻结除最后一层外的所有层参数
  3. for param in model.parameters():
  4. param.requires_grad = False
  5. # 修改最后一层全连接层,以适应三类分类任务
  6. num_ftrs = model.classifier[6].in_features
  7. model.classifier[6] = nn.Linear(num_ftrs, 3) # 3个输出类别

2.3 定义数据转换与加载器

  1. data_transforms = {
  2. 'train': transforms.Compose([
  3. transforms.RandomResizedCrop(224),
  4. transforms.RandomHorizontalFlip(),
  5. transforms.ToTensor(),
  6. transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
  7. ]),
  8. 'val': transforms.Compose([
  9. transforms.Resize(256),
  10. transforms.CenterCrop(224),
  11. transforms.ToTensor(),
  12. transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
  13. ]),
  14. }
  15. data_dir = 'path_to_your_dataset'
  16. image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
  17. data_transforms[x])
  18. for x in ['train', 'val']}
  19. dataloaders = {x: DataLoader(image_datasets[x], batch_size=4,
  20. shuffle=True, num_workers=4)
  21. for x in ['train', 'val']}
  22. dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
  23. class_names = image_datasets['train'].classes

2.4 定义损失函数与优化器

  1. criterion = nn.CrossEntropyLoss()
  2. optimizer = optim.SGD(model.classifier[6].parameters(), lr=0.001, momentum=0.9)

2.5 训练模型

  1. def train_model(model, criterion, optimizer, num_epochs=25):
  2. for epoch in range(num_epochs):
  3. print(f'Epoch {epoch}/{num_epochs - 1}')
  4. print('-' * 10)
  5. for phase in ['train', 'val']:
  6. if phase == 'train':
  7. model.train()
  8. else:
  9. model.eval()
  10. running_loss = 0.0
  11. running_corrects = 0
  12. for inputs, labels in dataloaders[phase]:
  13. inputs = inputs.to(device)
  14. labels = labels.to(device)
  15. optimizer.zero_grad()
  16. with torch.set_grad_enabled(phase == 'train'):
  17. outputs = model(inputs)
  18. _, preds = torch.max(outputs, 1)
  19. loss = criterion(outputs, labels)
  20. if phase == 'train':
  21. loss.backward()
  22. optimizer.step()
  23. running_loss += loss.item() * inputs.size(0)
  24. running_corrects += torch.sum(preds == labels.data)
  25. epoch_loss = running_loss / dataset_sizes[phase]
  26. epoch_acc = running_corrects.double() / dataset_sizes[phase]
  27. print(f'{phase} Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')
  28. return model
  29. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  30. model = model.to(device)
  31. model = train_model(model, criterion, optimizer, num_epochs=25)

三、模型评估与优化

3.1 评估指标

使用准确率、召回率、F1分数等指标评估模型性能。在验证集和测试集上分别进行评估,以验证模型的泛化能力。

3.2 模型优化

  • 调整超参数:如学习率、批次大小、训练轮数等。
  • 模型微调:解冻更多层进行训练,或尝试不同的优化器。
  • 集成学习:结合多个模型的预测结果,提高分类准确性。

四、结论与展望

本文详细介绍了使用PyTorch框架和VGG16模型在自建的三类图像数据集上实现图像分类的全过程。通过实践,读者不仅掌握了深度学习模型构建与训练的基本技能,还学会了如何处理自建数据集、进行数据预处理和模型评估。未来,可以进一步探索更复杂的网络结构、更高效的训练技巧以及在实际应用场景中的部署与优化。

相关文章推荐

发表评论