Здравствуйте!
Обучаюсь использовать нейронные сети в Матлабе. Поставил себе простую задачу, обучить сеть функции XOR. Вот примеры кода:
Код:
function ProgramNet1()
p = [0 0 1 1; 0 1 0 1]; % binary input sets
t = [0 1 1 0]; % desired output for each binary pair
% network with 2 hidden nodes.
net=newff([0, 1; 0, 1],[2,1],{'logsig','logsig'},'trainlm');
net.trainParam.epochs = 1000;
net.trainParam.goal = 10e-6;
[net,tr]=train(net,p,t);
ShowSurfaceOtklik( net, 20, 20 );
или вот:
Код:
function ProgramNet2()
p = [0 0 1 1; 0 1 0 1]; % binary input sets
t = [0 1 1 0]; % desired output for each binary pair
% network with 2 hidden nodes.
net=newpr(p,t,[2,1],{'logsig','logsig'},'trainlm');
net.trainParam.epochs = 1000;
net.trainParam.min_grad = 1e-6;
net.trainParam.max_fail = 50;
net = init(net);
[net,tr]=train(net,p,t);
ShowSurfaceOtklik( net, 20, 20 );
ShowSurfaceOtklik( net, 20, 20 ); - просто выводит график отклика сети
Сеть обучается правильно примерно в 5% случаев, в остальных же 95% неправильных случаев обучение прерывается или по градиенту или по валидатион чек или еще по чему. Эти все настройки я конечно менял, и пробовал разные функции обучения, но картина не меняется, график отклика часто весь кривой, не такой какой должен быть у XOR!
Люди! Как повысить вероятность правильного обучения?
Причем моя самопальная программа на C# с обучением по "обратному распространению ошибки" почти всегда идеально обучает! (правда она проходит 500 000 - 1200 000 эпох, ну и что. Алгоритм просто без всяких доп наворотов ускоряющих обучение, зато результат!) В чем прикол?!