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

使用PyTorch进行CIFAR100数据集的迁移学习:一个实例

发布时间:2023-12-29 13:05:02

迁移学习是利用已经训练好的模型在新的任务上进行训练或者进行特征提取的技术。PyTorch是一个流行的深度学习框架,它提供了丰富的工具和函数,使得迁移学习变得相对简单。

在本文中,我们将使用PyTorch进行CIFAR100数据集的迁移学习。CIFAR100是一个包含100个类别的图像分类数据集,每个类别包含600个训练图像和100个测试图像。

我们首先需要下载CIFAR100数据集并加载到内存中。PyTorch提供了一个内置的函数torchvision.datasets.CIFAR100(),可以方便地加载和处理CIFAR100数据集。我们还需要定义数据转换,以便将原始图像转换为适合我们训练模型的形式。下面是加载和处理数据集的代码示例:

import torchvision
import torchvision.transforms as transforms

# 定义数据转换
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

# 加载训练数据集
trainset = torchvision.datasets.CIFAR100(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.CIFAR100(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

接下来,我们需要选择一个预训练的模型作为基础模型,并创建一个新的全连接网络以适应我们的任务。在这个例子中,我们选择了一个预训练的ResNet模型作为基础模型,并在其之上添加了一个新的全连接层。下面是创建预训练的模型和新的全连接层的代码示例:

import torch.nn as nn
import torch.nn.functional as F
import torchvision.models as models

# 加载预训练模型
model = models.resnet18(pretrained=True)

# 固定预训练模型的参数
for param in model.parameters():
    param.requires_grad = False

# 替换最后一层全连接层
model.fc = nn.Linear(512, 100)  # 将全连接层输出的维度修改为100

# 将模型放到GPU上
model = model.to(device)

在完成模型的创建之后,我们需要定义损失函数和优化器,并进行训练和测试。下面是训练和测试的代码示例:

import torch.optim as optim

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

# 训练模型
for epoch in range(5):  # 迭代5次
    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 = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

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

# 在测试集上验证模型的准确率
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = model(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))

以上代码展示了一个使用PyTorch进行CIFAR100数据集的迁移学习的完整实例。通过选择预训练模型作为基础模型,并在其之上添加一个新的全连接层,我们可以利用预训练模型的特征提取能力,并通过对新添加层的训练来适应新任务。

希望这个例子能够帮助您理解如何使用PyTorch进行迁移学习,并在CIFAR100数据集上训练一个准确率较高的模型。你还可以尝试使用不同的预训练模型,或者修改网络结构和超参数来进一步优化模型性能。