MLP-入门教程

【例子】MLP神经网络例子-手写数字识别

作者 : 老饼 发表日期 : 2023-05-08 11:43:28 更新日期 : 2025-04-24 17:30:07
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com



MLP神经网络可以用于类别预测,例如图像识别就是其中一个用途

本文展示一个MLP神经网络用于手写数字识别的例子,并用pytorch进行实现与训练

通过本文可以具体了解如何使用MLP神经网络是如何解决手写数字识别问题的





    01. MLP神经网络实现-手写数字识别   





本节使用pytorch来实MLP神经网络识别写手数字问题(借助pytorch的神经网络框架)





      手写数字-数据介绍    


手写数字数据集MNIST是pytorch的自带数据之一,利用torchvision.datasets.MNIST就可以下载
手写数字数据集MNIST包含了10个手写数字(0-9)的7W个样本(训练样本6W个,测试样本1W个)
MNIST样本示例如下:
 手写数字样例 
每个样本是28*28的单通道灰度图片






      MLP神经网络识别手写数字-代码   


在使用mlp神经网络预测手写数字时,需要先将图片输入进行展平,展平后共计28*28=784个输入
根据输入个数,不妨使用100个隐节点的三层MLP神经网络模型对图片类别进行预测
  具体的MLP神经网络识别手写数字代码如下:
import torch
from   torch import nn
import matplotlib.pyplot  as plt 
torch.manual_seed(99)     # 设定随机种子,使得每次运行结果一样

# 定义神经网络的结构
class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.stack=nn.Sequential(
            nn.Linear(2, 4),                                                       # 2输入,4输出
            nn.Tanh(),                                                             # 激活函数用Tanh
            nn.Linear(4, 2)                                                        # 4输入,2输出(2个类别)
            )                                                                      
    def forward(self, x):                                                          
        y = self.stack(x)                                                          # 按stack计算模型输出
        return y                                                                   # 输出y
x = torch.tensor([[2.5, 1.3, 6.2, 1.3, 5.4, 6 ,4.3, 8.2]                                     
                ,[-1.2,2.5,3.6,4,3.4,2.3,7.2,3.9]]).T                              # 样本的输入数据    
y = torch.tensor([1,1,0,1,0,0,0,0])                                                # 样本的标签
model     = MLP()                                                                  # 初始化模型
lossFun   = torch.nn.CrossEntropyLoss()                                            # 定义损失函数为交叉熵损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01,momentum =0.9)             # 初始化优化器
																			       
for epoch in range(5000):                                                          
    optimizer.zero_grad()                                                          # 将优化器里的参数梯度清空
    py   = model(x)                                                                # 计算模型的预测值   
    loss = lossFun(py, y)                                                          # 计算损失函数值
    loss.backward()                                                                # 更新参数的梯度
    optimizer.step()                                                               # 更新参数
    # ----计算错误率----                                                           
    p_labels = torch.argmax(py,dim=1)                                              # 模型的预测类别
    err_rate = (p_labels!=y).sum()/p_labels.numel()                                # 错误率
    print('第',epoch,'步,错误率:' ,(err_rate).numpy()*100,'%')                     # 打印错误率
    if(err_rate<=0.01):                                                            # 检查退出条件
        break   													                            
# -------打印模型训练结果----------                                                
print('----模型训练结果---')                                                       # 打印标题    
print('错误率:' ,(err_rate).numpy()*100,'%')                                       # 打印错误率          
# 绘制预测结果                                                                    
colors = ['red','g']                                                               # 定义0类的颜色为red,1类样本的颜色为green
labels_color   = [ colors[i] for i in y]                                           # 各个样本真实对应的颜色  
p_labels_color = [ colors[i] for i in p_labels]                                    # 各个样本预测对应的颜色 
plt.scatter(x[:,0], x[:,1],c=labels_color,s=20)                                    # 绘制真实样本
plt.scatter(x[:,0], x[:,1],marker='o',c='none',edgecolors=p_labels_color,s=80)     # 绘制预测样本
plt.legend(['true label','predict label'])                                         # 显示图例
plt.show() 
运行结果如下:
-----------当前epoch: 0 ----------------
err_rate: tensor(0.9100)                
err_rate: tensor(0.7925)                
err_rate: tensor(0.5954)                
err_rate: tensor(0.4929)                
err_rate: tensor(0.4363)                
err_rate: tensor(0.3978)                
验证数据的准确率: 0.8145                
-----------当前epoch: 1 ----------------
.........             
        .........                     
  -----------当前epoch: 249 ----------------
err_rate: tensor(0.0040)                
err_rate: tensor(0.0084)                
err_rate: tensor(0.0090)                
err_rate: tensor(0.0093)                
err_rate: tensor(0.0096)                
err_rate: tensor(0.0098)                
--------------------------------------- 
验证数据的准确率: 0.9761                 
  训练步数 249 ,最终训练误差 tensor(0.0099)  
  训练数据的准确率: 0.9902166666666666       
 验证数据的准确率: 0.9761    
                       
可以看到,验证数据(由于实际并未用于验证,所以其实是测试数据)的准确率已经达到97.6%,说明模型是有效的






好了,以上就是MLP神经网络识别手写数字的例子与代码了~








 End 





内容纠正