1.背景介绍
人工神经网络是模仿生物神经网络而设计的一种计算模型。它由大量的人工神经元细胞组成,通过对输入数据进行处理,解决了许多传统计算模型难以解决的问题。其中,MLP(Multi-Layer Perceptron) 是最基础的神经网络模型之一,也是比较容易掌握的模型。在本文中,我们将使用 PyTorch 实现 MLP 并验证它在 MNIST 数据集上的效果。
2.数据集介绍
MNIST (Modified National Institute of Standards and Technology database ) 数据集是一个手写数字识别的数据集,包含 0 到 9 的数字图片。它是一个流行的数据集,经常被用来测试和比较不同的机器学习算法。该数据集由 60,000 张训练图片和 10,000 张测试图片构成,每张图片大小为 28x28 像素。
3.代码实现
3.1 导入必要的库
我们需要导入 PyTorch 中的 torchvision 和 torch.utils.data 模块,以及 numpy 和 matplotlib 库。
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
import torchvision.transforms as transforms
import numpy as np
import matplotlib.pyplot as plt
3.2 数据预处理
我们需要对数据集进行预处理,包括对图片进行归一化、转化为 Tensor 类型、以及构建 DataLoader 对象等。
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, num_workers=2)
testset = torchvision.datasets.MNIST(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64,
shuffle=False, num_workers=2)
3.3 构建模型
我们定义一个 MLP 类,它包含两个隐藏层和一个输出层,每个隐藏层包含 128 个神经元,输出层包含 10 个神经元,对应 10 个数字类别。
class MLP(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(MLP, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = x.view(-1, 28*28)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = MLP(28*28, 128, 10)
3.4 定义优化器和损失函数
我们使用交叉熵损失函数和 Adam 优化器。
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.001)
3.5 训练模型
我们将 MLP 训练 10 个 epoch,每个 epoch 在训练集上迭代 938 次,mini-batch 大小为 64。
for epoch in range(10):
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()
print('Epoch %d loss: %.3f' %
(epoch + 1, running_loss / len(trainloader)))
print('Finished Training')
3.6 测试模型
在测试集上验证 MLP 的效果。
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))
4.实验结果分析
在训练 10 个 epoch 后,我们在测试集上获得 97.5% 的准确率,表明 MLP 在 MNIST 数据集上有较好的分类效果。
5.总结
本文通过使用 PyTorch 实现 MLP 模型,并在 MNIST 数据集上进行了验证,表明 MLP 在手写数字识别上有较好的分类效果。可以尝试使用不同的网络结构、优化算法等进行比较,也可以尝试使用其他数据集进行验证。