在Matlab中使用feedforwardnet模拟默认的patternnet?

Suz*_*ioc 5 matlab neural-network

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

net = patternnet(hiddenLayerSize);
Run Code Online (Sandbox Code Playgroud)

和以下一个

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

在相同的数据上.

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

我忘记了什么?

UPDATE

下面的代码演示了网络行为的独特性取决于网络创建功能.

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

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);
Run Code Online (Sandbox Code Playgroud)

输出如下:

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.
Run Code Online (Sandbox Code Playgroud)

Yur*_*kyy 0

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

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