最近在搞神经网络,我选择了和别人不同的学习方法,别人是先搞定数学,在搞理论,最后搞应用。而我是先大致搞清楚神经网络的大致流程和BP的基本算法,然 后找一些开源的神经网络框架来学习,直接搞应用,最后在理论和数学不懂的地方再去查资料学习。结果发现这种方法很好,最起码很能调动我学习这些深奥知识的 兴趣。搞了没几天,竟然可以把神经网络用于自己项目中了,爽!
寻找开源项目没花多少时间,在百度里搜神经网络,发现有很多都在谈论Joone这个项目,估计这个人缘不错,然后到sourceforge上面一查,确实下载量很大,社区搞得也不错。下载关于它的所有资源,一切准备就绪,开始搞定它的源代码。
读它的源代码过程中发现,这个项目写得确实很不错,层次非常清楚,用了几个核心类 (Layer,Synapse,Learner,Matrix,NeuralNet和Monitor)和几种设计模式 (Factory,Adapter,Observer等)就把神经网络复杂的结构构建得清清楚楚,读它的源代码真的很值,不仅可以搞清楚神经网络的原理, 还可以学习到如何用程序构建神经网络,以下是我读源代码的收获:
1)Layer层是包含神经元的层次,从一些理论书上得知,虽然层次越多精确度越高,但复杂度也越大,在实际应用中一般都是用3层。在Joone里一般也 只用三层,分别是输入层,隐藏层和输出层。Layer层主要作用有两个:传递数据和激化函数。Joone有个基类Layer,它有两个主要函数 fwdRun和revRun,一个是先前传递,一个向后传递,先前主要是训练,向后主要是学习和修改权矩阵。fwdRun和revRun的过程很类 似,fwdRun是分为三步:向输入Synapse中取数据,用激化函数处理数据,向输出Synapse中放数据。revRun过程正好相反。Layer 下面有很多子类,如:LinearLayer,SigmoidLayer,SineLayer等,这些子类主要是派生forward和backward函 数,这两个函数主要用途就是用激化函数去处理输入数据,如LinearLayer的激化函数是线性的,SigmoidLayer的激化函数是 1/(1+ex)等。
2)Synapse主要是构建突触的层次。它主要是用途有两个:连接Layer和储存权矩阵。因为基于多线程,连接Layer主要采用缓冲机制。 Synapse有个缓冲区,先用fwdGet方法取数据,如果缓冲区内有数据就让线程wait。再用forward方法更新数据,最后用fwdPut方法 输出数据,如果缓冲区内没有数据就让线程wait。revGet和revPut的思想基本相似,中间的backward方法主要用于更新权矩阵。 Synapse下面有很多子类,如FullSynapse,KohonenSynapse等,它们也是在forward和backward方法上面派生, 主要差别是在连接机制上面,比如FullSynapse采用全连接机制。
3)Layer层和Synapse层结构非常类似,互相连接互相传递数据,子类继承机制也非常相似,都是派生forward和backward方法,用基 类完成基本的数据传递,让子类完成特殊的数据处理。数据流和工作流清清楚楚,并能适用于任何情况。这不光包含了神经网络原理,更是包含了软件设计艺术,真 是值得学学!
4)Monitor主要是监视类,用于监视和控制整个网络的运行
5)NeuralNet是整个网络的控制中心。用于配置和连接各个层次,并控制网络的开始,结束,和中间循环的开始和结束。它的主要程序有三个步骤:一, 循环初始化所有Layer和Synapse 二,循环进行向前和向后过程 三,结束程序。并且Jooner提供了NeuralNetListener接口,用于监视和控制NeuralNet的所有过程
基本上Jooner的大致思想和过程就是这么些,但它里面的细节却远不止这些,以后的工作就在于深入学习它的学习机制,数据处理和分布式处理方式。并且可 以写自己的Layer和Synapse来做试验。现在终于能体会到数学在编程中的应用了。以后争取把神经网络用于自己的项目,比如搜索引擎和CRM。估计 可以在专家决策和客户数据分析等方面有些运用吧,不过估计蔡总不太会愿意用这些比较虚幻的技术
读Joone源代码有感
最新推荐文章于 2022-11-16 14:30:28 发布