【问题标题】:How to create a multi-layer perceptron in Matlab for a multi-class dataset如何在 Matlab 中为多类数据集创建多层感知器
【发布时间】:2016-05-06 14:31:42
【问题描述】:

我想为作业创建一个双层感知器。
它将作为 Fisher iris 数据集的分类器。

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

  • 对于像上面这样的数据集,我可以用一个单一的设置网络吗? 输入并传递 n 行和 4 个特征的整个训练矩阵作为 输入值?或者,我是否需要调整网络以使用 4 个输入 节点,每个特征 1,并将训练矩阵作为输入传递 价值?
  • 此外,如何正确地连接各层?
    例如,当我使用 4 个输入创建一个感知器时 network 命令,我不太明白biasConnect、inputConnect 和layerConnect 到底是做什么的。
  • 最后,正确分类一个元素需要多少个输出? 我遇到的每个示例都使用一个输出,但是,只有一个 够了吗?或者,我需要为每个班级提供一个吗?

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

net = network(4, 2, [1; 0], [1 1 1 1;0 0 0 0], [0 0; 1 0], [0 1]);

【问题讨论】:

    标签: matlab perceptron


    【解决方案1】:

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

    现在让我们简要讨论每个参数:

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

    numLayers - 对于 iris 数据集,可以在这里使用 2

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

    inputConnect - 向量的维度为numLayers-by-numInputs。它显示哪些输入连接到哪些层。你只有一个输入连接到第一层,所以把[1;0]放在这里。

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

    outputConnect - 向量的维度为1-by-numLayers,并显示连接到输出的层。把[0 1]放在这里。

    这是我们的命令和对应的图表:

    net = network(1, 2, [1; 1], [1;0], [0 0; 1 0], [0 1]);
    

    您可以对参数进行试验,得到的结构可能非常复杂。

    网络配置

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

    1. 为层设置正确的激活函数很重要。默认情况下,该函数设置为purelin。您可能想在这里使用tansiglogsig 之类的东西。

    2. 你需要设置每一层的大小。在你的情况下,我会在第一层使用 5 或 7 个单位。第二层的大小应等于输出类的数量:在您的情况下为3

    3. 还应为每一层设置权重和偏置单元的初始化函数。

    生成的网络如下所示:

    代码如下:

    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);
    

    混淆矩阵看起来很不错。所以网络运行良好!

    有点射击的方式

    如果你想使用已经预装的网络,你可以使用这个代码:

    [x,t] = iris_dataset;
    net = patternnet;
    net = configure(net,x,t);
    
    net = train(net,x,t); %training
    view(net);
    
    y = net(x); %predict
    

    【讨论】:

    • 非常感谢您花时间制作这个我真的很感激
    猜你喜欢
    • 2011-07-01
    • 2011-11-15
    • 2021-07-25
    • 2015-08-14
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2015-11-21
    • 2013-12-14
    相关资源
    最近更新 更多