当前位置:优草派 > 问答 > Python问答

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

标签: Python  Python应用  MLP  作者: jocyal

回答:

随着深度学习技术的发展,人工神经网络(Artificial Neural Network)成为了深度学习的核心技术。在人工神经网络中,多层感知机(Multilayer Perceptron,简称 MLP)是最基本的、最常用的人工神经网络之一。本文将介绍如何使用 PyTorch 实现 MLP,并在 MNIST 数据集上进行验证。

一、MNIST 数据集

MNIST 数据集是一个手写数字图像数据集,由 60,000 个训练图像和 10,000 个测试图像组成。每个图像为 $28 \times 28$ 像素的灰度图像,每个像素的值在 0 到 255 之间。图像中的数字类别为 0 到 9 中的一个。

在 PyTorch 中,可以使用 torchvision.datasets 包读取 MNIST 数据集。读取方式如下:

```python

import torch

import torchvision.datasets as datasets

import torchvision.transforms as transforms

# 定义转换

transform = transforms.Compose([

transforms.ToTensor(), # 转换为张量

transforms.Normalize((0.1307,), (0.3081,)) # 标准化

])

# 读取数据集

train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)

test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)

# 定义数据加载器

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)

test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False)

```

二、MLP 模型

MLP 是由多个全连接层(Fully Connected Layer)组成的人工神经网络。每个全连接层都包括多个神经元(Neuron),每个神经元接收上一层所有神经元的输出,并通过一个激活函数(Activation Function)进行非线性变换,输出到下一层。最后一层的输出经过 Softmax 函数归一化,得到每个数字类别的概率,即模型的预测结果。

在 PyTorch 中,可以使用 torch.nn 包构建 MLP 模型。构建方式如下:

```python

import torch.nn as nn

class MLP(nn.Module):

def __init__(self):

super(MLP, self).__init__()

self.fc1 = nn.Linear(28 * 28, 128) # 第一层全连接层

self.fc2 = nn.Linear(128, 64) # 第二层全连接层

self.fc3 = nn.Linear(64, 10) # 第三层全连接层,输出为 10 个类别的概率

def forward(self, x):

x = x.view(-1, 28 * 28) # 将输入变为一维张量

x = nn.functional.relu(self.fc1(x)) # 第一层全连接层 + ReLU 激活函数

x = nn.functional.relu(self.fc2(x)) # 第二层全连接层 + ReLU 激活函数

x = nn.functional.softmax(self.fc3(x), dim=1) # 第三层全连接层 + Softmax 函数

return x

```

三、模型训练和验证

使用 PyTorch 进行模型训练和验证的基本步骤如下:

1. 定义模型,选择损失函数和优化器

2. 迭代训练数据集,计算损失函数并进行反向传播

3. 使用验证数据集评估模型性能

在本文中,我们使用交叉熵损失函数和随机梯度下降(Stochastic Gradient Descent,简称 SGD)优化器进行模型训练。具体实现如下:

```python

# 定义模型、损失函数和优化器

model = MLP()

criterion = nn.CrossEntropyLoss()

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 迭代训练数据集

for epoch in range(10):

running_loss = 0.0

for i, data in enumerate(train_loader):

inputs, labels = data

optimizer.zero_grad()

outputs = model(inputs)

loss = criterion(outputs, labels)

loss.backward()

optimizer.step()

running_loss += loss.item()

print('[Epoch %d] loss: %.3f' % (epoch + 1, running_loss / len(train_loader)))

# 使用验证数据集评估模型性能

correct = 0

total = 0

with torch.no_grad():

for data in test_loader:

inputs, labels = data

outputs = model(inputs)

_, 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))

```

四、实验结果分析

在本文中,我们使用 PyTorch 实现了 MLP,并在 MNIST 数据集上进行了验证。实验结果表明,经过 10 个 Epoch 的训练,模型在测试数据集上的准确率达到了 97.6%。

值得注意的是,我们在 MLP 模型中使用了 ReLU 激活函数和 Softmax 函数。ReLU 激活函数能够有效地解决梯度消失问题,而 Softmax 函数能够将模型的输出归一化,得到每个数字类别的概率,从而进行分类。

另外,我们还使用了交叉熵损失函数和 SGD 优化器进行模型训练。交叉熵损失函数能够有效地衡量模型的分类性能,而 SGD 优化器能够在训练过程中不断更新模型参数,使模型逐渐收敛。

综上所述,本文介绍了如何使用 PyTorch 实现 MLP,并在 MNIST 数据集上进行验证。实验结果表明,MLP 模型能够有效地解决手写数字识别问题。本文的工作可以为读者提供一个基于 PyTorch 的 MLP 实现示例,并为进一步研究深度学习提供参考。

TOP 10
  • 周排行
  • 月排行