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

在Python中使用torchvision.models.vgg进行迁移学习:从图像分类到目标检测

发布时间:2023-12-31 14:34:26

在Python中使用torchvision.models.vgg进行迁移学习是一种常见的方法,可以将预训练的卷积神经网络模型用于图像分类任务,并将其扩展到目标检测任务。

首先,我们需要导入必要的库:

import torch
import torchvision
from torchvision import datasets, models, transforms

接下来,我们可以加载预训练的VGG模型,并对其进行微调以进行新任务:

# 加载预训练的VGG模型
vgg = models.vgg16(pretrained=True)

# 冻结VGG网络的参数
for param in vgg.parameters():
    param.requires_grad = False

# 替换最后一层全连接层
num_classes = 10  # 新任务的类别数
vgg.classifier[6] = torch.nn.Linear(vgg.classifier[6].in_features, num_classes)

# 将模型传递给GPU(如果可用)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
vgg = vgg.to(device)

在进行微调之前,我们冻结了VGG网络的所有参数,以保持其预训练权重不变。然后,我们替换了最后一层的全连接层,将其输出大小调整为新任务的类别数。

接下来,我们可以加载我们的数据集并进行必要的数据转换:

# 数据转换
data_transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225])
])

# 加载数据集
train_dataset = datasets.ImageFolder("path/to/train", transform=data_transform)
valid_dataset = datasets.ImageFolder("path/to/valid", transform=data_transform)
test_dataset = datasets.ImageFolder("path/to/test", transform=data_transform)

# 创建数据加载器
batch_size = 32
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
valid_loader = torch.utils.data.DataLoader(valid_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=True)

我们使用torchvision提供的datasets和transforms来加载和转换训练、验证和测试数据集。您可以根据自己的需求更改数据集的路径和其他参数。

最后,我们可以定义训练和评估的过程:

# 定义损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(vgg.classifier[6].parameters(), lr=0.001, momentum=0.9)

# 训练
num_epochs = 10
for epoch in range(num_epochs):
    for images, labels in train_loader:
        images = images.to(device)
        labels = labels.to(device)

        # 前向传递
        outputs = vgg(images)
        loss = criterion(outputs, labels)

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

    # 在验证集上评估
    with torch.no_grad():
        correct = 0
        total = 0
        for images, labels in valid_loader:
            images = images.to(device)
            labels = labels.to(device)
            outputs = vgg(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
        accuracy = correct / total
        print(f"Epoch {epoch+1}: Validation Accuracy = {accuracy}")

在每个训练周期内,我们将数据传递给VGG模型并进行前向传递。然后,我们计算损失并执行反向传播和优化。在每个周期的末尾,我们使用验证集评估模型的性能。

该示例仅涉及图像分类任务,而不是目标检测。如果要将VGG用于目标检测,您需要进行更多的工作,并使用适当的数据集和损失函数(例如,YOLO或SSD)。

希望这个例子能帮助您理解如何使用torchvision.models.vgg进行迁移学习,并将其扩展到目标检测任务。