大家好,又见面了,我是你们的朋友全栈君。
0.导读
首先声明,这篇文章的内容并不全是本人的原创内容,凡是引用了别人的博客或者文章的地方,我都会标注出来,以便大家阅读原文。
现在最前面的,当然是提纲挈领的废话。凡是商品都有目标人群,文章也该如此,一篇文章写了什么,是写给谁看的,看完之后会起到什么作用,应该是作者在一开始就简明扼要的提出的,否则读者读了文章发现毫无用处,作者挨骂,读者无获,皆不欢喜。
本文的主要内容,是采用形象的描述而非准确的定义来让读者对神经网络有一个粗略的了解,基于MATLAB的GUI界面而非command windows来快速搭建一个神经网络以解决简单的问题。如果你的电脑上没有MATLAB,官方提供的MATLAB在线服务是个不错的选择MATLAB Online – MATLAB & Simulink,当然,前提是你得有正版的激活码。笔者计划在下一篇文章采用准确的定义和MATLAB的脚本语言来进一步阐述神经网络。本文的受众,是那些大学低年级学生–没有受过专业或系统的训练,却因为数模等原因需要在短时间内了解且应用神经网络。
1.神经网络工具箱
为了利用MATLAB搭建一个神经网络,我们要首先了解一下什么是神经网络。斯坦福大学的印度学生、机器学习爱好者 PararthShah 在2012年12月22日的使用买芒果的例子,非常经典易懂。知友Begin Again翻译如下:
你需要挑选芒果,你不知道什么样的芒果最好吃,所以你就尝遍了所有的芒果,然后自己总结出个大深黄色的比较好吃,以后再去买的时候,就可以直接挑选这种。那什么是机器学习呢,就是你让机器“尝”一遍所有芒果,当然,也假设它知道哪些好吃,让机器去总结一套规律(个大深黄色),这就是机器学习。具体操作,就是你描述给机器每一个芒果的特征(颜色,大小,软硬……),描述给机器其输出(味道如何,是否好吃),剩下的就等机器去学习出一套规则。
等等,那机器是怎么学习到这个规则(个大深黄色的好吃)的?没错,是通过机器学习算法。近些年来,由于深度学习概念的兴起,神经网络又成为了机器学习领域最热门的研究方法。神经网络就像一个刚开始学习东西的小孩子,开始认东西,作为一个大人(监督者),第一天,他看见一只京巴狗,你告诉他这是狗;第二天他看见一只波斯猫,他开心地说,这是狗,纠正他,这是猫;第三天,他看见一只蝴蝶犬,他又迷惑了,你告诉他这是狗……直到有一天,他可以分清任何一只猫或者狗。
其实神经网络最初得名,就是其在模拟人的大脑,把每一个节点当作一个神经元,这些“神经元”组成的网络就是神经网络。而由于计算机出色的计算能力和细节把握能力,在大数据的基础上,神经网络往往有比人更出色的表现。当然了,也可以把神经网络当作一个黑箱子,只要告诉它输入,输出,他可以学到输入与输出的函数关系。神经网络的理论基础之一是三层的神经网络可以逼近任意的函数,所以理论上,只要数据量够大,“箱子容量”够大(神经元数量),神经网络就可以学到你要的东西。
2.如何利用MATLAB工具箱建立神经网络
以上的关于神经网络粗浅的描述,虽然并不准确,但是大体的意思表达到位了。简单来说,神经网络就是定义域(输入)和值域(输出)之间的映射。举例来说,病人到医院做了一堆检查,包括肝功能,尿检,血检等,得到了一堆数据(输入),现在要根据这堆数据判断病人得了什么病(输出),这就是神经网络的常用场景之一:模式识别,或者说分类。如下图所示,MATLAB工具箱中的神经网络还可用于曲线拟合(其实这也就是个映射),动态时间序列等问题上。
在MATLAB的command window里输出命令
nnstart
即可调用其自带的神经网络工具箱向导。首先根据你要解决的问题选择合适的神经网络,这里以运用的最多的模式识别举例。选择pattern recognition app,如下图所示。
模式识别工具箱,顾名思义,就是用来解决上述病人看病和判断芒果是否好吃的例子的。该工具箱的神经网络采用了两层前向式网络(A two-layer feed-forward network),训练函数是trainscg(scaled conjugate gradient backpropagation)若隐藏层含有足够多的神经元,就能取得较好的识别效果( can classify vectors arbitrarily well, given enough neurons in its hidden layer)。
点击next,开始导入数据。
在这里要说明一下数据格式。输入数据和目标数据都是以矩阵的形式表示,可以表示为行矩阵或者列矩阵。如图中1号红色框所示,我选择列矩阵,那么我的输入输出矩阵中每一列代表一个样本,比如我有150个样本,每个样本包含四个坐标分量,那么我的输入矩阵大小应该为4*150.目标矩阵也应该按照列来解读,如我有150个样本,那么我的目标矩阵也应该是150,每一列都代表与其相对应的输入的结果,其中0意味着不属于该类,1意味着属于该类。比如,第75个输出属于第二类,那么我的目标矩阵的第75列为(0;1;0)。
点击next,进行数据分类。
在这里简单解释一下这三类数据,分别是训练数据(train),确认数据(validation)和测试数据(test)。其中,训练数据用于训练神经网络,确认数据用于确认神经网络的训练效果,测试数据用于展示神经网络好坏。事实上,确认数据和测试数据的作用相似,在数据量较小的情况下,可以不设置测试数据,只设置训练数据和确认数据。
在确认好各个数据的比例后,点击next选择隐藏层神经元数量。
在这里需要解释的是,隐藏层(hidden layer)的神经元数量的选取没有一定的准则。数量过少会使得拟合效果不好(模式分类不够准确),数量过多有可能出现过拟合状态(对于其他数据的识别能力较差)。所以一般的做法是保留默认值,如果对默认值不满意再增加神经元数量。 点击next,此时已经创建好神经网络。
由于训练函数已经选定为trainscg(scaled conjugate gradient backpropagation)且不可更改,所以直接点击train。
此时弹出训练窗口。这里主要解释一下progress和plots。对于progress,我们看到有一下几个条目:
epoch:其代表着迭代次数。BP神经网络的训练是采用迭代训练的,图中显示训练(迭代)15次即停止。特别的,右边的1000意思是训练次数上限为1000次,超过1000次自动停止。
time:训练的时间。图中显示本次训练时间为1S
validation checks:与performance和gradient同为停止条件之一。意思是若连续几次训练
performance和gradient的效果不再提高则视为训练完成。但是通过performance和gradient停止意味着该神经网络达到了我们的预期,而通过validation checks停止则意味着该神经网络没有达到了我们的预期。
对于plots,较有参考价值的为后三个。
误差直方图(error Histogram):如下图所示,绝大部分误差在(-0.0348,0.0363)之间。
混淆矩阵(confusion matrix):可视为一个表格。具体可参考百度百科:混淆矩阵_百度百科
ROC曲线:与混淆矩阵相同,也用来表征该神经网络的效果。具体可参考我之前写的一篇文章:ROC曲线简介 – 知乎专栏
回到nprtool,此时有两种选择。
对神经网络的效果不满意,可以选择retrain。理论上,由于初值不同,每一次训练效果都不一样,但是笔者尝试几次发现并无大的区别。选择next,可进行下一步。
对神经网络不满意,可以选择重新训练(train again),调整隐藏层神经元数目(adjust network size)和导入更多数据。特别的,隐藏层(hidden layer)的神经元数量的选取没有一定的准则。数量过少会使得拟合效果不好(模式分类不够准确),数量过多有可能出现过拟合状态(对于其他数据的识别能力较差)。点击next
此时我们可以选择生成MATLAB函数或者可视化神经网络。生成MATLAB函数的话,你就可以利用刚刚训练的网络来解决你自己的问题啦。当然,你的问题和你之前导入的训练数据一定要是同一个问题。就像你不能拿用病人看病的数据训练出来的网络来进行芒果是否好吃的判断。
点击finish,关闭这个向导。
洋洋洒洒写了这么多,其实就是MATLAB神经网络工具箱的一个注解,希望能够对你有多帮助。当然笔者水平有限,写都不对的地方还是希望你能够私信给我,大家共同学习。
人工神经网络学习笔记2——MATLAB神经网络工具箱
神经网络理论的初学者可以利用MATLAB自带的神经网络工具箱来理解ANN算法。
神经网络工具箱模型包括如下内容:
· 感知器
· 线性网络
· BP网络
· 径向基函数网络
· 竞争型神经网络
· 自组织网络和学习向量量化网络
· 反馈网络
神经网络工具箱的使用
在命令行窗口输入nnstart,可以打开MATLAB提供的神经网络图形用户界面,如图1所示:
图1 神经网络图形用户界面
再次点击该界面的‘Fitting app’按钮,打开神经网络工具箱。正如上图显示的一样,直接在命令行窗口输入‘nftool’打开神经网络工具箱。点击之后界面如图2所示:
图2 神经网络工具箱
可以很清楚的看到,一个人工神经网络模型是由‘Input’,‘Hidden Layer’,‘Output Layer’和‘Output’三(四)个主要成分构成,单击‘Next’按钮继续下面的操作。
图3 输入值及目标值选择界面
‘Input’和‘Targets’可以分别选择神经网络的输入及目标值,此处为了演示,我选择了‘Load Example Data Set’按钮用系统自带的数据‘House’导入到要训练的神经网络中,此时输入为‘houseinputs’,目标为‘house Targets’,单击Next继续下一步操作。
图4 样本比例选择界面
阅读图4中信息,我们需要设置用于训练、验证和测试的样本比例,默认为70:15:15。选择完成之后单击‘Next’,开始建立图5所示神经网络结构图。本神经网络共3层,分别为输入层、输出层和隐含层,其中隐含层的神经元数目可以在途中修改。
图5 神经网络隐含层神经元数目选择
确定神经网络隐含层神经元后,单击‘Next’按钮,确定神经网络结构,在出现的界面中可以选择是否训练神经网络,如图6所示。
图6 神经网络的确定
单击‘Train’按钮,选择训练之前确定的神经网络,如图7所示。
图7 训练神经网络
出现如图所示结果,则说明神经网络已经训练完成,可以在‘Plots’选项内选择需要看到的图形信息。‘Performance’按钮可以显示训练结果示意图;‘Training State’可以得到神经网络训练参数的变化过程示意图,如图8,9所示。
图8 训练结果
图9 训练参数变化曲线
训练完成后,连续单击‘Next’两次,在神经网络的确定窗口中可以保存此次训练结果。
图10 保存结果
准备文书准备的心力憔悴,以上是MATLAB神经网络工具箱的具体使用流程,更多的细节望大家自己去挖掘!
MATLAB中神经网络工具箱的使用
今夕何夕兮,前些天把玩了一下MATLAB中神经网络工具箱的使用,忽有“扪参历井仰胁息”之感。别的倒是没什么,只是神经网络的数据组织结构有些“怪异”,要是不小心就会导致工具箱报错。以下便是神经网络工具箱的正确打开姿势,谨供诸君参考:
1.打开MATLAB,在命令行输入nntool,将出现如下界面:
图1 神经网络工具箱主界面
其中最主要的分为6个部分:第1部分中显示的是系统的输入数据;第2部分是系统的期望输出;第3部分是网络的计算输出;第4部分是网络的误差,即2和3之间的差异;第5部分呈现的是已经建立的神经网络实例;第6部分的两个按钮分别负责数据的导入和网络模型的建立。
2.点击“Import”按钮,分别导入输入数据与目标输出数据(数据可从工作区导入,也可从文件导入):
图2 导入输入数据集
图3 导入期望输出数据集
导入数据后主界面的情况如下:
图4 导入数据后的情况
重要说明:神经网络的数据是以列为基本单位的,即输入与输出数据的列数必须相同,否则将报错!如果原先数据是以行为单位组织的话,可以先在MATLAB中实现转置然后再导入,即B = A’。
3.现在需要的数据已经有了,下一步就是建立一个神经网络模型对数据集进行学习。以下步骤以BP网络为例,首先点击“New”按钮,出现如下界面:
图5 神经网络模型设置
几个重要部分已在上图中框出:1处用于定义该神经网络的名称;2处用于选择神经网络的类型;3处用于选择网络的输入数据;4处用于确定网络的期望输出数据;5、6、7处分别对神经网络的主要机制函数进行设置;8处设置网络层数;9处用于选择各网络层(需要说明的是:第1层指的是隐含层而不是输入层),从而在10和11处可以对该层的神经元个数和传递函数进行设置;12处按钮可以用于查看当前所设置的神经网络的结构图(下附图);点击13处按钮即可生成对应的神经网络模型。前面只是简单地介绍了各个部分的作用,具体参数应该如何设置就只有各位自行去学习相关的文献了,此处不再多言。
图6 神经网络结构预览
4.现在模型和数据都有了,下一步该进行模型的训练了。回到主界面如下:
图7 回到主界面
选中我们刚才建立的神经网络模型,然后点击“Open”按钮,将会出现如下界面:
图8 神经网络界面
在这里主要介绍两个选项卡中的内容,一个是“Train”,另一个是“Adapt”。点击“Train”选项卡后做相应的设置即可进行神经网络的训练:
图9 模型主要信息设置
图10 模型具体参数设置
设置完所有信息后点击“TrainNetwork”按钮即可进行网络的训练了。训练完成后会有一个结果信息界面,如下:
图11 训练结果反馈
5.OK,现在模型训练也结束了,那么下一步自然是要来验证我们训练的模型。先导入验证输入和验证输出,这一步不再重提。然后来到模型验证界面:
图12 验证数据导入后
图13 验证参数设置
红框1中设置网络的输入和验证输出;2中设置网络输出和误差情况的存储名;这些都完成之后点击“Adapt Network”后即可。此后会出现如下的提示界面:
图 14 提示界面
接下来再回到神经网络主界面如下:
图15 网络验证结果
此时界面中会多出红框所框出的两组数据,它们分别是网络的输出与对应的输出误差。具体的数据可以通过双击它们来打开查看。
重要说明:
神经网络的输入和输出数据要求每列为一个样本,按平常的习惯可能需要转置一下。
否则可能会报输入/输出样本数量不同的错误。
如果出现“input data size does not match net.inputs{1}.size”错误,那是因为创建神经网络是设定的输入个数与样本数据的输入个数不同而引起的,重新创建合适的神经网络即可。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151519.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...