在这一小节中,我们将详细介绍如何使用 PyTorch 构建一个简单的神经网络。我们将分步骤进行,包括数据准备、模型定义、训练及评估等部分。
1. 数据准备 在构建神经网络之前,首先需要准备训练和测试数据。我们将使用 torchvision
库中的 MNIST 数据集,这是一个手写数字识别的数据集。
1.1 导入必要的库 1 2 3 4 5 import torchimport torch.nn as nnimport torch.optim as optimimport torchvisionimport torchvision.transforms as transforms
1.2 下载和加载数据集 我们将使用 torchvision.datasets
中的 MNIST
数据集,并应用一些基本的转换,比如将图像转换为张量并进行归一化处理。
1 2 3 4 5 6 7 8 9 10 11 12 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5 ,), (0.5 ,)) ]) trainset = torchvision.datasets.MNIST(root='./data' , train=True , download=True , transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=64 , shuffle=True ) testset = torchvision.datasets.MNIST(root='./data' , train=False , download=True , transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=64 , shuffle=False )
2. 定义神经网络 接下来,我们将定义一个简单的全连接神经网络。我们将创建一个子类 Net
继承自 nn.Module
。
2.1 创建神经网络模型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Net (nn.Module): def __init__ (self ): super (Net, self ).__init__() self .fc1 = nn.Linear(28 * 28 , 128 ) self .fc2 = nn.Linear(128 , 64 ) self .fc3 = nn.Linear(64 , 10 ) self .relu = nn.ReLU() def forward (self, x ): x = x.view(-1 , 28 * 28 ) x = self .fc1(x) x = self .relu(x) x = self .fc2(x) x = self .relu(x) x = self .fc3(x) return x
3. 定义损失函数和优化器 选择一个适当的损失函数和优化器对于训练模型是至关重要的。对于多类别分类问题,我们通常使用 CrossEntropyLoss
作为损失函数,使用 Adam
作为优化器。
1 2 3 4 model = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001 )
4. 训练模型 现在,我们可以开始训练模型。我们将迭代多个 epoch,每个 epoch 中使用训练数据进行模型的更新。
4.1 训练过程 1 2 3 4 5 6 7 8 9 10 11 num_epochs = 5 for epoch in range (num_epochs): for inputs, labels in trainloader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() print (f'Epoch [{epoch+1 } /{num_epochs} ], Loss: {loss.item():.4 f} ' )
5. 评估模型 训练完成后,我们需要评估模型在测试集上的效果。我们将计算模型的准确率。
5.1 测试过程 1 2 3 4 5 6 7 8 9 10 11 correct = 0 total = 0 with torch.no_grad(): for inputs, labels in testloader: outputs = model(inputs) _, predicted = torch.max (outputs.data, 1 ) total += labels.size(0 ) correct += (predicted == labels).sum ().item() print (f'Accuracy: {100 * correct / total:.2 f} %' )
总结 通过上述步骤,我们成功实现了一个简单的神经网络,并对其进行训练和评估。在这个过程中,我们使用了 PyTorch 的基本功能,包括数据加载、模型构建、损失计算和梯度更新等。接下来,您可以尝试调整网络结构、优化器或者其他超参数,进一步提高模型的性能。