欢迎访问宙启技术站
智能推送

深入了解VGG神经网络架构

发布时间:2024-01-16 14:57:22

VGG(Visual Geometry Group)是由牛津大学的研究团队开发的一种卷积神经网络架构,用于图像识别和计算机视觉任务。其主要特点是采用了较小的卷积核尺寸,多层堆叠的结构以及全连接层的结构。VGG网络模型具有比较深的结构,这也是其在图像识别任务中表现出色的原因之一。

VGG网络的基本模块是由一个或多个3x3的卷积层和一个2x2的最大池化层组成。而在整个网络中,这个基本模块可以重复多次。通过使用连续的卷积层和池化层,VGG网络可以学习到更加复杂的图像特征。在VGG网络中,每个卷积层都使用了ReLU(修正线性单元)来增强模型的非线性能力。

VGG网络的另一个突出特点是网络结构的深度。最流行的VGG网络有16层或19层,其中包括13个卷积层和3个全连接层。由于网络的深度,VGG网络可以学习到更加抽象和高级的特征,从而提高图像识别的准确性。

以下是一个使用VGG网络进行图像分类任务的示例代码:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import torchvision.models as models

# 加载VGG模型
model = models.vgg16(pretrained=True)

# 修改最后的全连接层
num_features = model.classifier[6].in_features
model.classifier[6] = nn.Linear(num_features, 10)  # 假设分类任务有10个类别

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

# 加载数据集并进行数据预处理
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
train_dataset = torchvision.datasets.CIFAR10('.', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)

# 训练模型
for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(train_loader):
        inputs, labels = data
        optimizer.zero_grad()

        # 前向传播
        outputs = model(inputs)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        loss.backward()
        optimizer.step()

        # 统计损失
        running_loss += loss.item()
        if i % 200 == 199:  # 每200个batch打印一次损失
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 200))
            running_loss = 0.0

print('Finished Training')

# 使用训练好的模型进行预测
test_dataset = torchvision.datasets.CIFAR10('.', train=False, download=True, transform=transform)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False)

correct = 0
total = 0
with torch.no_grad():
    for data in test_loader:
        images, labels = data
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy on test images: %d %%' % (100 * correct / total))

上述代码首先加载了预训练的VGG模型,然后修改了模型的最后一层,以适应特定的分类任务。接下来定义了损失函数和优化器,以及数据预处理的方法。然后使用训练数据进行模型训练,每训练完200个batch打印一次损失。最后使用测试数据对模型进行评估,计算模型的准确率。

这是一个简单的使用VGG网络进行图像分类任务的例子,通过加载预训练的模型,修改最后一层,并使用训练数据进行训练和测试数据进行评估,可以实现高准确率的图像分类任务。