pytorch 预测手写体数字_深度学习之PyTorch实战(3)——实战手写数字识别

本文介绍了使用PyTorch进行手写数字识别的实践,包括MNIST数据集、梯度递减算法、后向传播算法等关键概念。通过构建和训练卷积神经网络模型,实现高准确率的识别。最后,展示了模型的验证过程和预测结果。
摘要由CSDN通过智能技术生成

如果需要小编其他论文翻译,请移步小编的GitHub地址

传送门:请点击我

如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote

上一节,我们已经学会了基于PyTorch深度学习框架高效,快捷的搭建一个神经网络,并对模型进行训练和对参数进行优化的方法,接下来让我们牛刀小试,基于PyTorch框架使用神经网络来解决一个关于手写数字识别的计算机视觉问题,评价我们搭建的模型的标准是它是否能准确的对手写数字图片进行识别。

其具体的过程是:先使用已经提供的训练数据对搭建好的神经网络模型进行训练并完成参数优化,然后使用优化好的模型对测试数据进行预测,对比预测值和真实值之间的损失值,同时计算出结果预测的准确率。在将要搭建的模型中会使用到卷积神经网络模型,下面让我们开始学习吧。

知识储备——深度学习中的常见概念

1:MNIST数据集的了解

MNIST数据集是一个已经被“嚼烂”了的数据集,很多教程都会对他“下手”,几乎成为了一个典范。

下载下来的文件如下:

可从该页面获得的MNIST手写数字数据库具有60,000个示例的训练集和10,000个示例的测试集。它是NIST提供的更大集合的子集。数字已经过尺寸标准化,并以固定尺寸的图像为中心。

对于那些希望在实际数据上尝试学习技术和模式识别方法,同时在预处理和格式化方面花费最少的人来说,它是一个很好的数据库。

2:梯度递减算法

在对决策函数进行优化的时候,通常是针对一个误差的度量,比如误差的平方,以求得一系列参数,从而最小化这个误差度量的值来进行的,而目前一般采用的计算方法是梯度递减法(Gradient Descent Method )。这是一个非常形象的名字,好比一个游客要从某个不知名的高山上尽快,安全的下到谷底,这时候需要借助指南针来引导方向。对于这个游客,他需要在南北和东西两个轴向上进行选择,以保证下山的路在当前环境下即使最快的,又是最安全的。我们可以将南北和东西两个轴向想象成目标函数里面的两个维度或者自变量。那么这个游客怎么获取这个最优的路径呢?

在山顶的时候,游客因为不能完全看到通往谷底的情况,所以很可能随机选择一条路线。这个选择很多时候很关键。一般山顶是一块平地,有多个可以选择下山的可能点。如果真正下山的路线是在某个地方,而游客选择了另外一个地方,则很有可能最终到不了真正的谷底,可能到达半山腰或者山脚下的某一个地方,但是离真正的谷底差距可能不小。这就是优化问题中的由于初始化参数不佳导致只能获取局部最优解的情况,下图就形象的展示了这样的情况。

在优化算法中初始值的影响

梯度递减法是一种短视的方法,好比游客在下山的时候遇到非常浓的大雾,只能看见脚下一小块的地方,游客就把一个倾角计放在地上,看哪个方向最陡,然后朝着最陡的方向往下滑一段距离,下滑的距离通常根据游客对当前地形的审视度势来决定,停下来,再审视周边哪个方向现在是最陡的。继续重复上面的倾角计算并往下滑的动作,这跟优化中常用的最陡下降法很类似,可以看做最陡下降法的一个特例。在最陡下降法中,参数的更新使用如下公式:

但是在使用梯度递减法求解神经网络模型时,通常使用的是随机梯度递减法(Stochastic Gradient Descent),其公式如下:

这个算法有如下几点变化:

首先,在计算时不是通览所有的数据后再执行优化计算,而是对于每个观测值或

者每组观测值执行梯度递减的优化计算。原来的那种算法因此被叫作批量(Batch)

或者离线(Offline)算法,而现在这种算法则被称为递增(Incremental)或者

在线(Online)算法,因为参数估计值随着观测组的更新而更新。

其次,这个步进值通常从一开始就固定为一个较小的值。

最后,通过上述公式可以看出,参数更新部分不仅取决于一阶偏微分的大小,还

包含了一个动量项 这个动量项的效果是将过去的累计更新项的一部分加入到当前参

数的更新项中,即把过去每一步的更新做一个指数递减的加权求和,可以看作对过

往的更新值的记忆,越远的记忆影响越小,越近的记忆影响越大。这有助于算法的

稳定性。如果步进值极小,而动量项里的控制变量α接近于数值1,那么在线算法就

近似于离线算法。

下图对梯度递减算法进行了形象的展示:

虽然现在最常见的算法是基于一阶偏微分的梯度递减法,但是跟其他几种以前常用的基于二阶偏微分的优化算法进行比较还是比较有趣的,有助于读者更好地理解这些算法。

基于二阶偏微分的算法通常统称为牛顿法,因为使用了比一阶偏微分更多的信息,可以看作游客在下山的过程中雾小了点,能直接看到周边的地势。假定整座山是一个平滑的凸形状,游客就可以一路下滑到谷底,不用中途停下来。当然,这个谷底也不能保证是最低的,有可能也是某个半山腰的洼地,因为还是有雾,游客无法彻底看清整个地势。

对一般的牛顿法的一种改进叫作增稳牛顿法(Stabilized Newton Method)。这种方法相当于游客带了一个高度计,因此他在滑下去以后可以查看结果,如果发现地势反而增高了,那么游客退回到原来的地方,重新跳一小步,从而保证每次下滑都能到达更低的点。对这种方法的进一步改进叫作岭增稳牛顿法(Ridge Stabilized NewtonMethod)。这种方法在上一种方法的基础上,游客不仅可以退回到原来的地方,而且重新下滑时还可以选择跳的方向,以保证有更多的机会使得下滑都离谷底更进一步。

对于深度学习模型中的函数,我们看到在每一层的节点都是一个激活函数套着一个组合函数的形式(参见图3.5),即常见的复合函数形式,那么在参数更新部分就需要用到微积分里面的链式法则(Chain Rule)来计算复合函数的导数

如果假设损失函数使用均方差,同时采用logistic的sigmoid激活函数,而组合函数是求和函数,则采用链式法则求解参数的更新可以写作:

将上述公式带入前面提到的梯度递减算法的参数更新步骤中,就可以得到新的参数估计。更新偏置项b采用几乎一样的公式,只是这个时候x=1,因此上面公式中最后的x就消掉了。

3:后向传播算法

上一节对梯度递减算法进行了介绍,如果这个神经网络只有一层,那么反复运用这个算法到损失函数,依照上面公式更新参数直到收敛就好了。如果神经网络模型是一个深度模型,在输入层和输出层之间包含很多隐含层的话,就需要一个高效率的算法来尽量减少计算量。后向传播算法(Backpropagation)就是一种为了快速估计深度神经网络中的权重值而设计的算法。

设定f0,···,fN代表1,···,N层的决策函数,其中0对应于输入层,而N对应于输出层。如果已知各层的权重值和偏置项估计值,那么可以采用下面的递归算法快速求得在当前参数值下的损失函数大小:

为了更新参数值,即权重值和偏置项的估值,后向传播算法先正向计算组合函数和其他相关数值,再反向从输出层N求解损失函数开始,按照梯度递减算法逐次往输入层回算参数的更新量。

在深度学习模型所需的计算中会大量使用链式法则,这就会使很多计算结果得到重复使用,后向传播算法将这些中间结果保存下来可以极大地减少计算量,提高模型拟合速度。因为在每一层都使用同样的函数:f:R→R,在这些层中,有:f(1)=f(w),f(2)=f(f(1)),f(3)=f(f(2)),其中上标代表对应的网络层,要计算

可以通过链式法则得到:

可以看到,只需计算f(w)一次,保存在变量f(1)中,就可以在以后的计算中使用多次,层数越多,效果越明显。相反,如果不是反向求解参数更新量,而是在正向传播那一步求解参数更新量,那么每一步中的f(w)都要重新求解,计算量大增。可以说,后向传播算法是神经网络模型普及的基础之一。

实战手写数字识别

手写数字识别是一个比较简单的任务,数字只可能是0-9中的一个,这是个10分类的问题。

MNIST手写数字识别项目因为数据量小,识别任务简单而成为图像识别入门的第一课,MNIST手写数字识别项目有如下特点:

(1) 识别难度低,即使把图片展开为一维数据,且只使用全连接层也能获得超过98%的识别准确度。

(2)计算量小,不需要GPU加速也可以快速训练完成。

(3)数据容易得到,教程容易得到。

超参数的确定

我们首先需要确定网络的层数和每层的节点数。关于第一个问题,实际上并没有什么理论化的方法,大家都是根据经验来拍,如果没有经验的话就随便拍一个。然后,你可以多试几个值,训练不同层数的神经网络,看看哪个效果最好就用哪个。嗯,现在你可能明白为什么说深度学习是个手艺活了,有些手艺很让人无语,而有些手艺还是很有技术含量的。

不过,有些基本道理我们还是明白的,我们知道网络层数越多越好,也知道层数越多训练难度越大。对于全连接网络,隐藏层最好不要超过三层。那么,我们可以先试试仅有一个隐藏层的神经网络效果怎么样。毕竟模型小的话,训练起来也快些(刚开始玩模型的时候,都希望快点看到结果)。

输入层节点数是确定的。因为MNIST数据集每个训练数据是28*28的图片,共784个像素,因此,输入层节点数应该是784,每个像素对应一个输入节点。

输出层节点数也是确定的。因为是10分类,我们可以用10个节点,每个节点对应一个分类。输出层10个节点中,输出最大值的那个节点对应的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值