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处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
Python将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
浅析Windows 嵌入python解释器的过程
Jul 26 Python
python selenium登录豆瓣网过程解析
Aug 10 Python
Centos7 下安装最新的python3.8
Oct 28 Python
浅析Django中关于session的使用
Dec 30 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 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/01/02 PHP
在普通HTTP上安全地传输密码
2007/07/21 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
jquery垂直公告滚动实现代码
2013/12/08 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
浅谈python jieba分词模块的基本用法
2017/11/09 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
python求解汉诺塔游戏
2020/07/09 Python
测控技术与仪器个人求职信范文
2013/12/30 职场文书
会议邀请函范文
2014/01/09 职场文书
幼儿园教师辞职信
2014/01/18 职场文书
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
Python requests用法和django后台处理详解
2022/03/19 Python
PO模式在selenium自动化测试框架的优势
2022/03/20 Python