Прототипирование нейронных сетей

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

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

Спасибо.


person lmsasu    schedule 04.12.2009    source источник
comment
Я рекомендую свой блог post, в котором рассказывается, как реализовать базовые NN с R и ускоренными графическими процессорами. Надеюсь полезно.   -  person Patric    schedule 05.07.2016


Ответы (18)


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

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

http://www.pythonxy.com/

http://code.enthought.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.

https://rpy2.github.io/

Есть еще один модуль под названием 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, как показано в этой статье NIH:

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

person Michael Dillon    schedule 09.12.2009

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

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

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

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

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

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

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

person lorenzog    schedule 09.12.2009

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

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

Я также видел некоторые работы, выполненные с помощью Flood на C++. В нем есть куча классов, созданных с сетями, которые подходят для решения ряда проблем. Это стоит проверить.

person Fuzz    schedule 06.12.2009
comment
Я реализовал обычные полносвязные и сверточные сети с нуля в Matlab, чтобы полностью во всем разобраться и создать инструмент для прототипирования. Я обнаружил, что сохранение хорошего объектно-ориентированного дизайна, в котором объекты оборачивают векторизованный код, а затем прямая оценка и обратное распространение, достаточно хороши, поскольку это просто матричное умножение, которое Matlab оптимизировано для. - person rnoodle; 18.02.2017

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

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

person Zach B    schedule 11.12.2009

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

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

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

person Sridhar Iyer    schedule 10.12.2009

Scilab — это альтернатива Matlab с открытым исходным кодом.

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

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

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

person Gregory Pakosz    schedule 10.12.2009

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

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

http://www.heatonresearch.com/encog

person mtgrares    schedule 14.01.2011

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

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

person Alex    schedule 11.12.2009

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

person Davide    schedule 11.12.2009

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

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

person MattMcKnight    schedule 12.12.2009

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

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

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

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

person Igor Zevaka    schedule 12.12.2009

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

person Shaggy Frog    schedule 12.12.2009

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

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

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

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

person Andrew    schedule 12.12.2009

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

person Fluchtpunkt    schedule 28.02.2012

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

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

person Clinton    schedule 09.12.2009

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

Может быть, 5 лет назад я сделал решатель Sokoban, используя Reinforcement Learning. В то время мы решили перейти на Java и использовать некоторый Agent Framework, разработанный итальянским университетом.

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

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

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

person rui    schedule 10.12.2009

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

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

person iec2011007    schedule 19.03.2015

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

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

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

person Bastian    schedule 30.05.2016