基于 PyTorch 的 CIFAR-10 数据集探索与实践
CIFAR-10 数据集是计算机视觉领域中广泛使用的一个数据集,它包含了 60000 张 32x32 像素的彩色图像,被分为 10 个不同的类别,每个类别有 6000 张图像,我们将使用 PyTorch 框架来探索和实践 CIFAR-10 数据集。
一、数据集介绍
CIFAR-10 数据集是由 Alex Krizhevsky、Vinod Nair 和 Geoffrey Hinton 于 2009 年创建的,它是一个用于图像识别任务的小型数据集,被广泛用于研究和比较不同的机器学习和深度学习算法,CIFAR-10 数据集的图像内容包括飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车等。
二、数据加载
在 PyTorch 中,我们可以使用torchvision
库来加载 CIFAR-10 数据集。torchvision
库是 PyTorch 中用于计算机视觉任务的一个库,它提供了许多常用的数据集和数据加载器,以下是加载 CIFAR-10 数据集的代码示例:
import torch 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.CIFAR10(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.CIFAR10(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2) classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse','ship', 'truck')
在上述代码中,我们首先定义了一个数据转换操作transform
,它将图像转换为张量并进行归一化处理,我们使用torchvision.datasets.CIFAR10
函数加载 CIFAR-10 数据集,并将其分为训练集和测试集,我们使用torch.utils.data.DataLoader
函数创建数据加载器,以便在训练和测试过程中方便地加载数据。
三、模型构建
我们将使用一个简单的卷积神经网络(CNN)来对 CIFAR-10 数据集进行分类,CNN 是一种非常有效的深度学习模型,它在图像识别任务中取得了很好的效果,以下是构建 CNN 模型的代码示例:
import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x
在上述代码中,我们定义了一个名为Net
的卷积神经网络类,该类包含了两个卷积层、两个全连接层和一个最大池化层,在forward
方法中,我们定义了前向传播过程,即如何将输入数据通过网络进行处理并得到输出结果。
四、模型训练
在构建好模型后,我们需要对其进行训练,训练过程包括前向传播、计算损失、反向传播和参数更新等步骤,以下是训练模型的代码示例:
import torch.optim as optim net = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) for epoch in range(2): # 遍历数据集 2 次 running_loss = 0.0 for i, data in enumerate(trainloader, 0): # 获取输入数据和标签 inputs, labels = data # 梯度清零 optimizer.zero_grad() # 前向传播 outputs = net(inputs) # 计算损失 loss = criterion(outputs, labels) # 反向传播 loss.backward() # 更新参数 optimizer.step() # 打印统计信息 running_loss += loss.item() if i % 2000 == 1999: # 每 2000 个 mini-batch 打印一次 print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 print('Finished Training')
在上述代码中,我们首先定义了一个损失函数criterion
和一个优化器optimizer
,我们使用一个for
循环遍历数据集 2 次,每次遍历一个 epoch,在每个 epoch 中,我们使用一个for
循环遍历训练数据加载器,每次遍历一个 mini-batch,在每个 mini-batch 中,我们获取输入数据和标签,然后将梯度清零,进行前向传播,计算损失,进行反向传播,更新参数,我们打印每个 epoch 的平均损失。
五、模型评估
在训练好模型后,我们需要对其进行评估,评估过程包括使用测试集数据进行预测,并计算准确率等指标,以下是评估模型的代码示例:
correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data 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: %d %%' % ( 100 * correct / total))
在上述代码中,我们首先将模型设置为评估模式,即不进行反向传播和参数更新,我们使用一个for
循环遍历测试数据加载器,每次遍历一个 mini-batch,在每个 mini-batch 中,我们使用模型进行预测,并计算预测结果与真实标签之间的准确率,我们打印整个测试集的准确率。
六、总结
我们使用 PyTorch 框架探索和实践了 CIFAR-10 数据集,我们首先介绍了 CIFAR-10 数据集的基本信息,然后使用torchvision
库加载了数据集,并使用torch.nn
库构建了一个简单的卷积神经网络模型,我们使用随机梯度下降(SGD)优化器对模型进行了训练,并使用测试集对模型进行了评估,我们打印了模型在测试集上的准确率。
通过本次实践,我们不仅熟悉了 PyTorch 框架的基本使用方法,还了解了卷积神经网络在图像识别任务中的应用,希望本次实践能够对读者有所帮助。
评论列表