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

PyTorch实现CIFAR100数据集的卷积神经网络模型

发布时间:2023-12-29 13:06:54

CIFAR100是一个包含100个类别的图像分类数据集。每个类别包含600张训练图像和100张测试图像。每张图像的尺寸为32x32像素,其中包含标注的类别信息。在本篇文章中,我们将使用PyTorch实现一个卷积神经网络模型来对CIFAR100数据集进行分类。

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

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

接下来,我们可以定义一些超参数,如批大小、学习率、迭代次数等:

batch_size = 64
learning_rate = 0.001
num_epochs = 10

然后,我们需要准备数据集。使用torchvision来加载CIFAR100数据集,并将像素值进行标准化处理:

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=batch_size,
                                          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=batch_size,
                                         shuffle=False, num_workers=2)

接下来,我们可以定义我们的卷积神经网络模型。在这个例子中,我们将使用5个卷积层、2个全连接层和一个softmax层:

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        self.conv4 = nn.Conv2d(128, 128, kernel_size=3, padding=1)
        self.conv5 = nn.Conv2d(128, 64, kernel_size=3, padding=1)
        self.fc1 = nn.Linear(64*4*4, 512)
        self.fc2 = nn.Linear(512, 100)
        self.relu = nn.ReLU()
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.softmax = nn.Softmax(dim=1)

    def forward(self, x):
        x = self.relu(self.conv1(x))
        x = self.maxpool(x)
        x = self.relu(self.conv2(x))
        x = self.maxpool(x)
        x = self.relu(self.conv3(x))
        x = self.maxpool(x)
        x = self.relu(self.conv4(x))
        x = self.maxpool(x)
        x = self.relu(self.conv5(x))
        x = self.maxpool(x)
        x = x.view(x.size(0), -1)
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        x = self.softmax(x)
        return x

model = CNN()

在完成模型定义后,我们需要定义损失函数和优化器。在这个例子中,我们将使用交叉熵损失函数和Adam优化器:

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

接下来,我们可以开始训练模型。在每个epoch中,我们会迭代训练集中的所有批次,并更新模型参数:

for epoch in range(num_epochs):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        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('Epoch %d, Batch %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
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

accuracy = 100 * correct / total
print('Accuracy on test images: %.2f %%' % accuracy)

以上是一个基于PyTorch的CIFAR100数据集的卷积神经网络模型的实现例子。在训练过程中可以根据需要调整超参数和网络结构来优化模型性能。同时,也可以进一步探索其他领域的数据集和不同的卷积神经网络模型来进行图像分类任务。