首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Matlab中为多类数据集创建多层感知器

如何在Matlab中为多类数据集创建多层感知器
EN

Stack Overflow用户
提问于 2016-01-29 00:11:49
回答 1查看 7.6K关注 0票数 2

我想为任务创建一个双层感知器。

它将作为Fisher虹膜数据集的分类器。

在创建网络时,我遇到了以下问题:

  • 对于上述数据集,我是否可以用一个输入来设置网络,并将n行和4个特征的整个训练矩阵作为输入值?或者,我是否需要调整网络以使用4个输入节点,每个特征1个,并将训练矩阵作为输入值传递?
  • 此外,如何正确地连接各层? 例如,当我使用网络命令创建一个带有4个输入的感知器时,我并不真正理解biasConnect、inputConnect和layerConnect实际上做了什么。
  • 最后,我需要多少个输出才能正确地分类一个元素?我遇到的每一个例子都使用一个输出,但是,仅仅一个就足够了吗?或者,我每节课都需要一个?

用于创建第二点提到的网络的命令:

代码语言:javascript
复制
net = network(4, 2, [1; 0], [1 1 1 1;0 0 0 0], [0 0; 1 0], [0 1]);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-30 20:32:01

让我们从网络连接开始。network函数的工作方式并不直观。为了控制输入向量是否正确地描述了结构,可以使用view(net)

现在,让我们简短地讨论每个参数:

numInputs --如果您的网络只获得一个输入数据集,则需要将1放在这里。

numLayers -对于虹膜数据集,在这里使用2是可以的。

biasConnect偏置单元用于“增加”输入和输出之间的非线性。我们希望网络能够近似于复杂的非线性函数,这就是为什么在两层中加入偏置单元是个好主意。所以,把这里,[1, 1]

inputConnect -向量具有维数numLayers-by-numInputs。它显示哪些输入与哪些层相连接。您只有一个输入连接到第一个层,所以将[1;0]放在这里。

layerConnect -向量具有维数numLayers-by-numLayers。你有两层。第一层连接到第二层,但不连接到自身。从第二层到第一层没有连接,第二层不给自己喂食。把[0 0; 1 0]放在这里。

outputConnect -向量具有维数1-by-numLayers,并显示哪一层连接到输出。把[0 1]放在这里。

下面是我们的命令和相应的图表:

代码语言:javascript
复制
net = network(1, 2, [1; 1], [1;0], [0 0; 1 0], [0 1]);

你可以对这些参数进行实验,结果的结构可能非常复杂。

网络配置

现在您需要配置网络。您可以在文档中找到所有参数,我将在这里描述最重要的:

  1. 为层设置正确的激活函数是很重要的。默认情况下,函数被设置为purelin。您可能想在这里使用类似于tansiglogsig的东西。
  2. 您需要设置每个层的大小。在你的情况下,我将使用5或7个单位在第一层。第二层的大小应该等于输出类的数量:在您的例子中是3
  3. 权值和偏置单元的初始化功能也应该为每一层设置。

生成的网络如下所示:

以下是代码:

代码语言:javascript
复制
net = network(1, 2, [1; 1], [1;0], [0 0; 1 0], [0 1]);

net.adaptFcn = 'adaptwb';
net.divideFcn = 'dividerand'; %Set the divide function to dividerand (divide training data randomly).

net.performFcn = 'mse';
net.trainFcn = 'trainlm'; % set training function to trainlm (Levenberg-Marquardt backpropagation) 

net.plotFcns = {'plotperform', 'plottrainstate', 'ploterrhist', 'plotconfusion', 'plotroc'};

%set Layer1
net.layers{1}.name = 'Layer 1';
net.layers{1}.dimensions = 7;
net.layers{1}.initFcn = 'initnw';
net.layers{1}.transferFcn = 'tansig';

%set Layer2
net.layers{2}.name = 'Layer 2';
net.layers{2}.dimensions = 3;
net.layers{2}.initFcn = 'initnw';
net.layers{2}.transferFcn = 'tansig';

[x,t] = iris_dataset; %load of the iris data set
net = train(net,x, t); %training

y = net(x); %prediction

view(net);

混乱矩阵看起来很好。所以网络运行得很好!

--有点锋利的方式--

如果要使用已预装的网络,可以使用以下代码:

代码语言:javascript
复制
[x,t] = iris_dataset;
net = patternnet;
net = configure(net,x,t);

net = train(net,x,t); %training
view(net);

y = net(x); %predict
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35074646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档