Python与人工神经网络:使用神经网络识别手写图像介绍

 更新时间:2017年12月19日 09:21:40   投稿:mengwei  
文章主要介绍什么是神经网络,感知机的概念和模型,以及新一代的S曲线神经元系统等相关内容,具有一定借鉴价值,需要的朋友可以参考下。

人体的视觉系统是一个相当神奇的存在,对于下面的一串手写图像,可以毫不费力的识别出他们是504192,轻松到让人都忘记了其实这是一个复杂的工作。

实际上在我们的大脑的左脑和右脑的皮层都有一个第一视觉区域,叫做V1,里面有14亿视觉神经元。而且,在我们识别上面的图像的时候,工作的不止有V1,还有V2、V3、V4、V5,所以这么一看,我们确实威武。

但是让计算机进行模式识别,就比较复杂了,主要困难在于我们如何给计算机描述一个数字9在图像上应该是怎样的,比如我们跟计算机说,9的上面是一个圈,下右边是1竖。然而有的人写9会带勾,有的人还会在圈周围多出点什么,总的来说,这种描述法太容易出现其他状况。况且,我们这里讨论的还只是数字,涉及到字母、汉字、符号就回更复杂。

于是人们就有了另外一种途径,那就是我们不用告诉计算机什么是9,我们可以把他当作一个小孩子,让他见很多9的图片,对他说,这是9,记得哈。慢慢的他就形成了自己的评判标准,等他长大了,自然就知道以后遇到的图片是不是9了。让我们人学习的方式是见闻,让计算机学习的就是给他数据,这个数据通常被叫做训练样本(如图),而这套学习的方法,就是神经网络了。

感知机(Perceptrons)

在说人工神经网络之前,我们先说另外一个人工神经元系统,叫感知机(Perceptrons)。感知机模型是这样的:

其中x1,x2,x3是二进制的输入值,output是二进制的输出值。在每个输入端,还会有一个权重,w1,w2,w3。output取决于x1*w1+x2*w2+x3*w3,如果他小于等于一个临界值的时候,output就输出0,大于等于那个临界值的时候,output就输出1。当然输入值可以是任意多个,用公式表示就是:

output={01if ∑jwjxj≤ thresholdif ∑jwjxj> threshold

感知机模型就这么简单,他是一个相当好的决策系统,用来解决是或者不是,去或者不去,熟悉我的朋友可能知道我从古代儒家修身的功过格受启发,自己制定的一套决策系统,也是用因素*权重然后汇总,看得到的正面因素占优还是负面的因素占优,最后做决策,真是相当好用,只不过那时候还不知道感知机模型。

我们把Σwjxj用w·x表示,把临界值提到等号右边,用-b表示,那么上面的等式就如下所示:

b一般称作偏差。

既然有一层的感知机模型,多层的就很好理解了,如图:

这个多层(从左到右)的感知机里面,第一层的感知机比较简单,只根据输入的值和权重就可以得出结果,第二层的结果就得根据第一层的结果和相应的的权重了,与复杂度相对应,他也就可以用来做更加复杂和抽象的决定,第三层就更复杂了。

这种上世纪五十年代就出来的神经元系统功能强大,但是对于机器学习有一个重大的缺陷。我们教小孩子的时候,小孩子进步一点点,我们就鼓励他一下,小孩子退步一点点,我们就批评一下,他从我们的批评和鼓励中自动的去调整自己的认知,慢慢的成长。但是这个感知机就不同了,他的输入值只有0和1,他的成长没有一点点的说法,所以压根就不知道怎么调整,可能内部参数调整的乱七八糟,输出的结果还是不变的。要实现学习和进步,就得有这么一点点一点点进步的概念,也就是说,w或者b变了一点点,那么输出值就得变一点点,总的来说,就是要实现下图所示的效果:

于是新一代的神经元系统就出世了,他叫S曲线神经元系统(Sigmoid neurons)。

S曲线神经元系统(Sigmoid neurons)

简单来说,S曲线神经元系统和感知机系统的区别在于我们的输入值x1,x2,x3和输出值output都不是0和1了,改为从0到1之间的任何实数。而且规定,对我输出值output,由于是与w·x和b相关的,我们可以用σ(w·x,b)表示,他满足函数:

把w·x和b带进去,就是:

试着看下,如果当w·x + b→+∞的时候,e^-(w·x+b)→0,σ(w·x,b)→1。相反,当w·x + b→-∞的时候,σ(w·x,b)→0,所以,感知机系统也是一个特殊的S曲线神经元系统。

至于为什么σ(w·x,b)必须满足上述的函数呢。请看σ(z)的图形:

他的定义域是(-∞,+∞),值域是(0,1),也就是说,不管w·x和b怎么折腾,总能保证输出值在0到1之间。特别的,当我们对一个事情做决定时,比如我们让计算机决定看到的一个图形是不是9,0到1之间的一个数,可以在物理意义上对应他是9的概率。(我后来才意识道,这个说法是错误的)

我们说,我们抛弃感知器,采用S曲线神经元系统,是为了让输出结果的变动和我们采取权重w和偏离b的变动对应起来。那么对于方程output = σ(w·x,b),由于输入值x是已知的常数,根据全微分的定义,有:

输出值的变动和我们选用的参数变动就对应起来了。

构造我们的神经网络

在我们构建神经网络的过程中,一般也会把输入的数据当作神经元,输入的那层叫做输入层,中间可能有多层,通常被叫做隐藏层,输出的那一层就叫做输出层。如图:

在设计神经网络时,一般会采取简单粗暴的方式,比如我们要让计算机识别手写稿的扫描件图像,其中的一个字的图像像素个数是64*64=4096个,那么我们设计神经网络的时候,输入层神经元个数就是4096个,其中每个神经元的输入数据就是该像素的灰度值(参照文章的第一幅图)归一化成0到1之间的数值。而我们要识别出的结果,可能包括数字0-9加26个大大小写字母再加六千常用汉字,那我们设计的输出层神经元个数就用过是10+26*2+6000=6062个,其中每个神经元对应一个我们要识别的结果。

具体到本实例中,训练样本和识别测试数据是28*28像素的,输出结果只有10个数字,那么输入层就应该是786个神经元,输出层是10个神经元。至于中间隐藏层的神经元,作者选了15个,说是经过了多次实验,15个的效果比较好。就我的理解,应该是越多约好的(不一定正确),不过越多也意味着运算量越大,所以作者最后选了15个。最终设计的结果如图:

最后还有一个问题,如果是连续的书写手稿,怎么把他分割成一个个的。作者说实际上这个问题可以在我们完成通过神经网络进行识别之后再说,因为识别出来谁都不像的,就说明应该要分割了,那我们也就跟着作者的思路,暂时先不管。

总结

以上就是本文关于Python与人工神经网络:使用神经网络识别手写图像介绍的全部内容吗,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

神经网络理论基础及Python实现详解

神经网络python源码分享

70行Java代码实现深度神经网络算法分享

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Pytorch配置GPU环境方式

    Pytorch配置GPU环境方式

    这篇文章主要介绍了Pytorch配置GPU环境方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python cookbook(数据结构与算法)将序列分解为单独变量的方法

    Python cookbook(数据结构与算法)将序列分解为单独变量的方法

    这篇文章主要介绍了Python cookbook(数据结构与算法)将序列分解为单独变量的方法,结合实例形式分析了Python序列赋值实现的分解成单独变量功能相关操作技巧,需要的朋友可以参考下
    2018-02-02
  • Pandas中Dataframe合并的实现

    Pandas中Dataframe合并的实现

    本文主要介绍了如何使用Pandas来合并Series和Dataframe,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Python使用os模块实现更高效地读写文件

    Python使用os模块实现更高效地读写文件

    os是python标准库,包含几百个函数常用路径操作、进程管理、环境参数等好多类。本文将使用os模块实现更高效地读写文件,感兴趣的可以学习一下
    2022-07-07
  • Django和websocket实现简单的多人聊天的示例代码

    Django和websocket实现简单的多人聊天的示例代码

    本文主要介绍了使用Django和WebSocket实现一个简单的多人聊天应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • Python面向对象之类和对象实例详解

    Python面向对象之类和对象实例详解

    这篇文章主要介绍了Python面向对象之类和对象,结合实例形式详细分析了Python面向对象相关的继承、多态、类及对象等概念、原理、操作技巧与注意事项,需要的朋友可以参考下
    2018-12-12
  • Python读取excel文件中带公式的值的实现

    Python读取excel文件中带公式的值的实现

    这篇文章主要介绍了Python读取excel文件中带公式的值的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • python3+PyQt5实现自定义流体混合窗口部件

    python3+PyQt5实现自定义流体混合窗口部件

    这篇文章主要为大家详细介绍了python3+PyQt5实现自定义流体混合窗口部件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Python+decimal完成精度计算的示例详解

    Python+decimal完成精度计算的示例详解

    在进行小数计算的时候使用float,经常会出现小数位不精确的情况。在python编程中,推荐使用decimal来完成小数位的精度计算。本文将通过示例详细说说decimal的使用,需要的可以参考一下
    2022-10-10
  • Python matplotlib绘制散点图的实例代码

    Python matplotlib绘制散点图的实例代码

    这篇文章主要给大家介绍了关于Python matplotlib绘制散点图的相关资料,所谓散点图就是反映两组变量每个数据点的值,并且从散点图可以看出它们之间的相关性,需要的朋友可以参考下
    2021-06-06

最新评论