【问题标题】:Simulate default patternnet with feedforwardnet in Matlab?在 Matlab 中使用前馈网络模拟默认模式网络?
【发布时间】:2015-06-13 21:53:27
【问题描述】:

使用以下网络我得到了非常不同的训练效率

net = patternnet(hiddenLayerSize);

还有下一个

net = feedforwardnet(hiddenLayerSize, 'trainscg');
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'softmax';
net.performFcn = 'crossentropy';

在相同的数据上。

我在想网络应该是一样的。

我忘记了什么?

更新

下面的代码演示了,网络行为是唯一依赖于网络创建函数的。

每种类型的网络都运行了两次。这不包括随机生成器问题或其他问题。数据是一样的。

hiddenLayerSize = 10;

% pass 1, with patternnet
net = patternnet(hiddenLayerSize);

net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

[net,tr] = train(net,x,t);

y = net(x);
performance = perform(net,t,y);

fprintf('pass 1, patternnet, performance: %f\n', performance);
fprintf('num_epochs: %d, stop: %s\n', tr.num_epochs, tr.stop);

% pass 2, with feedforwardnet
net = feedforwardnet(hiddenLayerSize, 'trainscg');
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'softmax';
net.performFcn = 'crossentropy';

net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

[net,tr] = train(net,x,t);

y = net(x);
performance = perform(net,t,y);

fprintf('pass 2, feedforwardnet, performance: %f\n', performance);
fprintf('num_epochs: %d, stop: %s\n', tr.num_epochs, tr.stop);

% pass 1, with patternnet
net = patternnet(hiddenLayerSize);

net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

[net,tr] = train(net,x,t);

y = net(x);
performance = perform(net,t,y);

fprintf('pass 3, patternnet, performance: %f\n', performance);
fprintf('num_epochs: %d, stop: %s\n', tr.num_epochs, tr.stop);

% pass 2, with feedforwardnet
net = feedforwardnet(hiddenLayerSize, 'trainscg');
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'softmax';
net.performFcn = 'crossentropy';

net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

[net,tr] = train(net,x,t);

y = net(x);
performance = perform(net,t,y);

fprintf('pass 4, feedforwardnet, performance: %f\n', performance);
fprintf('num_epochs: %d, stop: %s\n', tr.num_epochs, tr.stop);

输出如下:

pass 1, patternnet, performance: 0.116445
num_epochs: 353, stop: Validation stop.
pass 2, feedforwardnet, performance: 0.693561
num_epochs: 260, stop: Validation stop.
pass 3, patternnet, performance: 0.116445
num_epochs: 353, stop: Validation stop.
pass 4, feedforwardnet, performance: 0.693561
num_epochs: 260, stop: Validation stop.

【问题讨论】:

    标签: matlab neural-network


    【解决方案1】:

    看起来这两个不太一样:

    >> net = patternnet(hiddenLayerSize);
    >> net2 = feedforwardnet(hiddenLayerSize,'trainscg');
    >> net.outputs{2}.processParams{2}
    
    ans =
    
        ymin: 0
        ymax: 1
    
    >> net2.outputs{2}.processParams{2}
    
    ans =
    
        ymin: -1
        ymax: 1
    

    net.outputs{2}.processFcns{2}mapminmax,所以我认为其中之一是重新调整其输出以更好地匹配实际数据的输出范围。

    为了将来的参考,你可以做一些讨厌的事情,比如通过强制转换为结构来比较内部数据结构。所以我做了类似的事情

    n = struct(net); n2 = struct(net2);
    for fn=fieldnames(n)';
      if(~isequaln(n.(fn{1}),n2.(fn{1})))
        fprintf('fields %s differ\n', fn{1});
      end
    end
    

    帮助查明差异。

    【讨论】:

      【解决方案2】:

      通常网络不会以完全相同的方式进行每次训练。这可能取决于三个(我的意思是我知道三个)原因:

      1. 神经网络的初始初始化。
      2. 数据标准化
      3. 数据缩放
        如果谈论(1)网络最初配置有随机权重,在一些具有不同符号的小范围内。例如,具有 6 个输入的神经元可以获得如下初始权重:0.1、-0.3、0.16、-0.23、0.015、-0.0005。这可能会导致另一个训练结果。如果要谈论(2),如果您的归一化执行不佳,那么学习算法会收敛到局部最小值,并且无法跳出它。如果您的数据需要扩展,而您没有做到,这同样适用于情况 (3)。

      【讨论】:

      • 请看我的更新。 1-3 不能成为原因,因为结果在多次运行中重现:patternnet 系统地执行优于(显然)相同的feedforwardnet。所以原因是(可能)我以不同的方式初始化feedforwardnet,问题是:有什么区别。
      • mathworks.com/help/nnet/ref/feedforwardnet.htmlmathworks.com/help/nnet/ref/patternnet.html。前馈网络更通用,更适用于近似函数,而模式网络更适用于模式识别。
      • 如果你的任务数据更适合patternnet,那么patternnet会表现更好,如果你的任务数据更适合feedforwardnet,那么feedforwardnet会表现更好。
      • patternnet 在内部调用 feedforwardnet 并且都输出 network 对象。问题是:两种创作方式之间的实际区别是什么。我试图通过设置适当的传输和性能函数来重现它,但显然失败了。问题是:我忘了做什么?
      • 数据是分类用的,没关系。两个调用的数据相同。目标是使feedforwardnetpatternnet 一样工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2021-02-05
      • 1970-01-01
      • 2019-04-12
      • 2016-08-04
      相关资源
      最近更新 更多