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 相关文章推荐
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
在Python中定义和使用抽象类的方法
Jun 30 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
Python生成任意范围任意精度的随机数方法
Apr 09 Python
Python实现的微信好友数据分析功能示例
Jun 21 Python
python中类的属性和方法介绍
Nov 27 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
python集成开发环境配置(pycharm)
Feb 14 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
Jun 09 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 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
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
php购物车实现方法
2015/01/03 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
jquery 圆形旋转图片滚动切换效果
2011/01/19 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
python通过实例讲解反射机制
2019/10/17 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
介绍一下JMS编程步骤
2015/09/22 面试题
导游的职业规划书范文
2013/12/27 职场文书
教师个人自我鉴定
2014/02/08 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
综合实践活动报告
2015/02/05 职场文书
戒赌保证书
2015/05/11 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
vue中div禁止点击事件的实现
2022/04/02 Vue.js