mi sono molto diverse l'efficienza di formazione con la seguente reteSimula il patternnet predefinito con feedforwardnet in Matlab?
net = patternnet(hiddenLayerSize);
e il successivo
net = feedforwardnet(hiddenLayerSize, 'trainscg');
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'softmax';
net.performFcn = 'crossentropy';
sugli stessi dati.
Stavo pensando che le reti dovrebbero essere le stesse.
Che cosa ho dimenticato?
UPDATE
Il seguente codice illustra, che il comportamento della rete è dipende unicamente sulla funzione di creazione di rete.
Ogni tipo di rete è stata eseguita due volte. Questo esclude problemi generatori casuali o qualcosa del genere. I dati sono gli stessi.
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);
uscita segue:
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.
Vedere il mio aggiornamento per favore. 1-3 non può essere un motivo, dal momento che i risultati si riproducono su più esecuzioni: 'patternnet' esegue sistematicamente meglio di (apparentemente) lo stesso' feedforwardnet'. Quindi la ragione è (probabilmente) che inizializzo 'feedforwardnet' in modo diverso, la domanda è: qual è la differenza. –
http://www.mathworks.com/help/nnet/ref/feedforwardnet.html e http://www.mathworks.com/help/nnet/ref/patternnet.html. feedforwardnet è più universale e destinato di più alle funzioni di approssimazione, mentre patternnet è più utile per il riconoscimento dei pattern. –
Se i dati delle attività sono più adatti per patternnet, Patternnet funzionerà meglio e se i dati dell'attività sono più adatti per feedforwardnet, feedforwardnet funzionerà meglio. –