я получил очень различную эффективность обучения с помощью следующей сетиМоделирование шаблона по умолчанию с помощью feedforwardnet в Matlab?
net = patternnet(hiddenLayerSize);
и следующего
net = feedforwardnet(hiddenLayerSize, 'trainscg');
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'softmax';
net.performFcn = 'crossentropy';
на один и те же данные.
Я думал, что сети должны быть одинаковыми.
Что я забыл?
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);
Выход следующим образом:
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.
См. Мое обновление, пожалуйста. 1-3 не может быть причин, так как результаты воспроизводятся на нескольких прогонах: 'patternnet' систематически выполняет лучше, чем (по-видимому) ту же самую' feedforwardnet'. Итак, причина в том, что (возможно) я инициализирую 'feedforwardnet' по-другому. Вопрос в том, в чем разница. –
http://www.mathworks.com/help/nnet/ref/feedforwardnet.html и http://www.mathworks.com/help/nnet/ref/patternnet.html. feedforwardnet является более универсальным и больше предназначен для функций аппроксимации, а patternnet - для распознавания образов. –
Если ваши данные задачи более подходят для шаблона, то patternnet будет работать лучше, и если ваши данные задачи более подходят для feedforwardnet, то функция feedforwardnet будет работать лучше. –