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中glob模块查找文件路径的用法
Jul 05 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
Django自定义过滤器定义与用法示例
Mar 22 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
Appium+python自动化怎么查看程序所占端口号和IP
Jun 14 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 Python
Django Rest framework频率原理与限制
Jul 26 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
撤回我也能看到!教你用Python制作微信防撤回脚本
Jun 11 Python
C站最全Python标准库总结,你想要的都在这里
Jul 03 Python
5道关于python基础 while循环练习题
Nov 27 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 可阅读随机字符串代码
2010/05/26 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
深入理解angularjs过滤器
2016/05/25 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
微信小程序自定义组件
2017/08/16 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
python基础教程之元组操作使用详解
2014/03/25 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
Python常用算法学习基础教程
2017/04/13 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
python队列queue模块详解
2018/04/27 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
python中return如何写
2020/06/18 Python
大型车展策划方案
2014/02/01 职场文书
论文答谢词
2015/01/20 职场文书
同学聚会祝酒词
2015/08/10 职场文书
MySQL基础(二)
2021/04/05 MySQL
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python