在本文中,我们将深入探讨如何使用PyTorch训练CIFAR-100数据集,并在单个GPU上测试其效率。CIFAR-100是一个广泛使用的图像分类数据集,包含100个类别,每个类别有6000张32x32像素的彩色图像。PyTorch是一个流行的深度学习框架,它提供了灵活的计算图构建和高效的GPU加速功能,使得在GPU上训练深度学习模型成为可能。 要训练CIFAR-100,我们需要导入必要的库,如PyTorch、torchvision(用于加载CIFAR-100数据集)和其他辅助模块: ```python import torch import torchvision import torchvision.transforms as transforms ``` 接着,我们定义数据预处理步骤,包括归一化和随机翻转、裁剪等操作,以增强训练集: ```python transform_train = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding=4), 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)) ]) ``` 然后,加载CIFAR-100数据集: ```python trainset = torchvision.datasets.CIFAR100(root='./data', train=True, download=True, transform=transform_train) trainloader = torch.utils.data.DataLoader(trainset, batch_size=100, 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) ``` 设计一个卷积神经网络(CNN)架构是训练的关键。一个典型的架构可以是VGG、ResNet或预训练的AlexNet。这里,我们用一个简单的CNN示例: ```python class SimpleCNN(torch.nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = torch.nn.Conv2d(3, 6, 5) self.pool = torch.nn.MaxPool2d(2, 2) self.conv2 = torch.nn.Conv2d(6, 16, 5) self.fc1 = torch.nn.Linear(16 * 5 * 5, 120) self.fc2 = torch.nn.Linear(120, 84) self.fc3 = torch.nn.Linear(84, 100) 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 ``` 现在,初始化模型、损失函数和优化器: ```python device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model = SimpleCNN().to(device) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9) ``` 训练循环如下: ```python num_epochs = 25 for epoch in range(num_epochs): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch {epoch + 1}, Loss: {running_loss / (i + 1)}') ``` 评估模型在测试集上的性能: ```python correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data images, labels = images.to(device), labels.to(device) outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f'Accuracy of the network on the 10000 test images: {100 * correct / total}%') ``` 这个代码示例展示了如何使用PyTorch在单个GPU上训练CIFAR-100数据集的简单CNN模型,并进行效率测试。通过调整网络结构、优化器参数和批次大小,可以进一步优化模型的性能和GPU利用率。同时,注意在实际项目中,可能需要更复杂的模型结构(如ResNet、DenseNet等)和更精细的超参数调优策略。
- 1
- 粉丝: 3w+
- 资源: 43
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助