首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Matlab中用前馈网络模拟缺省模式网?

在Matlab中用前馈网络模拟缺省模式网?
EN

Stack Overflow用户
提问于 2015-04-08 19:00:05
回答 2查看 2.2K关注 0票数 5

通过以下网络,我得到了非常不同的培训效率

代码语言:javascript
复制
net = patternnet(hiddenLayerSize);

和下一个

代码语言:javascript
复制
net = feedforwardnet(hiddenLayerSize, 'trainscg');
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'softmax';
net.performFcn = 'crossentropy';

同样的数据。

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

我忘了什么东西?

更新

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

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

代码语言:javascript
复制
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);

产出如下:

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

发布于 2015-04-21 02:44:11

看起来这两个不太一样:

代码语言:javascript
复制
>> 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,所以我认为其中之一是调整它的输出以更好地匹配实际数据的输出范围。

为了将来的参考,您可以通过转换到struct来做一些肮脏的事情,比如比较内部的数据结构。所以我做了一些事情

代码语言:javascript
复制
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

帮助找出不同之处。

票数 1
EN

Stack Overflow用户

发布于 2015-04-09 09:10:46

通常情况下,网络并不是每次训练都表现出完全相同的方式。这取决于三个(我的意思是我知道三个)的原因:

  1. 神经网络的初始初始化
  2. 数据规范化
  3. 数据缩放 如果说(1)网络最初被配置为随机权重,在一些具有不同标志的小范围内。例如,有6个输入的神经元可以得到这样的初始权重: 0.1,-0.3,0.16,-0.23,0.015,-0.0005。这可能会带来一点新的训练结果。如果说(2)如果你的归一化执行得不好,那么学习算法就会收敛到局部极小,不能跳出。同样的情况也适用于(3),如果您的数据需要缩放,而您没有成功。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29523137

复制
相关文章

相似问题

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