基于AlexNet的手写数字识别

摘要:实现对手写数字数据集的准确识别。在本文中使用经典的MNIST数据集作为实验对象,并构建了一个基于卷积神经网络(AlexNet)的模型。通过数据预处理和模型优化,达到了高准确率的识别结果。同时提供相关的代码示例,供读者参考和复现。

备注:通过介绍基于ALexNet的手写数字识别模型,教大家神经网络的基础以及如何通过网络结构复现代码等。

一、数据来源

1、数据集简介

        本研究所使用的数据来自于MNIST手写数字数据集,这是一个经典的、广泛应用于机器学习和计算机视觉领域的数据集。MNIST数据集由Yann LeCun等人于1998年创建,旨在提供一个用于验证和比较机器学习算法性能的基准数据集。该数据集包含了大量的手写数字图像,总计有60000个训练样本和10000个测试样本。每个样本都是一个32x32像素的灰度图像(单通道图像),对应一个0到9之间的数字标签。下图为MNIST样例。

备注:数据集采用MNIST数据集,它包含了6万个训练样本和1万个测试样本。每个样本都是28x28x1像素的灰度图像即单通道图像,下面是数据集样本。

2、研究背景

        手写数字识别在现实世界中有着广泛的应用。例如,在邮件服务中,自动识别手写邮政编码可以提高邮件分拣的效率。此外,手写数字识别还可以应用于银行支票识别、身份证号码识别等领域。准确地识别手写数字对于实现自动化和提高工作效率具有重要意义。因此,开发高性能的手写数字识别模型对于实际应用具有重要的实用价值。通过研究和实践,本研究旨在探索基于PyTorch的深度学习手写数字识别模型,为相关行业提供可靠的解决方案。

二、问题分析

1、问题描述

        在手写数字识别任务中,我们面临的主要问题是如何准确地将手写数字图像分类为对应的数字标签。给定一个输入的手写数字图像,我们的目标是训练一个深度学习模型,使其能够对图像进行准确的分类,即将图像与正确的数字标签相匹配。

备注:手写数字识别,实际为分类模型,即输出一张图像,经过神经网络分类后得到该图像属于数字某个数字的最大概率。这里假设给神经网络输入的图像是5,经过神经网络后,得到维度为1×10的输出,即[0,0,0,0,0,1,0,0,0,0],其中索引6位置的数值最大,即神经网络得到了正确的分类结果。

2、 数据分析目标

  •  实现对手写数字图像的高准确率分类,确保模型能够正确识别出每个图像所代表的数字。
  • 确定在手写数字识别任务中可能出现的难点,例如数字的相似形状、模糊的图像边界等,以便在模型设计和训练过程中有针对性地解决这些问题。
  • 选择适当的性能指标来评估模型的性能,例如准确率、精确率、召回率等,以便在模型求解过程中进行评估和对比。

三、基础知识

1、卷积与卷积核

        神经网络的卷积过程是卷积神经网络(CNN)中的核心操作之一,用于从输入数据中提取特征。卷积是一种数学运算,它在神经网络中用于图像处理和其他二维数据(如声音信号或文本数据)的特征提取。卷积操作的基本思想是在输入数据上滑动一个小的窗口,称为卷积核或滤波器,以执行局部区域的点积操作。卷积核的参数是可学习的,它可以捕获输入数据中的不同特征。

备注:图像是由像素点构成的,彩色图像有三个通道,灰度图像有一个通道。对于三通道彩色图,卷积操作如上图所示,对应位置相乘再相加。

备注:卷积操作的一些相关概念。

以下是卷积操作的关键概念:

  1. 卷积核:卷积核是一个小的二维矩阵,它定义了如何从输入数据中提取特征。卷积核的大小通常是3x3或5x5,并且包含了权重值。

  2. 滑动窗口:卷积核在输入数据上滑动,从左上角开始,逐步向右和向下滑动。在每个位置,卷积核与输入数据的局部区域进行点积操作。

  3. 卷积操作:在每个滑动位置,卷积核与输入数据的局部区域进行点积操作,生成一个输出值。这个输出值代表了卷积核检测到的特定特征。

  4. 步幅(Stride):步幅定义了卷积核在输入数据上的移动步长。如果步幅为1,卷积核每次移动一个像素;如果步幅为2,卷积核每次移动两个像素。步幅的选择会影响输出的大小。

  5. 填充(Padding):填充是在输入数据周围添加额外的值(通常是0)以控制输出的大小。常见的填充方式有“有效填充”(valid padding,不添加额外值)和“相同填充”(same padding,添加额外值使输出与输入的大小相同)。

  6. 输出特征图:卷积操作的结果是一个输出特征图,它是输入数据上卷积核滑动的过程中生成的所有输出值的集合。每个输出值都代表了卷积核检测到的特征。

        卷积操作的一个关键优势是它的局部感知性。卷积核只与输入数据的小局部区域进行交互,这使得神经网络能够自动学习局部特征,例如边缘、纹理等,而不需要关注整个输入图像的细节。在卷积神经网络中,通常有多个卷积层,它们逐渐提取越来越抽象的特征。这些特征在后续的层中被组合和用于最终的分类或回归任务。卷积神经网络的能力在图像处理、计算机视觉和其他领域中得到广泛应用,因为它可以高效地处理复杂的二维数据。

2、最大池化

### 使用AlexNet实现手写数字识别 为了使用AlexNet实现手写数字识别,可以借鉴已有的经验来调整模型架构以及数据预处理方式。由于原始的AlexNet设计用于大规模图像分类任务(如ImageNet),而MNIST手写数字数据集中的图像是灰度且分辨率较低(28x28),因此需要对原版AlexNet做出适当简化和适应性改动。 #### 数据准备 对于手写数字识别的任务来说,通常会利用像MNIST这样的公开可用的数据集作为训练样本。考虑到AlexNet输入尺寸较大(通常是227×227彩色图片),所以要先对手写字体做一定的转换工作: - 将每张黑白图像放大到适合大小; - 如果必要的话还可以增加通道数使之成为三通道形式以匹配AlexNet的要求; ```python import torchvision.transforms as transforms from torchvision.datasets import MNIST from torch.utils.data import DataLoader transform = transforms.Compose([ transforms.Resize((227, 227)), # 调整至所需尺寸 transforms.Grayscale(num_output_channels=3), # 增加颜色维度 transforms.ToTensor(), # 转换成tensor类型 ]) train_dataset = MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = MNIST(root='./data', train=False, download=True, transform=transform) batch_size = 64 train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False) ``` #### 构建改进后的AlexNet模型 基于PyTorch框架重新定义一个更适合当前任务需求的小型化版本AlexNet网络结构,在保持原有特征提取能力的同时减少参数量从而加快收敛速度并防止过拟合现象的发生[^1]。 ```python import torch.nn as nn import torch.optim as optim class SmallAlexNet(nn.Module): def __init__(self): super(SmallAlexNet, self).__init__() self.features = nn.Sequential( nn.Conv2d(in_channels=3, out_channels=96, kernel_size=(11, 11), stride=(4, 4)), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(in_channels=96, out_channels=256, kernel_size=(5, 5), padding='same'), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(in_channels=256, out_channels=384, kernel_size=(3, 3), padding='same'), nn.ReLU(inplace=True), nn.Conv2d(in_channels=384, out_channels=384, kernel_size=(3, 3), padding='same'), nn.ReLU(inplace=True), nn.Conv2d(in_channels=384, out_channels=256, kernel_size=(3, 3), padding='same'), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2) ) self.classifier = nn.Sequential( nn.Dropout(), nn.Linear(in_features=256 * 6 * 6, out_features=4096), nn.ReLU(inplace=True), nn.Dropout(), nn.Linear(in_features=4096, out_features=4096), nn.ReLU(inplace=True), nn.Linear(in_features=4096, out_features=10) # 修改最后一层为10类输出对应十个阿拉伯数字 ) def forward(self, x): x = self.features(x) x = x.view(-1, 256*6*6) x = self.classifier(x) return x model = SmallAlexNet().to(device=device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters()) ``` #### 训练过程 设置好损失函数与优化器之后就可以进入正式的迭代循环阶段了。这里省略了一些细节比如验证环节等,实际应用时建议加入更多监控机制确保模型性能稳定提升。 ```python num_epochs = 10 for epoch in range(num_epochs): model.train() running_loss = 0.0 correct_predictions = 0 total_samples = 0 for images, labels in train_loader: images = images.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() _, predicted = torch.max(outputs, dim=-1) correct_predictions += (predicted == labels).sum().item() total_samples += labels.size(0) running_loss += loss.item() * labels.size(0) print(f'Finished Training') ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值