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

CIFAR100数据集的图像分类任务:PyTorch的实现与比较

发布时间:2023-12-29 13:04:21

CIFAR-100是一个图像分类的数据集,其中包含100个不同的类别。每个类别有600个训练图像和100个测试图像。每个图像的尺寸为32×32。在这篇文章中,我们将使用PyTorch来实现CIFAR-100的图像分类任务,并且比较不同模型的性能。

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

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

接下来,我们需要对图像进行一些预处理,以便输入到我们的模型中。我们可以使用transforms模块来进行图像的缩放、裁剪和归一化等操作。此外,我们还可以使用DataLoader来加载和批处理数据。

transform_train = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])

transform_test = 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_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR100(root='./data', train=False,
                                       download=True, transform=transform_test)
testloader = torch.utils.data.DataLoader(testset, batch_size=100,
                                         shuffle=False, num_workers=2)

接下来,我们将定义一个简单的卷积神经网络模型。我们使用两个卷积层,每层后面跟着一个最大池化层。然后是两个全连接层和一个输出层。

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(32 * 8 * 8, 128)
        self.fc2 = nn.Linear(128, 100)

    def forward(self, x):
        x = self.maxpool(F.relu(self.conv1(x)))
        x = self.maxpool(F.relu(self.conv2(x)))
        x = x.view(-1, 32 * 8 * 8)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

接下来,我们可以实例化模型并定义优化器和损失函数。

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

net = SimpleCNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

现在我们可以开始训练模型。我们将在每个epoch中迭代数据集,并根据损失函数和优化器计算损失和梯度,并更新模型的参数。

for epoch in range(10):
    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 % 200 == 199:  
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 200))
            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 = 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))

在这个例子中,我们实现了一个简单的卷积神经网络模型来进行CIFAR-100数据集的图像分类任务。我们使用PyTorch来构建模型,定义优化器和损失函数,并训练模型。最后,我们在测试集上评估模型的准确率。

当然,这只是一个简单的示例。在实际应用中,我们可以尝试使用更复杂的模型,调整超参数调达到更好的性能,比较不同模型的性能,或者使用预训练的模型来进行迁移学习等等。