Ich habe sehr unterschiedliche Trainingseffizienz mit dem folgende NetzwerkSimulieren Standard-Patternnet mit Feedforwardnet in Matlab?
net = patternnet(hiddenLayerSize);
und dem folgenden
net = feedforwardnet(hiddenLayerSize, 'trainscg');
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'softmax';
net.performFcn = 'crossentropy';
auf den gleichen Daten.
Ich dachte, Netzwerke sollten gleich sein.
Was habe ich vergessen?
UPDATE
Der folgende Code zeigt, ist, dass das Netzwerkverhalten hängt eindeutig auf Netzwerk-Erstellungsfunktion.
Jede Art von Netzwerk wurde zwei Mal ausgeführt. Dies schließt zufällige Generatorprobleme oder etwas anderes aus. Daten sind gleich.
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);
Ausgang folgt:
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.
Siehe mein Update bitte. 1-3 können keine Gründe sein, da sich die Ergebnisse auf mehreren Läufen reproduzieren: 'patternnet' führt systematisch besser aus als (scheinbar) das gleiche' feedforwardnet'. Der Grund ist (wahrscheinlich) ich initiiere 'feedforwardnet' anders, Die Frage ist: Was ist der Unterschied? –
http://www.mathworks.com/help/nnet/ref/feedforwardnet.html und http://www.mathworks.com/help/nnet/ref/patternnet.html. feedforwardnet ist universeller und eher für Approximationsfunktionen gedacht, während patternnet eher für die Mustererkennung gedacht ist. –
Wenn Ihre Aufgabendaten besser für patternnet passen, dann wird patternnet besser funktionieren, und wenn Ihre Aufgabendaten für feedforwardnet passender sind, wird feedforwardnet besser funktionieren. –