Encog обучение нейронной сети java слишком медленно

Я обучаю нейронную сеть классифицировать изображения, и выполнение одной итерации занимает слишком много времени... около пяти минут, и это еще не сделано. Я использую Encog 3.1. Что-то не так с моим кодом?

BasicNetwork network = new BasicNetwork();
        network.addLayer(new BasicLayer(null,true,5625));
        network.addLayer(new BasicLayer(new ActivationSigmoid(),true,(intIdealCount+5625)/2));
        network.addLayer(new BasicLayer(new ActivationSigmoid(),true,intIdealCount));
        network.getStructure().finalizeStructure();

вот мои тренировочные коды:

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

        int epoch = 1;

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

Любой ответ будет оценен. Спасибо.


person Ray Lionfang    schedule 10.11.2013    source источник
comment
Я не знаком с этой библиотекой, но знаком с машинным обучением и его применением для обработки изображений. Это может занять много времени...   -  person Steve P.    schedule 10.11.2013
comment
Привет, извините за OT, но я начинаю с encog и у меня есть некоторые вещи, которые я не совсем понимаю. Могу я попросить вас уделить немного вашего времени помощи? Если да, проверьте мой вопрос: stackoverflow.com/questions/21847695/. Спасибо.   -  person user2886091    schedule 20.02.2014


Ответы (1)


Ваш код выглядит нормально, но обучение может занять произвольное время в зависимости от ваших данных. По размеру вашей сети можно сделать вывод, что вы работаете с изображениями - теперь, если у вас их много - даже самая эффективная реализация займет вечность. Encog — неплохая часть кода — она по умолчанию работает на всех доступных ядрах, но FANN пока кажется самой быстрой библиотекой для ANN.

У вас есть ~ 5000 входных нейронов, при условии, что у вас есть ~ 10 выходных нейронов, у вас есть ~ 2500 скрытых. Таким образом, ваша сеть имеет (5000+1)*2500 + (2500+1)*10 весов (около 12 500 000). Теперь, предположим, что у вас есть N изображений в вашем обучающем наборе - одна эпоха требует вычисления (и обновления) 12 500 000 * N значений. Таким образом, даже если у вас есть всего около 200 изображений, для вычисления потребуется 2 500 000 000 обновлений.

Есть как минимум три возможных пути:

  • Попробуйте библиотеку FANN, одну из самых эффективных.
  • Уменьшите размерность ваших изображений с помощью например PCA (и как следствие - уменьшите размер сети)
  • Вы уверены, что вам нужно 2500 скрытых узлов? это довольно много
person lejlot    schedule 10.11.2013
comment
сколько скрытых слоев вы предлагаете? Я работаю над диагностикой кожных заболеваний с помощью распознавания изображений. - person Ray Lionfang; 10.11.2013
comment
Я предлагаю как можно меньше. Большее количество означает не только более длительные вычисления, но и более вероятное переоснащение. Просто начните с небольшого и при необходимости увеличьте его размер, а не наоборот. - person lejlot; 11.11.2013
comment
Я никогда раньше не использовал Encog, но это не полная картина. Хотя цифра большая - всего 2,5 гигафлопса. (Не модное) ядро ​​​​2 Q6600 может выполнять 38 GigaFLOP в секунду. Даже если предположить, что Java будет медленнее, чем C/C++ для необработанной пропускной способности, должно быть возможно завершить 1 эпоху за разумное время. - person Raff.Edward; 11.11.2013
comment
теперь я получаю лучшую скорость итерации... около 3 итераций в течение пяти минут... Теперь я хочу спросить, можно ли использовать необработанное значение rgb с одним целым числом для входного нейрона распознавания изображений, чтобы я мог сэкономить место в памяти или я должен использовать значения красного, зеленого и синего как три отдельных нейрона? - person Ray Lionfang; 11.11.2013
comment
Вам следует применять их отдельно или рассмотреть возможность использования значений оттенков серого. Помните также о правильной нормализации/масштабировании данных. - person lejlot; 11.11.2013
comment
+1 для ФАНН. Это новый для меня, и, похоже, я могу использовать его функции. Спасибо! - person KathyA.; 26.09.2014