Справка с нейронной сетью Neuroph

Для моего исследования выпускника я создаю нейронную сеть, которая обучается для распознавания изображений. Я иду намного более сложный, чем просто взятие сетки значений RGB, субдискретизации, и и отправка их к входу сети, как много примеров делает. Я на самом деле использую более чем 100 независимо обученных нейронных сетей, которые обнаруживают функции, такие как строки, заштриховывая шаблоны, и т.д. Намного больше как человеческий глаз, и это работает действительно хорошо до сих пор! Проблема, у меня есть довольно мало обучающих данных. Я показываю ему более чем 100 примеров того, на что похож автомобиль. Затем 100 примеров того, на что похож человек. Затем более чем 100 из того, на что собака похожа и т.д. Это - довольно мало обучающих данных! В настоящее время я работаю приблизительно в одну неделю для обучения сети. Это - вид уничтожения моего успеха, поскольку я должен корректироваться и переобучиться.

Я использую Neuroph как нейронная сеть низкого уровня API. Я выполняю двойную четырехъядерную машину (16 ядер с гиперпоточностью), таким образом, это должно быть быстро. Мой процент процессора только в 5%. Есть ли на работе Neuroph какие-либо приемы? Или производительность Java в целом? Предложения? Я - познавательное, возбуждают докторанта, и я достоин как программист, но не знаю много о программировании производительности.

9
задан Jim Ferrans 8 June 2010 в 02:39
поделиться

3 ответа

Да, я пошел по этому пути несколько месяцев назад. Тоже для университетского проекта. Первая проблема - Neuroph. Он смертельно медленный. Neuroph имеет хорошо известные основные архитектурные проблемы и проблемы с производительностью, на прошлой неделе была статья об этом на code project.

http://www.codeproject.com/KB/recipes/benchmark-neuroph-encog.aspx

Я пошел по тому же пути, что и автор этой статьи. Переход с Neuroph на Encog - это действительно простой перенос. У автора вышеупомянутой статьи даже есть другая, в которой сравнивается синтаксис Encog, JOONE и Neuroph, так что вы можете сравнить их. Дополнительная информация о Encog:

http://www.heatonresearch.com/encog

Encog также использует больше преимуществ ваших ядер. Просто посмотрите на график в статье выше.

Удачи! Ваше исследование звучит действительно потрясающе, я бы хотел увидеть результаты.

12
ответ дан 4 December 2019 в 11:40
поделиться

Также обратите внимание на свой метод тренировок. Мультиядер помогает работать БЫСТРЕЕ. Работать умнее тоже хорошо. Если вы просто используете обратное распространение, вам понадобится много времени, чтобы сойтись. Как минимум используйте что-то вроде устойчивого распространения, я думаю, это может быть в Neuroph. Или посмотрите на Scaled Conjugate Gradient или Levenberg Marquardt. Encog делает и то, и другое. Encog также может использовать ваш графический процессор, чтобы еще больше ускорить работу с помощью OpenCL.

Ускорение итераций - это хорошо. Но делать БОЛЬШЕ с итерацией обучения часто даже лучше. И делать ОБЕИХ лучше всего.

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

Также я согласен, ваше исследование звучит очень интересно.

4
ответ дан 4 December 2019 в 11:40
поделиться

Вы обучаетесь с помощью графического интерфейса или Java-кода и какую версию Neuroph вы используете? Если вы используете GUI, возьмите последнюю обновленную версию 2.4u1 (только что выложил ее), в ней есть некоторые улучшения производительности. Также какой алгоритм обучения вы используете, и какие настройки? Вы можете попробовать DynamicBackpropagation. Ваш проект звучит очень интересно, и мне очень жаль, что у вас возникли проблемы с Neuroph. Мы не знали, что производительность Neuroph настолько низка по сравнению с другими, до этих бенчмарков, и мы обязательно улучшим это в будущем.

Как предложил Джефф (спасибо Джеффу), если ваши сети независимы, вы можете сделать что-то вроде этого:

for(int index = 0; index < numberThreads ; index++ ) {    
    MultiLayerPerceptron mlp = new MultiLayerPerceptron(inputSize, hiddenLayerSize,outputSize);      
    SupervisedLearning learningRule = (SupervisedLearning)mlp.getLearningRule(); 
    learningRule.setMaxError(maxError); 
    learningRule.setMaxIterations(maxIterations); // make sure we can end. 
    learningRule.addObserver(this); // user observer to tell when individual networks are done and launch new networks. 
    this.mlpVector.add(mlp);
    mlp.learnInNewThread(trainingSet);
} 

Также, поскольку у вас так много сетей, параметры обучения могут быть критичными, поэтому вы можете использовать Neuroph trainer, чтобы определить правильные настройки. Он еще не закончен, но в основном он генерирует все возможные комбинации параметров обучения и пробует одну за другой. Надеюсь, это поможет вам, также если у вас есть еще вопросы или вам нужна помощь с чем-то, не стесняйтесь спрашивать.

3
ответ дан 4 December 2019 в 11:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: