neural-network - que - redes neuronales inteligencia artificial
Prototipos de redes neuronales. (18)
"Encog es una red neuronal avanzada y un marco de aprendizaje automático. Encog contiene clases para crear una amplia variedad de redes, así como clases de apoyo para normalizar y procesar datos para estas redes neuronales. Encog entrena utilizando la propagación elástica multihebra. Encog también puede hacer uso de una GPU para acelerar aún más el tiempo de procesamiento. También se proporciona un banco de trabajo basado en GUI para ayudar a modelar y entrenar redes neuronales. Encog ha estado en desarrollo activo desde 2008. "
Encog está disponible para Java, C # .Net y Silverlight.
a partir de su experiencia, ¿cuál es el enfoque más eficaz para implementar prototipos de redes neuronales artificiales? Es un gran despliegue publicitario sobre R (gratis, pero no trabajé con él) o Matlab (no es gratis), otra opción posible es usar un lenguaje como C ++ / Java / C #. La pregunta está dirigida principalmente a las personas que intentaron probar algunas arquitecturas de redes neuronales o algoritmos de aprendizaje.
Si su elección es usar un lenguaje de programación diferente de los tres mencionados anteriormente, ¿puede decirme sus nombres y algunas explicaciones sobre su elección (excepto que este es el único idioma más utilizado que conozco)?
Gracias.
Bueno, si te gusta hacer un prototipo rápido, entonces python o matlab parece el mejor. Hay muchas bibliotecas disponibles para redes neuronales. Algunas de las bibliotecas están diseñadas de tal manera que le brindan una cantidad mínima de ajustes, pero las bibliotecas como Theano son extremadamente rápidas, ya que la función se compila internamente en C (supongo que es la más rápida hasta la fecha) y le brinda una funcionalidad completa de interna. retocando Theano es típico de usar al principio pero es extremadamente poderoso. Y luego, si desea pasar de lo neuronal a lo neuronal profundo, entonces no hay mucha diferencia. Los Kagglers profesionales también tienden a usar esta biblioteca. Esta biblioteca también tiene soporte GPU. De todas las bibliotecas que he usado, encontré que theano es la más útil y poderosa. Algunos de los otros marcos avanzados para el aprendizaje profundo, como Caffe, se desarrollan en theano.
Espero que esto ayude.
Comencé a escribir una implementación de NN utilizando C ++ y descubrí que no sabía lo suficiente sobre las matemáticas involucradas al principio. Lo que terminó ocurriendo fue que era demasiado difícil refactorizar el código ya que estaba modificando el modelo de cálculo.
Eventualmente me entregué a MATLAB porque definitivamente fue un mejor compañero para aprender cómo funcionan las redes neuronales. Pude hacer grandes cambios en el algoritmo con unos pocos golpes de tecla y graficar los resultados también.
Quizás mi experiencia hubiera sido mejor si hubiera utilizado un marco de cálculo de matriz ya construido. Teniendo en cuenta que así es como se hace en 3D, debería haber algunas bibliotecas realmente optimizadas para la mayoría de los idiomas. Demonios, también podrías aprovechar Direct3D o OpenGL para eso, pero estoy seguro de que hay algo más adecuado para redes neuronales.
Supongo que no estoy proporcionando mucha información sobre lo que debe hacer. Sin embargo, puedo decir lo que no debes hacer, y eso es tratar de escribir tú mismo el código de manipulación de matrices.
Dado que las redes neuronales son muy utilizadas por los científicos, y no tanto por los programadores, elija un lenguaje de programación que se centre en los científicos y proporcione buenas bibliotecas para las redes neuronales.
Python es una opción razonable ya que es ampliamente utilizado por los científicos. Dos distribuciones para empezar son
Estas distribuciones de Python incluyen una gran cantidad de módulos adicionales que no están en la biblioteca estándar de Python pero que son muy útiles para el tipo de programación que hacen los científicos. Al buscar en el índice de paquetes de Python se presentan algunos paquetes de redes neuronales que pueden estar bien si está aprendiendo sobre redes neuronales.
http://pypi.python.org/pypi?:action=search&term=neural&submit=search
Sin embargo, si está realizando un trabajo serio con Neural Networks, querrá algo como la biblioteca Fast Neural Network. Esto viene con los enlaces de Python para que pueda realizar su programación en Python, usar la amplia variedad de módulos de Python para gráficos, visualización, manipulación de datos, etc. Sin embargo, sus redes neuronales se ejecutarán utilizando el código compilado optimizado de la biblioteca FANN. Lo mejor de ambos mundos.
En otras palabras, para ejecutar el código de red neuronal real, necesita C, no Java. Como las bibliotecas de C no se integran tan bien con Java, elija un lenguaje que se integre sin problemas con las bibliotecas de C. Python hace eso y también es bastante más productivo que Java, ya que se requieren muchas menos líneas de código para explicar sus algoritmos. Algunas personas han encontrado un aumento de 10 veces en la productividad sobre Java.
Mencionó R, tal vez porque tiene funciones estadísticas que debería usar, o quizás tenga personas disponibles que pueden escribir el código R. Una vez más, elegir Python contra R no es una decisión de uno u otro. Puedes usar ambos.
La biblioteca RPY permite que los programas de Python accedan a bibliotecas y código R. Usando esto, escribiría sus programas principales en Python y trataría a R como una herramienta para proporcionar bibliotecas, de la misma manera que hace uso de la biblioteca FANN que fue escrita en C.
Hay otro módulo llamado RSPython que funciona en ambos sentidos, para que los programas R puedan acceder a las bibliotecas escritas en Python. Esto sería útil si tienes un programador experto en R que te ayude.
http://www.omegahat.org/RSPython/
Y eso no es todo. Puede aprovechar Python para simplificar la programación de Java. Si tiene un motor de red neuronal de Java, aún puede escribir la mayoría de su programa en Python usando la versión Jython que se ejecuta en la máquina virtual Java y le permite usar cualquier biblioteca y clase de Java en su código. Y aún puede utilizar la biblioteca rápida de FANN, ya que proporcionan enlaces para programas Java.
La razón principal por la que recomiendo Python para su trabajo es que es utilizado por una gran cantidad de científicos, por lo que hay dos distribuciones orientadas a la ciencia disponibles. Una segunda razón es que Python es muy fácil de comenzar para los programadores novatos y, al explorar redes neuronales, es probable que comience con simulaciones más simples y trabaje con otras más complejas con más manipulación de datos y análisis de resultados. Python te permitirá crear tu propia biblioteca de códigos y convertirte en un experto programador de Python para que puedas centrar más tu atención en los problemas de la red neuronal. Si rebotas con un poco de Java, un poco de C ++ y un poco de R, entonces podrás pasar menos tiempo en redes neuronales. Esa estrategia puede ser buena para alguien que quiere una carrera en programación, pero no para alguien que quiere lograr algunos resultados significativos con redes neuronales.
Incluso si su trabajo de red neuronal se extiende a un hardware especializado, los llamados chips neuromórficos, aún puede aprovechar Python como lo demuestra este documento de los NIH:
Desde mi punto de vista, al trabajar con redes neuronales, la clave está en establecer correctamente el entrenamiento, no tanto en cómo se actualiza la red en sí misma en código. Elegiría un idioma en función del tipo de problema que intenta resolver utilizando la red. Para la propia red c ++, c #, python y java son todos viables.
¿Está utilizando esto en relación con un problema que requiere el procesamiento de imágenes? En cuyo caso, probablemente querrá algo que se enganche fácilmente a una biblioteca de procesamiento de imágenes como OpenCV. ¿O hay algún procesamiento de audio involucrado?
Es posible que tenga que visualizar fácilmente los conjuntos de entrenamiento, ¿qué tan fácil sería esto con el idioma de su elección? ¿Puede trabajar con bibliotecas OpenGL o DirectX directamente o usando algún tipo de envoltorio? Para DirectX las opciones son C ++ y C #. ¿Habrá un nivel más alto de abstracción que diga que usar WPF funciona?
He usado C # porque estoy familiarizado con él y puedo aprovechar las numerosas tecnologías de manejo de datos en .net y usar wpf para cualquier visualización necesaria.
En mis clases de nn en la escuela usamos matlab y luego usé java para mi tesis.
Sugeriría Java o Matlab. Matlab porque probablemente ya tiene mucho de lo que podrías necesitar. Y java porque es rápido para implementar lo que podría faltar en proyectos de código abierto. Y puesto que además de implementar las redes neuronales, es posible que necesite alguna forma de visualizarlas. Y para eso personalmente creo que Java o Matlab es bastante fácil.
Es posible que desee echar un vistazo a Weka . Tiene algunas herramientas integradas para cosas como la visualización de datos, y ha existido durante años ( algunas capturas de pantalla ).
Esto depende de su configuración actual. Cuando solía trabajar con ellos en la universidad, tenía que usar las recetas numéricas de C ++ + MPI +. Esto se hizo porque tuve que cargar el recurso compartido en el gran clúster de beowulf.
Si sus necesidades de cálculo no son grandes, cualquier cosa haría. Las bibliotecas preempaquetadas están disponibles en todas las plataformas (R, Python (numPy, scipy), C / C ++ (recetas numéricas), etc.). Si te sientes cómodo programando en cualquiera de ellos, no debería ser un gran problema.
Si tuviera que hacer prototipos de algo ahora, probablemente iría con Python (solo porque me parece mucho más fácil para crear prototipos)
He implementado varios prototipos de redes neuronales en Java y C / C ++. Cuando el rendimiento importa, usar con C / C ++.
Una de mis implementaciones (no vectorizadas) de un Perceptrón multicapa básico hace un millón de iteraciones de entrenamiento (con una configuración de 2 entradas, 4 ocultas y 1 salida de nodo) en menos de un minuto. Mi implementación casi idéntica en Java toma una gran cantidad de tiempo para hacer esto. También puede usar una biblioteca de álgebra lineal como Eigen para crear una versión vectorizada para mejorar la velocidad de procesamiento.
Imagina que utilizarías el tuyo para cualquier tipo de procesamiento de imágenes (reconocimiento facial, OCR, etc.) con, por ejemplo, imágenes de 28x28 píxeles. Tendrías 784 unidades de entrada y al menos tantas unidades ocultas. Esto requiere mucho tiempo para entrenarse, por lo que es beneficioso ahorrar preciosos minutos, horas o días.
He utilizado en cierta medida la caja de herramientas de redes neuronales de Matlab, y la he disfrutado como una herramienta de creación de prototipos debido a su interfaz gráfica que le permite configurar la red, experimentar con el tamaño de la capacitación frente a los datos de entrada de prueba y sus pruebas posteriores a la capacitación. incorporado. Parecía agradable y natural comenzar con ...
También experimenté con Joone (motor neural orientado a objetos Java). Está bastante bien configurado, y en ese momento yo era un poco aficionado y todavía no tenía problemas para poner en funcionamiento varias redes, con pruebas. Es Java, por lo que es posible que no tenga el rendimiento que podría desear si está entrenando grandes sistemas complejos, pero su API era extremadamente accesible.
También he visto algunos trabajos realizados con Flood en C ++. Tiene un montón de clases configuradas con redes que son apropiadas para resolver una variedad de problemas. Vale la pena echarle un vistazo.
Intenté usar tanto lenguajes de nivel de abstracción superior (matlab, java) como inferiores (C). Tanto usando cajas de herramientas como bibliotecas y codificándolos yo mismo. La respuesta general? Tampoco es la herramienta perfecta. Por favor, tenga en cuenta que:
un prototipo puede no ser suficiente: a menudo es necesario ejecutar la red en muestras grandes, o varias veces en un subconjunto de muestras (en caso de redes neuronales en evolución) para obtener resultados decentes. Si tiene que ejecutar una red un millón de veces, incluso una pequeña ganancia de rendimiento podría ser una gran ayuda y un ahorro de tiempo (es decir, C sobre matlab);
si, por otro lado, necesita facilidad para la codificación, es posible que desee utilizar una de las muchas bibliotecas preempaquetadas (javaNN, etc.);
¿Qué tipo de red neuronal estás usando? ¿Redes neuronales recurrentes en tiempo continuo (CTRNN)? Backprop? ¿Cómo los entrenas? ¿Cómo verificas sus resultados? ¿Es importante la precisión? (es decir, ¿los está ejecutando en un dispositivo pequeño, como un tablero de control robótico con memoria limitada, como Arduinos?)
Si tienes tiempo de sobra, te sugiero
- aprenda los conceptos utilizando un lenguaje de nivel superior, o incluso pseudocódigo primero;
- Una vez que esté familiarizado con todas las complejidades, especialmente si utiliza redes neuronales en evolución, elija un idioma con el que ya estén familiarizados.
- entonces es posible que desee comenzar a investigar cómo optimizar la velocidad, la huella de memoria, etc.
Espero que esto ayude.
Las implementaciones en Matlab son sofisticadas y completas. He encontrado que es suficiente para evaluar diferentes tipos de redes. También es muy programable utilizando interfaces externas.
Sin embargo, dado que las implementaciones de los algoritmos no son de código abierto, a veces es más difícil cuando necesita mover una pieza particular de código a una aplicación fuera de Matlab, ya que las implementaciones codificadas a mano de diferentes tipos de redes neuronales produjeron resultados diferentes.
Me gusta la Flood . Es gratis, completo y escrito en C ++.
Por lo general, cuando estaba haciendo pequeños ajustes con este tipo de algoritmos, descubrí que el uso del Weka Toolkit de código abierto era una excelente forma de crear prototipos y descubrir un montón de diferentes algoritmos de aprendizaje (no solo redes neuronales artificiales). En estos días, parece que tienen enlaces de un montón de idiomas diferentes, por lo que no debería estar vinculado a Java si desea interactuar con Weka en el nivel de código.
Una vez que encontré y entendí algo que estaba bien / haciendo un trabajo de clasificación bastante bueno, escribí el algoritmo en C o C ++ en parte por diversión y en parte para obtener las ganancias de velocidad necesarias para trabajar con conjuntos de datos más grandes.
También es posible que desee probar Nen : es gratis, fácil de usar y muy liviano. También supera a LIBSVM en una comparación inmediata en muchos conjuntos de datos populares de Regresión y Clasificación.
También recomendaría altamente python. Para un prototipo, Python es una excelente opción: es más fácil y rápido de programar, hay una gran cantidad de bibliotecas disponibles y se usa ampliamente en la comunidad científica.
Además, si está usando python, también puede aprovechar el excelente paquete PyBrain que contiene algoritmos para redes neuronales, aprendizaje por refuerzo, aprendizaje no supervisado y otras tareas de aprendizaje automático, que le ayudarán a construir un prototipo rápidamente.
Use C ++ y si su red neuronal es lo suficientemente simple, no use marcos extraños.
Tal vez hace 5 años hice un solucionador de Sokoban usando Aprendizaje de Refuerzos. En ese momento decidimos ir con Java y usar un marco de agente desarrollado por una universidad italiana.
La primera mala decisión aquí fue usar este Marco. Básicamente tenía errores aquí y allá que nos hicieron perder mucho tiempo en la depuración del código del marco.
Una vez que llegamos al punto en que todo estaba estable, el entrenamiento de la Red Neural estaba muy lento. Lo dejamos funcionando durante la noche en una máquina bastante poderosa y aún así resolvió muy pocos rompecabezas. Básicamente, la asignación de objetos Java y la recolección de basura dañaron bastante el rendimiento general del sistema. Ajustamos un poco la aplicación creando grupos de objetos en lugar de asignarlos todo el tiempo, pero el rendimiento del programa era todavía un orden de magnitud menor que una asignación similar que se implementó en C ++ utilizando sockets directamente.
¡Espero que esto ayude!
Scilab es una alternativa de código abierto para Matlab.
Puede experimentar con redes neuronales utilizando la Caja de herramientas ANN para Scilab .
Centrarse en la teoría y los experimentos. ¿Escogiste características discriminantes para tus muestras? ¿Cuál es el estado de tu entrenamiento y pruebas? Para cada experimento, estudia la matriz de confusión. ¿Tienes una idea de por qué una muestra está mal clasificada? ¿Te parece lógico? Si no, ¿qué característica no usas te ayudaría?
La implementación viene después, usa el lenguaje con el que estás familiarizado. Es probable que un lenguaje administrado como Java o C # sea menos propenso a errores: al menos es menos probable que arruine las cosas debido a errores de asignación de memoria o puntero. La optimización viene al final (después de algunos perfiles decentes como siempre).