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中的迭代器和生成器
Oct 26 Python
python算法表示概念扫盲教程
Apr 13 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
Python rstrip()方法实例详解
Nov 11 Python
Python中Unittest框架的具体使用
Aug 27 Python
pytorch常见的Tensor类型详解
Jan 15 Python
利用python生成照片墙的示例代码
Apr 09 Python
Django全局启用登陆验证login_required的方法
Jun 02 Python
opencv 查找连通区域 最大面积实例
Jun 04 Python
python中PyQuery库用法分享
Jan 15 Python
python链表类中获取元素实例方法
Feb 23 Python
Python带你从浅入深探究Tuple(基础篇)
May 15 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中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
Vue源码分析之Vue实例初始化详解
2019/08/25 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
jQuery实现简单轮播图效果
2020/12/27 jQuery
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
Python守护进程(daemon)代码实例
2015/03/06 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
Python3 replace()函数使用方法
2018/03/19 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
python实现石头剪刀布小游戏
2021/01/20 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Python整数对象实现原理详解
2019/07/01 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
面向对象编程是如何提高软件开发水平的
2014/05/06 面试题
电信专业应届生自荐信
2013/09/28 职场文书
公司培训欢迎词
2014/01/10 职场文书
如何写好优秀的创业计划书
2014/01/30 职场文书
2015大学生实训报告
2014/11/05 职场文书
蓬莱阁导游词
2015/02/04 职场文书
个人求职自荐信范文
2015/03/06 职场文书
龙猫观后感
2015/06/09 职场文书