用PyTorch实现CIFAR100数据集的图像分类
PyTorch是一个基于Python的机器学习库,它提供了丰富的工具和接口,使得图像分类任务的实现变得简单和高效。CIFAR-100是一个图像分类数据集,包含了100个不同的类别,每个类别有600张尺寸为32x32像素的彩色图像。本文将向您介绍如何使用PyTorch来实现CIFAR-100数据集的图像分类。
首先,我们需要安装PyTorch。可以使用以下命令安装PyTorch:
pip install torch torchvision
安装完成后,我们可以开始编写代码。首先,我们需要导入必要的库和模块:
import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms
接下来,我们需要加载和预处理CIFAR-100数据集。PyTorch提供了torchvision.datasets模块来加载常用的数据集。我们可以使用transforms模块来进行数据预处理,如图像的缩放、裁剪和标准化。以下是加载和预处理CIFAR-100数据集的代码:
transform_train = transforms.Compose([
transforms.RandomCrop(32, padding=4),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
transform_test = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
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)
classes = trainset.classes
在上述代码中,我们定义了训练集和测试集的预处理方式,并使用torch.utils.data.DataLoader来将数据集转换成可迭代的加载器。
接下来,我们需要定义一个模型。在这个例子中,我们使用一个简单的卷积神经网络(CNN)模型来进行图像分类。以下是定义CNN模型的代码:
class Net(nn.Module):
def __init__(self):
super(Net, 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.fc1 = nn.Linear(64 * 8 * 8, 512)
self.fc2 = nn.Linear(512, 100)
def forward(self, x):
x = nn.functional.relu(self.conv1(x))
x = nn.functional.max_pool2d(x, 2)
x = nn.functional.relu(self.conv2(x))
x = nn.functional.max_pool2d(x, 2)
x = x.view(-1, 64 * 8 * 8)
x = nn.functional.relu(self.fc1(x))
x = self.fc2(x)
return x
net = Net()
在上述代码中,我们定义了一个由两个卷积层、两个池化层和两个全连接层组成的网络。网络的输出是100个类别的概率分布。请注意,我们使用了nn.functional模块中的函数来实现网络的前向传播过程。
接下来,我们需要定义损失函数和优化器。在这个例子中,我们使用交叉熵损失函数和随机梯度下降(SGD)优化器。以下是定义损失函数和优化器的代码:
criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
现在,我们可以开始训练模型。在每个训练迭代中,我们将输入图像传递给网络,计算损失并更新网络的权重。以下是训练模型的代码:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
net.to(device)
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
在上述代码中,我们首先将模型移动到可用的计算设备(如GPU)上,然后迭代训练数据集中的每一个批次。我们使用了自适应学习率(lr)和动量(momentum)来更新网络的权重。
最后,我们可以使用训练得到的模型对测试集进行预测,并计算准确率。以下是测试模型的代码:
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()
accuracy = 100 * correct / total
print('Accuracy of the network on the 10000 test images: %d %%' % accuracy)
在上述代码中,我们使用torch.max函数来获取每个图像预测的类别,并计算正确预测的数量以及总的测试样本数量。最后,我们计算准确率并输出结果。
通过以上步骤,我们使用PyTorch实现了CIFAR-100数据集的图像分类任务。通过调整模型的结构和超参数,您可以进一步优化模型的性能。希望本文能对您理解和使用PyTorch进行图像分类有所帮助。
