2014-11-06 3 views
1

Я исследовал множество вопросов и примеров, но я не могу понять, что не так с моей RPROP NN. Это также первый раз, когда я использую Encog, поэтому мне интересно, не так ли, что я делаю неправильно.Java - Encog 3.2 - сеть RPROP не обновляет весы

Я пытаюсь обучить сеть распознавать кошку, загружая ее изображения (50x50), затем преобразовывая ее в оттенки серого и подавая в сеть двойной вход [] [] вместе с двойным объектом [] []. Я заметил, что ошибка постоянно равна 4.0, поэтому я выполнил dumpWeights() с каждой обучающей итерацией, чтобы посмотреть, что происходит. Я заметил, что веса постоянно равны нулю. Затем я вернулся к основам, чтобы увидеть, если я делаю все правильно, поэтому я изменил его для задачи XOR:

//////////First created the network: 

BasicNetwork network = new BasicNetwork(); 

network.addLayer(new BasicLayer(null, true, 2)); 
network.addLayer(new BasicLayer(new ActivationBiPolar(), true, 2)); 
network.addLayer(new BasicLayer(new ActivationBiPolar(), false, 1)); 

network.getStructure().finalizeStructure(); 
network.reset(); 

//////Then created my data set and target vector (ideal vector) and fed it to a new RPROP training class: 

final double targetVector[][] = { { -1 }, { 1.0 }, { 1.0 }, { -1 } }; 
final double inputData[][] = { { -1, -1 }, { 1.0, -1 },{ -1, 1.0 }, { 1.0, 1.0 } }; 

MLDataSet trainingSet = new BasicMLDataSet(inputData, targetVector); 

final ResilientPropagation train = new ResilientPropagation(network, trainingSet); 

///////train network 

int epoch = 1; 

    do{ 
     train.iteration(); 
     System.out.println("Epoch #" + epoch + " Error : " + train.getError()) ; 
     epoch++; 

     System.out.println(network.dumpWeights()); 

    }while(train.getError() > 0.01) ; 
     train.finishTraining(); 

     System.out.println("End of training"); 

я получаю следующий результат, обратите внимание на линию 0,0 в результате сети. dumpWeights метод():

Эпоха # 132636 Ошибка: 2.0 0,0,0,0,0,0,0,0,0 Эпоха # 132637 Ошибка: 2.0 0,0,0,0,0 , 0,0,0,0 Эпоха # 132638 Ошибка: 2.0 0,0,0,0,0,0,0,0,0 Эпоха # 132639 Ошибка: 2.0 0,0,0,0,0 , 0,0,0,0 Эпоха # 132640 Ошибка: 2.0

... и прочее.

Что-нибудь очевидное, вы можете видеть, что я здесь делаю неправильно? Я также попробовал архитектуру 2-3-1, как реализовал пример XORHelloWorld.java.

Любая помощь была бы принята с благодарностью.

+0

Я просто попытался изменить набор данных и цели, заменяя -1 на 0.0, и изменить функцию активации на ActivationSigmoid, и, похоже, она работает нормально. Выход после изменения: Epoch # 48 Ошибка: +0,007620154423525455 +7,960025653965789, -14,182680838427633, -1,2611584281744572, -1.2781030810307181,10.50534716500236,9.690907558129927, -6.933186134247863,1.3562102936861975,1.6115414799461512, -2.8203649806273847,6.8557107101634545, -4.423294726521557,2.52133147494805 Конец обучения – wFateem

ответ

1

Попробуйте переключить свой скрытый слой с функцией активации TANH, таких, как это:

network.addLayer(new BasicLayer(null, true, 2)); 
network.addLayer(new BasicLayer(new ActivationTANH(), true, 2)); 
network.addLayer(new BasicLayer(new ActivationBiPolar(), false, 1)); 

С этим изменением, я могу получить ваш пример выше сходиться. Я думаю, что он будет работать лучше, чем Sigmoid, если вы используете в качестве входного сигнала от -1 до 1. Вполне нормально - это функция линейной активации (т. Е. ActivationBiPolar как функция активации выхода), но вам нужно что-то вроде сигмоида/tanh как скрытое. То, что не просто возвращает 1.0 как производную, как и линейные функции.

+0

Спасибо за ответ Джефф. Я попробовал ваше предложение, и я вижу небольшое изменение, но по существу у меня тот же результат. Веса были обновлены только один раз, и ошибка 2,0: 0,0,0,0.4884507325564466,0.17375282591824576, -0.9245120358699924,0.39254840143179537,0.5835401350814016,0.9597289079109588 Epoch # 2207520 Ошибка: 2,0 Единственный способ, которым я смог это сходится с помощью ActivationSigmoid со значениями 1 и 0 в качестве входных и целевых значений или с использованием ActivationSigmoid с 1 и -1 в качестве входного и целевого векторов со значениями 1 и 0 – wFateem

+0

. Я также пробовал с ActivationBipolarSteepenedSigmoid и сеть сходится только иногда. С одной попытки я получил: Epoch # 45 Ошибка: 0.008887634646260537 С другой стороны, я получил: Epoch # 179852 Ошибка: 0.999049357917208 (и продолжал работать) – wFateem