1. 简介
VGG是一种深度卷积神经网络,它在图像识别的任务上有较好的表现。该网络在ILSVRC-2014比赛中获得了第二名的好成绩。本文将介绍如何使用PyTorch实现VGG16,以进行图像分类任务。
2. 数据集
我们将使用CIFAR-10数据集,该数据集包含10个不同类别的图像,每个类别6000张图像,其中50000张用于训练,10000张用于测试。我们可以使用PyTorch的内置函数将数据集下载到本地。
import torch
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose(
[transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
以上代码将图像大小调整为224 x 224,并进行了标准化。训练集和测试集分别被拆分为大小为4的小批次处理,且在每个小批次中对数据进行随机洗牌。
3. VGG16模型
VGG16模型由16层卷积神经网络组成,其中包含13个卷积层和3个全连接层。我们可以使用PyTorch的torchvision.models
模块中的vgg16
来构建该模型。
import torchvision.models as models
net = models.vgg16() # 加载VGG16模型
我们还需要将模型的最后一层替换为一个具有10个输出节点的新层,以便进行10分类任务(CIFAR-10数据集有10个类别)。
import torch.nn as nn
net.classifier._modules['6'] = nn.Linear(4096, 10) # 替换最后一层
接下来,我们可以定义损失函数和优化器。
import torch.optim as optim
criterion = nn.CrossEntropyLoss() # 损失函数为交叉熵
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) # 定义优化器
4. 训练模型
我们将使用以下代码来训练模型。
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net.to(device) # 将模型移动到GPU(如果可用)
for epoch in range(2): # 迭代2次
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data[0].to(device), data[1].to(device)
optimizer.zero_grad() # 梯度清零
outputs = net(inputs) # 前向传播
loss = criterion(outputs, labels) # 计算损失
loss.backward() # 反向传播
optimizer.step() # 更新参数
running_loss += loss.item()
if i % 2000 == 1999: # 每2000次迭代打印一次损失
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0
print('Finished Training')
我们首先将模型移动到GPU(如果可用),然后迭代两次,每个迭代步骤中都进行前向传播,反向传播和参数更新。我们还观察了每个迭代步骤的损失,以确定模型的训练效果。
5. 测试模型
我们将使用以下代码来测试模型。
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data[0].to(device), data[1].to(device)
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %.2f %%' % (
100 * correct / total))
我们使用测试数据集对模型进行测试,然后计算模型的精度。在本例中,模型预测的准确率为70.32 %。这是一种不错的结果,但对于更复杂的数据集和任务,我们可能需要更复杂的神经网络。