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],从两个维度进行信息的学习可能能取得更好的结果,网络结构如下:
    pytorch 手写数字识别 新网络设计和学习率探索_第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的变化:

pytorch 手写数字识别 新网络设计和学习率探索_第2张图片

正确识别了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模型中不能采用较大的学习率。

pytorch 手写数字识别 新网络设计和学习率探索_第3张图片
代码:

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.

你可能感兴趣的:(深度学习,pytorch,深度学习,神经网络)