2012-07-25 10 views
6

C'è un buon modo per aggiungere/rimuovere un neurone e le sue connessioni associate in/da una rete PyBrain completamente connessa? Dire che iniziare con:Manipolazione del neurone PyBrain

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

Come potrei fare per fare un (2,4,1) o un (2,2,1) della rete, pur mantenendo tutti i vecchi pesi (e l'inizializzazione eventuali nuovi per essere casuali come si fa quando si inizializza la rete)? La ragione per cui voglio farlo è perché sto tentando di utilizzare una strategia di apprendimento evolutivo per determinare la migliore architettura e il passaggio "mutazionale" comporta l'aggiunta/rimozione di nodi con una certa probabilità. (I moduli di ingresso e di uscita dovrebbero rimanere sempre gli stessi.)

modifica: Ho trovato NeuronDecomposableNetwork che dovrebbe semplificare questo processo, ma sembra comunque che debba tenere traccia dei neuroni e delle connessioni separatamente.

risposta

4

Suppongo che stiate facendo l'algoritmo NEAT? Ci sono due risposte diverse alla tua domanda:

  1. Open Ended evoluzione della topologia di rete: in questo caso, vi consiglio di incapsulare ogni neurone nel suo "layer"/modulo, e aggiungere/rimuovere loro e le loro connessioni alla rete in modo iterativo, un po 'come in this tutorial, tranne per il fatto che ci saranno molti altri livelli (single-neuron). Non dimenticare di chiamare il metodo sortModules() dopo ogni modifica topologica.

  2. Trovare la migliore topologia all'interno di un framework predefinito (ad esempio un massimo di 1000 neuroni). In tal caso è più facile e più efficiente costruire la rete completa all'inizio, e solo la maschera alcune delle connessioni (ad esempio utilizzando il modulo MaskedParameters). Tra gli altri, memetic algorithms(used like this) sono progettati per cercare tali spazi di topologia.

Un'alternativa, come dici tu, è la gestione manualmente tutti i pesi (tenendo traccia what is where, o utilizzando NeuronDecomposableNetwork), ma io non lo consiglio questo.


un commento generale: per gli usi più avanzati di pybrain come il vostro, basandosi sulla scorciatoia `buildNetwork' è davvero troppo limitato, e si vorrà utilizzare direttamente il/modulo/API connessione di rete.

+0

Impressionante, questo mi aiuta fuori un sacco, grazie! Mi piace molto la prima idea. Mai avrei pensato di usare i livelli come singoli neuroni. E sì, dopo aver provato per circa tre giorni ora non consiglierei la gestione manuale lol (l'altro post di StackOverflow era in realtà dove ho avuto l'idea). Tornerò dopo alcuni esperimenti (e ricercando NEAT poiché questo è il primo che ho scoperto a riguardo, pur essendo quasi esattamente quello che volevo arrivare) e aggiornare il mio post con i risultati. – ubomb