Java - Encog 3.2 - сеть RPROP не обновляет веса

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

Я пытаюсь научить сеть распознавать кошку, передавая ей изображения (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 в результате метода network.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.

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


person wFateem    schedule 06.11.2014    source источник
comment
Я только что попытался изменить набор данных и цели, заменив -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 Конец обучения   -  person wFateem    schedule 06.11.2014


Ответы (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 в качестве выходной функции активации), но вам нужно что-то вроде сигмоида/танга в качестве скрытого. Что-то, что не просто возвращает 1.0 как производную, как это делают линейные функции.

person JeffHeaton    schedule 06.11.2014
comment
Спасибо за ответ Джефф. Я попробовал ваше предложение и вижу небольшое изменение, но, по сути, у меня тот же результат. Вес обновили только один раз, и ошибка 2.0: 0,0,0.48845073255644507325564466918245282591824576, -0.92451203586999240.392548401431795379014317953769014317953790160888 Epoch # 2207520 Ошибка: 2.0 Единственный способ, которым я смог сделать это, чтобы сходиться ActivationSigmoid со значениями 1 и 0 в качестве входных и целевых значений или с использованием ActivationSigmoid со значениями 1 и -1 в качестве входного и целевого вектора со значениями 1 и 0 - person wFateem; 07.11.2014
comment
Я также пробовал с ActivationBipolarSteepenedSigmoid, и сеть сходится только иногда. С одной попытки я получил: Epoch # 45 Error: 0.008887634646260537 С другой попытки я получил: Epoch # 179852 Error: 0.999049357917208 (и продолжал работать) - person wFateem; 07.11.2014