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


Posted in Python onDecember 19, 2017

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

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

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

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

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

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

感知机(Perceptrons)

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

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

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

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

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

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

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

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

b一般称作偏差。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

构造我们的神经网络

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

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

在设计神经网络时,一般会采取简单粗暴的方式,比如我们要让计算机识别手写稿的扫描件图像,其中的一个字的图像像素个数是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 相关文章推荐
python数据结构之图的实现方法
Jul 08 Python
Python Sql数据库增删改查操作简单封装
Apr 18 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
Windows和Linux下Python输出彩色文字的方法教程
May 02 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
浅析python redis的连接及相关操作
Nov 07 Python
django-利用session机制实现唯一登录的例子
Mar 16 Python
python如何实现DES加密
Sep 21 Python
Python常用断言函数实例汇总
Nov 30 Python
基于Django快速集成Echarts代码示例
Dec 01 Python
python数据库批量插入数据的实现(executemany的使用)
Apr 30 Python
Python random模块用法解析及简单示例
Dec 18 #Python
Python方法的延迟加载的示例代码
Dec 18 #Python
Python字符串拼接六种方法介绍
Dec 18 #Python
Python Socket使用实例
Dec 18 #Python
浅谈python数据类型及类型转换
Dec 18 #Python
Python字典,函数,全局变量代码解析
Dec 18 #Python
Python语言生成水仙花数代码示例
Dec 18 #Python
You might like
初级的用php写的采集程序
2007/03/16 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
js比较和逻辑运算符的介绍
2013/03/10 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
vue ssr 指南详读
2018/06/29 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
Django发送html邮件的方法
2015/05/26 Python
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
Python for循环生成列表的实例
2018/06/15 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
教学大赛获奖感言
2014/01/15 职场文书
保险经纪人求职信
2014/03/11 职场文书
网络信息安全承诺书
2014/03/26 职场文书
求职信内容怎么写
2014/05/26 职场文书
教师听课学习心得体会
2016/01/15 职场文书
学习党章心得体会2016
2016/01/15 职场文书
会计做账心得体会
2016/01/22 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python