Вопрос

По вашему опыту, какой подход к реализации прототипов искусственных нейронных сетей является наиболее эффективным?Вокруг много шумихи р (бесплатно, но я с ним не работал) или Matlab (не бесплатно), другой возможный вариант — использовать такой язык, как C++/Java/C#.Вопрос в основном ориентирован на людей, которые пытались протестировать некоторые архитектуры нейронных сетей или алгоритмы обучения.

Если вы решили использовать язык программирования, отличный от трех упомянутых выше, можете ли вы назвать мне их названия и некоторые пояснения по поводу вашего выбора (за исключением:это единственный/наиболее используемый язык, известный мне).

Спасибо.

Это было полезно?

Решение

Поскольку нейронные сети широко используются учеными, а не программистами, выбирайте язык программирования, ориентированный на ученых и предоставляющий хорошие библиотеки для нейронных сетей.

Python — разумный выбор, поскольку он широко используется учёными.Два дистрибутива для начала:

http://www.pythonxy.com/

http://code.en Thought.com/

Эти дистрибутивы Python включают множество дополнительных модулей, которых нет в стандартной библиотеке Python, но которые очень полезны для того типа программирования, которым занимаются ученые.При поиске по индексу пакетов Python можно найти несколько пакетов нейронных сетей, которые могут подойти, если вы только изучаете нейронные сети.

http://pypi.python.org/pypi?:action=search&term=neural&submit=search

Однако, если вы серьезно работаете с нейронными сетями, вам понадобится что-то вроде библиотеки Fast Neural Network.Он поставляется с привязками Python, так что вы можете программировать на Python, использовать широкий спектр модулей Python для построения графиков, визуализации, манипулирования данными и т. д.Но ваши нейронные сети будут работать с использованием оптимизированного скомпилированного кода из библиотеки FANN.Лучшее из обоих миров.

Другими словами, для запуска реального кода нейронной сети вам нужен C, а не Java.Поскольку библиотеки C не очень хорошо интегрируются с Java, выберите язык, который плавно интегрируется с библиотеками C.Python делает это, и к тому же он гораздо более продуктивен, чем Java, поскольку для объяснения ваших алгоритмов требуется гораздо меньше строк кода.Некоторые люди обнаружили 10-кратное увеличение производительности по сравнению с Java.

Вы упомянули R, возможно, потому, что у него есть статистические функции, которые вам нужно будет использовать, или, возможно, у вас есть люди, которые могут писать код R.Опять же, выбор Python вместо R не является решением «или-или».Вы можете использовать оба.

Библиотека RPY позволяет программам Python получать доступ к библиотекам и коду R.Используя это, вы будете писать свои основные программы на Python и рассматривать R как инструмент для предоставления библиотек точно так же, как вы используете библиотеку FANN, написанную на C.

http://rpy.sourceforge.net/

Существует еще один модуль под названием RSPython, который работает в обоих направлениях, поэтому программы R могут получать доступ к библиотекам, написанным на Python.Это было бы полезно, если бы вам помогал опытный программист R.

http://www.omegahat.org/RSPython/

И это еще не все.Вы можете использовать Python для упрощения программирования на Java.Если у вас есть механизм нейронной сети Java, вы все равно можете написать большую часть своей программы на Python, используя версию Jython, которая работает на виртуальной машине Java и позволяет использовать в коде любые библиотеки и классы Java.И вы по-прежнему можете использовать быструю библиотеку FANN, поскольку она предоставляет привязки для программ Java.

Основная причина, по которой я рекомендую Python для вашей работы, заключается в том, что его использует очень много ученых, поэтому существует два доступных для науки дистрибутива.Вторая причина заключается в том, что начинающим программистам очень легко начать работу с Python, и при изучении нейронных сетей вы, вероятно, начнете с более простых симуляций и перейдете к более сложным, требующим большего количества манипуляций с данными и анализа результатов.Python позволит вам создать собственную библиотеку кода и стать опытным программистом Python, чтобы вы могли сосредоточить больше внимания на проблемах нейронных сетей.Если вы освоите немного Java, немного C++ и немного R, то вы сможете тратить меньше времени на нейронные сети.Эта стратегия может быть хороша для тех, кто хочет сделать карьеру в программировании, но не для тех, кто хочет добиться значительных результатов с помощью нейронных сетей.

Даже если ваша работа с нейронной сетью распространяется на специализированное оборудование, так называемые нейроморфные чипы, вы все равно можете использовать Python, как показано в этой статье НИЗ:

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2701676/

Другие советы

Я пробовал использовать как языки более высокого уровня абстракции (matlab, java), так и более низкие (C).Я использую наборы инструментов и библиотеки и сам их кодирую.Общий ответ?Ни один из них не является идеальным инструментом.Пожалуйста, имейте в виду, что:

  • прототипа может быть недостаточно:часто вам нужно запустить сеть на больших выборках или несколько раз на подмножестве выборок (в случае развития нейронных сетей), чтобы получить достойные результаты.Если вам приходится запускать сеть миллион раз, даже небольшой прирост производительности может оказаться огромной помощью и сэкономить время (т.C поверх Matlab);

  • если, с другой стороны, вам нужна простота кодирования, вы можете использовать одну из многих предварительно упакованных библиотек (javaNN и т. д.);

  • какую нейронную сеть вы используете?повторяющиеся нейронные сети непрерывного времени (CTRNN)?Бэкпроп?Как вы их тренируете?Как вы проверяете их результаты?Важна ли точность?(т.е.вы запускаете их на небольшом устройстве, таком как роботизированная плата управления с ограниченным объемом памяти, например Arduino?)

Если у вас есть свободное время, я бы посоветовал

  1. сначала изучите концепции, используя язык более высокого уровня или даже псевдокод;
  2. как только вы освоитесь со всеми тонкостями, особенно если вы используете развивающиеся нейронные сети, выберите язык, с которым они уже знакомы.
  3. тогда вы, возможно, захотите начать исследовать, как оптимизировать скорость, объем памяти и т. д.

Надеюсь это поможет.

Я в некоторой степени использовал набор инструментов для нейронных сетей Matlab, и мне он понравился как инструмент для прототипирования благодаря его графическому интерфейсу, который позволяет вам настраивать сеть, экспериментировать с размерами обучающих и тестовых входных данных, а также тестирование после обучения. встроенный.Казалось бы, начать было приятно и естественно...

Я также экспериментировал с Джун (Объектно-ориентированный нейронный движок Java).Он настроен довольно хорошо, и в то время я был немного любителем, и у меня все еще не было проблем с запуском и запуском различных сетей с тестированием.Это Java, поэтому он может не обладать той производительностью, которая вам могла бы понадобиться при обучении больших сложных систем, но его API был чрезвычайно доступным.

Я также видел некоторые работы, выполненные с Наводнение в С++.В нем есть несколько классов, объединенных в сети, которые подходят для решения ряда задач.Это стоит проверить.

Я также очень рекомендую Python.В качестве прототипа отличным выбором будет Python:на нем проще и быстрее программировать, доступно огромное количество библиотек, и он широко используется в научном сообществе.

Кроме того, если вы используете Python, вы также можете воспользоваться отличным PyBrain пакет, который содержит алгоритмы для нейронных сетей, обучения с подкреплением, обучения без учителя и других задач машинного обучения, которые должны помочь вам быстро создать прототип.

Это зависит от вашей текущей настройки.Когда я работал над ними еще в студенческие годы, мне приходилось использовать C++ + MPI+числовые рецепты.Это было сделано потому, что мне нужно было загрузить общий ресурс на большой кластер Beowulf.

Если ваши потребности в вычислениях невелики, подойдет что угодно.Предварительно упакованные библиотеки доступны на всех платформах (R, Python(numPy, scipy), C/C++(Числовые рецепты) и т. д.).Если вы умеете программировать на любом из них, это не должно иметь большого значения.

Если бы мне пришлось создавать прототип чего-либо сейчас, я бы, вероятно, выбрал Python (просто потому, что мне гораздо проще создавать прототипы).

Сцилаб является альтернативой Matlab с открытым исходным кодом.

Вы можете экспериментировать с нейронными сетями, используя ANN Toolbox для Scilab.

Сосредоточьтесь на теории и экспериментах.Выбирали ли вы дискриминантные признаки для своих образцов?Каково состояние ваших обучающих и тестовых наборов?Для каждого эксперимента изучите матрицу путаницы.Есть ли у вас идеи, почему образец неправильно классифицирован?Вам это кажется логичным?Если нет, то какая функция, которой вы не пользуетесь, могла бы помочь?

Дальше идет реализация, используйте язык, который вам знаком.Управляемый язык, такой как Java или C#, вероятно, будет менее подвержен ошибкам:по крайней мере, у вас меньше шансов что-то испортить из-за ошибок указателя или распределения памяти.Оптимизация идет последней (как всегда, после приличного профилирования).

«Encog — это продвинутая среда нейронных сетей и машинного обучения.Encog содержит классы для создания самых разных сетей, а также классы поддержки для нормализации и обработки данных для этих нейронных сетей.Encog обучает, используя многопоточное устойчивое распространение.Encog также может использовать графический процессор для дальнейшего ускорения времени обработки.Также предоставляется рабочая среда на основе графического пользовательского интерфейса, помогающая моделировать и обучать нейронные сети.Encog находится в активной разработке с 2008 года».

Encog доступен для Java, C#.Net и Silverlight.

http://www.heatonresearch.com/encog

На уроках в школе мы использовали Matlab, а затем для своей диссертации я использовал Java.

Я бы предложил Java или Matlab.Matlab, потому что в нем, вероятно, уже есть многое из того, что вам может понадобиться.И Java, потому что он позволяет быстро реализовать то, чего может не хватать в проектах с открытым исходным кодом.Кроме того, помимо реализации нейронных сетей вам может понадобиться какой-то способ их визуализации.И для этого я лично считаю, что Java или Matlab довольно просты.

Мне нравится наводнение.Он бесплатный, всеобъемлющий и написан на C++.

Реализации в Matlab сложны и полны.Я обнаружил, что этого достаточно для оценки различных типов сетей.Он также легко программируется с использованием внешних интерфейсов.

Однако, поскольку реализации алгоритмов не имеют открытого исходного кода, иногда бывает сложнее переместить определенный фрагмент кода в приложение за пределами Matlab, поскольку мои написанные вручную реализации разных типов нейронных сетей давали разные результаты.

Я начал писать реализацию NN, используя C++, и обнаружил, что вначале недостаточно разбирался в математике.В конечном итоге произошло то, что мне было слишком сложно реорганизовать код, пока я настраивал модель вычислений.

В конце концов я отдался MATLAB, поскольку он определенно был лучшим помощником в изучении работы нейронных сетей.Мне удалось внести огромные изменения в алгоритм, используя несколько нажатий клавиш, а также составить график результатов.

Возможно, мой опыт был бы лучше, если бы я использовал уже созданную структуру матричных вычислений.Учитывая, как вы работаете с 3D, должно быть несколько действительно оптимизированных библиотек для большинства языков.Черт возьми, вы могли бы также использовать для этого Direct3D или OpenGL, но я уверен, что есть что-то более подходящее для нейронных сетей.

Думаю, я не предоставляю много информации о том, что вам следует делать.Однако я могу сказать, чего вам не следует делать — это попытка самостоятельно написать код манипуляции с матрицей.

Возможно, вы захотите дать Века взгляд.В нем есть несколько встроенных инструментов для таких вещей, как визуализация данных, и он существует уже много лет (несколько скриншотов).

На мой взгляд, при работе с нейронными сетями ключом к успеху является получение правильного обучающего набора, а не столько реализация самой сети в коде.Я бы выбрал язык в зависимости от типа проблемы, которую вы пытаетесь решить с помощью сети.Для самой сети жизнеспособны C++, C#, Python и Java.

Используете ли вы это в связи с проблемой, требующей обработки изображений?В этом случае вам, вероятно, понадобится что-то, что легко подключается к библиотеке обработки изображений, такой как OpenCV.Или там какая-то обработка звука?

Возможно, вам потребуется легко визуализировать обучающие наборы. Насколько легко это будет сделать с выбранным языком?Можете ли вы работать с библиотеками OpenGL или DirectX напрямую или с помощью какой-либо оболочки?Для DirectX доступны C++ и C#.Скажет ли более высокий уровень абстракции использование WPF?

Я использовал C#, потому что знаком с ним и могу использовать многочисленные технологии обработки данных в .net, а также использовать wpf для любых необходимых визуализаций.

Возможно, вы также захотите дать Нэн попробовать - это бесплатно, легко использовать и очень легкий.Это также превосходит LIBSVM в готовом сравнении на многих популярных наборах данных регрессии и классификации.

Обычно, когда я возился с такими алгоритмами, я обнаруживал, что использование открытого исходного кода Набор инструментов Weka был отличным способом создать прототип и открыть для себя целый ряд различных алгоритмов обучения (не только искусственных нейронных сетей).Сегодня кажется, что у них есть привязки к множеству разных языков, поэтому вам не следует привязываться к Java, если вы хотите взаимодействовать с Weka на уровне кода.

Как только я нашел и понял что-то крутое/выполнил довольно хорошую работу по классификации, я написал алгоритм на C или C++ частично для развлечения, а частично для того, чтобы получить необходимый прирост скорости, необходимый для работы с большими наборами данных.

Используйте C++, и если ваша нейронная сеть достаточно проста, не используйте странные фреймворки.

Возможно, 5 лет назад я сделал решатель Сокобан, используя обучение с подкреплением.В то время мы решили использовать Java и использовать некую платформу агентов, разработанную итальянским университетом.

Первым плохим решением было использовать этот Framework.По сути, здесь и там были ошибки, из-за которых мы тратили массу времени на отладку кода фреймворка.

Как только мы дошли до того, что все стало стабильно, обучение нейронной сети стало просто невероятно медленным.Мы оставили его включенным на ночь на довольно мощной машине, и тем не менее он решил очень мало головоломок.По сути, распределение объектов Java и сбор мусора серьезно ухудшали всю производительность системы.Мы немного подправили приложение, создав пулы объектов вместо постоянного их выделения, но производительность программы все равно была на порядок ниже, чем при аналогичном присваивании, которое было реализовано на C++ напрямую с использованием сокетов.

Надеюсь это поможет!

Что ж, если вам нравится быстро создавать прототипы, то лучше всего подойдут Python или Matlab.Для нейронных сетей доступно множество библиотек.Некоторые библиотеки спроектированы таким образом, что дают вам минимальные возможности настройки, но такие библиотеки, как Theano, чрезвычайно быстры, поскольку функции внутренне компилируются на C (я думаю, это самый быстрый на сегодняшний день вариант) и предоставляют вам полную функциональность внутренних настройка.Теано обычно используется поначалу, но он чрезвычайно мощный.А позже, если вы захотите перейти от нейронной системы к глубокой нейронной системе, тогда особой разницы не будет.Профессиональные кагглеры также склонны использовать эту библиотеку.Эта библиотека также имеет поддержку графического процессора.Из всех библиотек, которые я использовал, theano оказалась самой полезной и мощной.Некоторые из других современных фреймворков для глубокого обучения, такие как Caffe, разработаны на theano.

Надеюсь это поможет.

Я реализовал несколько прототипов нейронных сетей на Java и C/C++.Когда производительность имеет значение, используйте C/C++.

Одна из моих реализаций (не векторизованная) базового многослойного перцептрона выполняет миллион обучающих итераций (с настройкой из 2 входных, 4 скрытых и 1 выходного узла) менее чем за минуту.Моя почти идентичная реализация на Java требует для этого огромного количества времени.Вы также можете использовать библиотеку линейной алгебры, например Eigen, для создания векторизованной версии и повышения скорости обработки.

Представьте, что вы будете использовать свой для любого вида обработки изображений (распознавание лиц, оптическое распознавание символов и т. д.), например, с изображениями размером 28x28 пикселей.У вас будет 784 входных единицы и как минимум столько же скрытых единиц.Обучение занимает огромное количество времени, поэтому полезно сэкономить драгоценные минуты, часы или дни.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top