深度学习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 导入必要的库
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
2.2 加载预训练VGG16模型
model = models.vgg16(pretrained=True)
# 冻结除最后一层外的所有层参数
for param in model.parameters():
param.requires_grad = False
# 修改最后一层全连接层,以适应三类分类任务
num_ftrs = model.classifier[6].in_features
model.classifier[6] = nn.Linear(num_ftrs, 3) # 3个输出类别
2.3 定义数据转换与加载器
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}
data_dir = 'path_to_your_dataset'
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
data_transforms[x])
for x in ['train', 'val']}
dataloaders = {x: DataLoader(image_datasets[x], batch_size=4,
shuffle=True, num_workers=4)
for x in ['train', 'val']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
class_names = image_datasets['train'].classes
2.4 定义损失函数与优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.classifier[6].parameters(), lr=0.001, momentum=0.9)
2.5 训练模型
def train_model(model, criterion, optimizer, num_epochs=25):
for epoch in range(num_epochs):
print(f'Epoch {epoch}/{num_epochs - 1}')
print('-' * 10)
for phase in ['train', 'val']:
if phase == 'train':
model.train()
else:
model.eval()
running_loss = 0.0
running_corrects = 0
for inputs, labels in dataloaders[phase]:
inputs = inputs.to(device)
labels = labels.to(device)
optimizer.zero_grad()
with torch.set_grad_enabled(phase == 'train'):
outputs = model(inputs)
_, preds = torch.max(outputs, 1)
loss = criterion(outputs, labels)
if phase == 'train':
loss.backward()
optimizer.step()
running_loss += loss.item() * inputs.size(0)
running_corrects += torch.sum(preds == labels.data)
epoch_loss = running_loss / dataset_sizes[phase]
epoch_acc = running_corrects.double() / dataset_sizes[phase]
print(f'{phase} Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')
return model
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = model.to(device)
model = train_model(model, criterion, optimizer, num_epochs=25)
三、模型评估与优化
3.1 评估指标
使用准确率、召回率、F1分数等指标评估模型性能。在验证集和测试集上分别进行评估,以验证模型的泛化能力。
3.2 模型优化
- 调整超参数:如学习率、批次大小、训练轮数等。
- 模型微调:解冻更多层进行训练,或尝试不同的优化器。
- 集成学习:结合多个模型的预测结果,提高分类准确性。
四、结论与展望
本文详细介绍了使用PyTorch框架和VGG16模型在自建的三类图像数据集上实现图像分类的全过程。通过实践,读者不仅掌握了深度学习模型构建与训练的基本技能,还学会了如何处理自建数据集、进行数据预处理和模型评估。未来,可以进一步探索更复杂的网络结构、更高效的训练技巧以及在实际应用场景中的部署与优化。
发表评论
登录后可评论,请前往 登录 或 注册