除了功能拟合,神经网络还擅长识别模式。
例如,假设您要根据细胞大小,团块厚度,有丝分裂等的均匀性将肿瘤分类为良性或恶性。有699个示例案例,其中有9项数据,正确分类为良性或恶性 。与函数拟合一样,有两种方法可以解决此问题:
•使用nprtool GUI,如“使用神经网络模式识别应用程序”中所述。
•使用命令行解决方案,如的“使用命令行功能”中所述。
通常最好先从GUI开始,然后使用GUI自动生成命令行脚本。 在使用任何一种方法之前,第一步是通过选择数据集来定义问题。 下一节描述数据格式。
定义问题
要定义模式识别问题,请将一组Q输入向量排列为矩阵中的列。 然后安排另一组Q目标向量,以便它们指示输入向量所分配的类(有关静态和时序数据的数据格式的详细说明,请参见“数据结构”)。
当只有两个类别时; 您可以将每个标量目标值设置为0或1,以指示相应输入所属的类。 例如,您可以按以下方式定义两类互斥或分类问题:
inputs = [0 1 0 1; 0 0 1 1];
targets = [1 0 0 1; 0 1 1 0];
当将输入分类为N个不同的类别时,目标向量具有N个元素。 对于每个目标向量,一个元素为1,其他元素为0。例如,以下几行显示了如何定义将5×5×5立方体的角分为三个类别的分类问题:
•一类中的原点(第一个输入向量)
•第二类中离原点(最后一个输入向量)最远的角
•第三类的所有其他要点
inputs = [0 0 0 0 5 5 5 5; 0 0 5 5 0 0 5 5; 0 5 0 5 0 5 0 5];
targets = [1 0 0 0 0 0 0 0; 0 1 1 1 1 1 1 0; 0 0 0 0 0 0 0 1];
可以仅使用两种格式来表示仅涉及两个类的分类问题。
目标可以由标量1/0元素或两元素向量组成,一个元素为1,另一个元素为0。
下一节将展示如何使用神经网络模式识别应用程序nprtool训练网络以识别模式。 本示例使用工具箱随附的癌症数据集。 该数据集由699个9元素输入向量和2元素目标向量组成。 每个目标向量有两个元素,因为与每个输入向量有两个类别(良性或恶性)。
使用神经网络模式识别应用程序
1如果需要,请使用以下命令打开“神经网络启动” GUI:
nnstart
2单击“模式识别”应用程序以打开“神经网络模式识别”应用程序。 (您也可以使用命令nprtool。)
3单击“下一步”继续。 将打开“选择数据”窗口。
4单击“加载示例数据集”。 “模式识别数据集选择器”窗口打开。
5选择乳腺癌,然后单击导入。 您将返回到“选择数据”窗口。
6单击“下一步”继续到“验证和测试数据”窗口。
验证和测试数据集分别设置为原始数据的15%。 通过这些设置,输入向量和目标向量将被随机分为三组,如下所示:
•70%用于训练。
•15%用于验证网络是否泛化并在过度拟合之前停止训练。
•最后15%用作网络泛化的完全独立测试。
(有关数据划分过程的更多讨论,请参见“划分数据”。)
7单击下一步。
用于模式识别的标准网络是两层前馈网络,在隐藏层具有S型传递函数,在输出层具有softmax传递函数。 隐藏神经元的默认数量设置为10。如果网络运行不如预期,您可能希望返回并增加该数量。 输出神经元的数量设置为2,它等于目标向量中元素的数量(类别的数量)。
8单击“下一步”。
9单击训练。
培训将继续进行55次迭代。
10在“图”窗格下,在“神经网络模式识别”应用程序中单击“混淆”。
下图显示了用于训练,测试和验证的混淆矩阵,以及三种数据的组合。 网络输出非常准确,如绿色方块中正确响应的数量很高,红色方块中错误响应的数量很少。 右下方的蓝色方块说明了整体精度。
11绘制接收器工作特性(ROC)曲线。 在“图”窗格下,单击“神经网络模式识别”应用程序中的“接收器操作特征”。
每个轴上的彩色线代表ROC曲线。 ROC曲线是随着阈值的变化,真实阳性率(敏感性)与错误阳性率(1-特异性)的关系图。 完美的测试将在左上角显示点,灵敏度为100%,特异性为100%。 对于此问题,网络性能很好。
12 在“神经网络模式识别”应用程序中,单击“下一步”评估网络。
此时,您可以针对新数据测试网络。
如果您对原始或新数据的网络性能不满意,可以再次对其进行训练,增加神经元的数量,或者获取更大的训练数据集。 如果训练集的性能良好,但测试集的性能却明显较差,这可能表明过拟合,那么减少神经元数量可以改善结果。
13对网络性能满意后,单击“下一步”。
使用此面板可生成用于仿真神经网络的MATLAB函数或Simulink图。 您可以使用生成的代码或图表更好地了解神经网络如何计算输入的输出,或者使用MATLAB Compiler工具和其他MATLAB代码生成工具来部署网络。
14单击“下一步”。 使用此屏幕上的按钮保存您的结果。
•您可以单击“简单脚本”或“高级脚本”来创建MATLAB代码,该代码可用于从命令行重现之前的所有步骤。
如果您想学习如何使用工具箱的命令行功能来自定义培训过程,创建MATLAB代码可能会有所帮助。 在“使用命令行功能”中,您将更详细地研究生成的脚本。
•您也可以在工作区中将网络另存为网络。 您可以对其执行其他测试,也可以将其用于新输入。
15保存结果后,单击“完成”。
使用命令行功能
学习如何使用工具箱的命令行功能的最简单方法是从GUI生成脚本,然后对其进行修改以自定义网络培训。
例如,查看在上一节的步骤14中创建的简单脚本。
% Solve a Pattern Recognition Problem with a Neural Network
% Script generated by NPRTOOL
%
% This script assumes these variables are defined:
%
% cancerInputs - input data.
% cancerTargets - target data.
inputs = cancerInputs;
targets = cancerTargets; % Create a Pattern Recognition Network hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize);
% Set up Division of Data for Training, Validation, Testing net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% Train the Network
[net,tr] = train(net,inputs,targets);
% Test the Network
outputs = net(inputs);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% View the Network
view(net)
% Plots
% Uncomment these lines to enable various plots.
% figure, plotperform(tr)
% figure, plottrainstate(tr)
% figure, plotconfusion(targets,outputs)
% figure, ploterrhist(errors)
您可以保存脚本,然后从命令行运行它以重现上一个GUI会话的结果。 您还可以编辑脚本以自定义训练过程。 在这种情况下,请按照脚本中的每个步骤进行操作。
1该脚本假定输入向量和目标向量已经加载到工作空间中。 如果未加载数据,则可以按以下方式加载它们:
[inputs,targets] = cancer_dataset;
2创建网络。 函数拟合(或回归)问题的默认网络patternnet是前馈网络,在隐藏层具有默认的tan-Sigmoid传递函数,在输出层具有softmax传递函数。 您为上一节中的一个隐藏层分配了十个神经元(有些随意)。
•网络有两个输出神经元,因为每个输入向量都有两个目标值(类别)。
•每个输出神经元代表一个类别。
•当将适当类别的输入向量应用于网络时,相应的神经元应产生1,其他神经元应输出0。
要创建网络,请输入以下命令:
hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize);
注意:针对模式识别问题的网络体系结构选择遵循与功能拟合问题类似的准则。 更多的神经元需要更多的计算,并且当数字设置得太高时,它们倾向于使数据过拟合,但是它们允许网络解决更复杂的问题。 更多的层需要更多的计算,但是它们的使用可能会导致网络更有效地解决复杂的问题。 要使用多个隐藏层,请在patternnet命令中输入隐藏层大小作为数组的元素。
3设置数据划分。
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
通过这些设置,输入向量和目标向量将被随机划分,其中70%用于训练,15%用于验证,而15%用于测试。
4训练网络。 模式识别网络使用默认的缩放共轭梯度(trainscg)算法进行训练。 要训练网络,请输入以下命令:
[net,tr] = train(net,inputs,targets);
在训练期间,如功能拟合中一样,培训窗口将打开。 此窗口显示训练进度。 要随时中断训练,请单击“停止训练”。
当验证误差增加了六次迭代时(此迭代发生在迭代24处),该训练停止了。
5测试网络。 训练完网络后,您可以使用它来计算网络输出。 以下代码计算网络输出,错误和整体性能。
outputs = net(inputs);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
通过使用位于训练记录中的测试索引,也可以仅在测试集上计算网络性能。
tInd = tr.testInd;
tstOutputs = net(inputs(:,tInd));
tstPerform = perform(net,targets(:,tInd),tstOutputs)
6查看网络图。
view(net)
7绘制训练,验证和测试性能图。
figure, plotperform(tr)
8使用plotconfusion函数绘制混淆矩阵。 它显示了最终训练网络中发生的各种错误。
figure
plotconfusion(targets,outputs)
对角线格显示正确分类的案例数,对角线格显示错误分类的案例。 右下角的蓝色单元格显示正确分类的案例的总数百分比(绿色)和错误分类的案例的总数百分比(红色)。 结果显示出很好的认识。 如果您需要更准确的结果,则可以尝试以下任何一种方法:
•使用init重置初始网络权重和偏差到新值,然后再次训练。
•增加隐藏神经元的数量。
•增加训练向量的数量。
•如果有更多相关信息,请增加输入值的数量。
•尝试其他训练算法(请参阅“训练算法”)。
在这种情况下,网络响应令人满意,您现在可以将网络用于新输入。
要获得更多命令行操作方面的经验,您可以尝试以下一些任务:
•在训练过程中,打开一个绘图窗口(例如混乱绘图),并观看动画。
•从命令行使用诸如plotroc和plottrainstate之类的功能进行绘制。
另外,从命令行进行培训时,请参阅高级脚本以获取更多选项。
每次训练神经网络时,由于不同的初始权重和偏差值以及将数据分为训练,验证和测试集的不同方式,可能会导致解决方案不同。 结果,针对相同问题训练的不同神经网络可以为相同输入提供不同的输出。 为了确保找到了精度较高的神经网络,请重新训练几次。
如果需要更高的精度,还有几种其他技术可以改善初始解决方案。 有关更多信息,请参见“改善浅层神经网络泛化并避免过度拟合”。