使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式

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 在手写数字识别上有较好的分类效果。可以尝试使用不同的网络结构、优化算法等进行比较,也可以尝试使用其他数据集进行验证。

后端开发标签