2012-07-25 15 views
6

¿Hay una buena manera de agregar/eliminar una neurona y sus conexiones asociadas en/desde una red PyBrain completamente conectada? Digamos que empezar con:PyBrain neuron manipulation

from pybrain.tools.shortcuts import buildNetwork 
net = buildNetwork(2,3,1) 

¿cómo iba a ir sobre lo que es una (2,4,1) o una (2,2,1) de la red mientras que mantiene todos los viejos pesos (e inicializar ninguno nuevo a ser al azar como se hace al inicializar la red)? La razón por la que quiero hacer esto es porque estoy intentando usar una estrategia de aprendizaje evolutivo para determinar la mejor arquitectura y el paso de "mutación" implica agregar/eliminar nodos con alguna probabilidad. (Los módulos de entrada y salida siempre deben permanecer igual.)

editar: Encontré NeuronDecomposableNetwork que debería facilitar esto, pero todavía parece que tengo que hacer un seguimiento de las neuronas y las conexiones por separado.

Respuesta

4

Supongo que está siguiendo las pautas del algoritmo NEAT? Hay dos respuestas diferentes a la pregunta:

  1. de boca abierta evolución de la topología de la red: en este caso, recomiendo que encapsula todas las neuronas en su propia "capa"/módulo, y añadir/eliminar ellas y sus conexiones a la red de forma iterativa, un poco como en this tutorial, excepto que habrá muchas más capas (de una sola neurona). No olvide llamar al método sortModules() después de cada cambio topológico.

  2. Encontrar la mejor topología dentro de un marco predefinido (digamos un máximo de 1000 neuronas). En ese caso, es más fácil y más eficiente construir la red completa al principio, y solo máscara algunas de las conexiones (por ejemplo, usando el módulo MaskedParameters). Entre otros, memetic algorithms(used like this) están diseñados para buscar tales espacios de topología.

Una alternativa, como usted dice, es la gestión de forma manual todos los pesos (mediante el seguimiento de what is where, o el uso de NeuronDecomposableNetwork) pero yo no lo recomiendo eso.


Una observación general: para usos más avanzados de pybrain como la suya, basándose en el acceso directo `buildNetwork' es realmente muy limitada, y que tendrá que usar el módulo API de red// conexión directa.

+0

Impresionante, esto me ayuda muchísimo, ¡gracias! Realmente me gusta la primera idea. Nunca habría pensado en usar capas como neuronas individuales. Y sí, después de intentarlo durante unos tres días, no recomendaría la administración manual tampoco lol (la otra publicación de stackoverflow fue de hecho de la que surgió la idea). Regresaré después de experimentar un poco (e investigar NEAT, ya que es el primero que descubrí al respecto, aunque sea casi exactamente lo que quería) y actualizar mi publicación con los resultados. – ubomb

Cuestiones relacionadas