pytorch 手写数字识别 新网络设计和学习率探索

系列文章目录

  1. pytorch MNIST数据集无法正常加载的解决办法( HTTP Error 503: Service Unavailable)
  2. Python 手写数字识别的实现(pytorch框架) 超详细版本
  3. pytorch 手写数字识别 新网络设计和学习率探索

这是中国科学院大学深度学习的课程作业

摘要

作业首先复现了经典的LeNe-5网络,在此基础上探究了学习率和动量两个超参对模型训练的影响。提出了从两个维度进行信息学习,最后拼接在一起的卷积神经网络,准确率为:0.9875。

介绍

(1) 复现手写数字识别的经典网络LeNet-5结构。手写数字识别能否引入残差连接的思想来进一步提高成绩。
(2) LeNet网络在手写数字识别这一任务上取得了突破性结果后,Alex在2012年提出的alexnet网络结构模型引爆了神经网络的应用热潮,并赢得了2012届图像识别大赛的冠军,使得CNN成为在图像分类上的核心算法模型。
(3) 设计了一种两个维度进行信息学习的CNN网络。

解决方案

  1. 首先复现了LeNe-5网络,模型结构为:

模型训练过程中Train loss和Test accuracy的变化:

在10000张测试图片中准确识别了9746张,具体内容可参见我的博客https://blog.csdn.net/weixin_43718786/article/details/115252637

  1. 考虑模型从大尺度和小尺度进行信息的学习,随着层数的加深,卷积可能造成梯度消失问题和只能学习到细节的问题,借鉴了前人工作Text-cnn的思路[1],从两个维度进行信息的学习可能能取得更好的结果,网络结构如下:
    在这里插入图片描述

从两个尺度(维度)进行卷积,在送入softmax层之间进行一个拼接操作。
网络设计对应代码:

将模型部分替换即可实现

import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 12, kernel_size=3, stride=1, padding=0, bias=True) # C1层使用单通道,6深度的卷积核,卷积核大小为5
        self.max_pool_1 = nn.MaxPool2d(2)  # maxpooling从28降到14个像素点,故采用大小为2最大池化
        self.conv2 = nn.Conv2d(12, 24, kernel_size=3, stride=2, padding=2, bias=True) # 第二次卷积
        self.conv3 = nn.Conv2d(24, 36, kernel_size=3, stride=2, padding=1, bias=True) #第三次卷积,得到120张大小为1的“图像”
        self.conv4 = nn.Conv2d(12, 12, kernel_size=12, stride=5, padding=1, bias=True)

        self.conv5 = nn.Conv2d(48, 10, kernel_size=5, stride=1, padding=0, bias=True)

    def forward(self, x):
        # print("0:"+ str(x.size())) # 输出tensor大小
        x = F.relu(self.conv1(x)) # 用激活函数处理卷积结果,激活函数结果再在下一步做maxpooling
        x1 = self.max_pool_1(x)
        # print("1:"+ str(x.size()))
        x1 = F.relu(self.conv2(x1)) # 同上
        # print("2:"+ str(x.size()))
        
        
        x1 = F.relu(self.conv3(x1)) 
        # print("3:"+ str(x.size()))
        x2 = F.relu(self.conv4(x))
        x = torch.cat([x1, x2],dim=1)

        x = F.relu(self.conv5(x))
        # x = F.dropout(x, training=self.training)
        x = x.view(-1, 10) # 把120张大小为1的图像当成一个长度为120的一维tensor
        return F.log_softmax(x)

模型训练过程中Train loss和Test accuracy的变化:

在这里插入图片描述

正确识别了10000张测试集图片中的9875张,比AlexNet-5网络成绩更好。
3. 实验结果和分析
实验使用了MINST手写数字识别数字集,通过接口进行导入,具体见我的博客:https://blog.csdn.net/weixin_43718786/article/details/115242485。实验环境是colab平台和pytorch包,比较了两种基于CNN的方法。从上面展示的图可以看出,后一种模型取得了更好的结果。一种可能的解释是后一种模型一方面加深了卷积的深度,此外进行了类似残差连接的操作,由此增强了性能。
在复现的基础上,考察学习率与动量两个参数变化对训练好后的模型的accuracy的影响。
调整的超参数是learn rate 和momentum,依次有如下组合:
[0.1, 0.1], [0.1, 0.4], [0.1, 0.7], [0.4, 0.1], [0.4, 0.4], [0.4, 0.7], [0.7, 0.1], [0.7, 0.4], [0.7, 0.7]

在学习率较大的情况下,由于Relu激活函数的问题,易导致神经元死亡,这可以解释这一现象的成因,因此,在LeNe-5模型中不能采用较大的学习率。

在这里插入图片描述
代码:

lrs = [a/10 for a in range(1, 9, 5)]
momentums = [a/10 for a in range(1, 9, 5)]
import matplotlib.pyplot as plt
fig = plt.figure()
test_acc = 0
legent = []
j = 0
for lr in lrs:
  for momentum in momentums:
    legent.append(str(lr) + "," + str(momentum))
    network = Net().to(DEVICE)
    optimizer = optim.SGD(network.parameters(), lr=lr, momentum=momentum) # 学习率,动量
    for epoch in range(1, n_epochs + 1):
      train(epoch, DEVICE)
      test(DEVICE)
    
    test(DEVICE)
    test_counter = [i for i in range(n_epochs + 1)]
    plt.legend(['Train Loss', 'Test Loss'], loc='upper right')
    plt.plot(j, test_acc, 'o') # test集accuracy变化散点图
    plt.xlabel('number of training examples seen')
    plt.ylabel('negative log likelihood loss')
    

   
    test_acc = 0
    test_counter = [i*len(trainloader.dataset) for i in range(n_epochs + 1)]
plt.legend(legent, loc='upper left')
plt.xlabel('number of training examples seen')
plt.ylabel('negative log likelihood loss')    
plt.show()

结论

通过实验熟悉了pytorch网络的设计和pytorch代码实验,自己实验性的设计了新型网络取得了一定的性能提升。

参考文献
[1] T. He, W. Huang, Y. Qiao, and J. Yao, “Text-Attentional Convolutional Neural Networks for Scene Text Detection,” IEEE Trans. on Image Process., vol. 25, no. 6, pp. 2529–2541, Jun. 2016, doi: 10.1109/TIP.2016.2547588.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
手写数字识别系统是一个使用Python开发的项目,旨在通过计算机视觉和深度学习技术识别手写的数字。这个系统能够自动读取图像中的手写数字并将其转换为电子数据,适用于邮政编码排序、银行支票处理等多种实际应用场景。 主要特性和功能可能包括: 1. **图像预处理**:对输入的图像进行灰度化、二值化、去噪等预处理步骤,以提高识别率。 2. **特征提取**:利用图像处理算法提取数字的特征,如边缘、形状等。 3. **深度学习分类器**:使用卷积神经网络(CNN)等深度学习模型进行训练和分类。 4. **实时识别**:能够对接收到的实时图像数据进行处理和识别。 5. **用户界面**:如果包含用户界面,则允许用户上传图片、查看识别结果和编辑识别后的数字。 6. **API接口**:为其他应用或服务提供手写数字识别功能的接口。 7. **模型训练与更**:系统支持定期更模型以适应的数据集和提高准确率。 8. **多语言支持**:能够处理不同语言环境下的手写数字,具备一定的普适性。 技术栈通常涉及: - Python编程语言:作为主要的后端逻辑和数据处理语言。 - 深度学习框架:如TensorFlow或PyTorch,用于构建和训练识别模型。 - 前端技术:HTML, CSS, JavaScript以及可能的框架如React或Vue.js,负责构建用户界面。 - 数据库技术:如SQLite、MySQL、PostgreSQL或MongoDB,用于存储训练数据和识别记录。 部署方式可能包括: - 本地部署:在研究机构或个人工作站上配置环境运行系统。 - 云服务部署:将系统部署到云平台,如AWS、Azure或Google Cloud,以便稳定地服务于广泛的用户群体。 该系统对于自动化处理手写文档、提高数据录入效率和减少人工误差具有显著作用。它可以帮助银行、保险公司、邮局等机构快速准确地处理大量的手写资料。随着技术的发展,未来这个系统可能会集成更多的高级图像处理技术,提高对手写字体的识别精度和容错能力。此外,系统还可能通过增加更多的互动元素,如用户反馈机制,来进一步提高系统的智能化水平和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值