利用PyTorch实现VGG16教程

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 %。这是一种不错的结果,但对于更复杂的数据集和任务,我们可能需要更复杂的神经网络。

后端开发标签