2012-07-25 6 views
6

Gibt es eine gute Möglichkeit, ein Neuron und die zugehörigen Verbindungen in/aus einem vollständig verbundenen PyBrain-Netzwerk hinzuzufügen/zu entfernen? Sagen, dass ich mit Start:PyBrain-Neuronenmanipulation

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

Wie würde ich über so dass es eine (2,4,1) oder (2,2,1) Netz gehen, während alle alten Gewichte beibehalten (und Initialisierung keine neuen zu zufällig sein, wie es bei der Initialisierung des Netzwerks getan wird)? Der Grund dafür ist, dass ich versuche, eine evolutionäre Lernstrategie zu verwenden, um die beste Architektur zu bestimmen, und der Schritt "Mutation" beinhaltet das Hinzufügen/Entfernen von Knoten mit einer gewissen Wahrscheinlichkeit. (Die Eingangs- und Ausgangsmodule sollten immer gleich bleiben.)

edit: Ich habe NeuronDecomposableNetwork gefunden, was dies vereinfachen sollte, aber es scheint immer noch, dass ich Neuronen und Verbindungen getrennt verfolgen muss.

Antwort

4

Ich nehme an, dass Sie entlang der Linien des NEAT Algorithmus gehen? Es gibt zwei verschiedene Antworten auf Ihre Frage:

  1. Öffnen beendet Entwicklung der Netzwerktopologie: in diesem Fall empfehle ich jedes Neuron in seiner eigenen „Schicht“/Modul einkapseln und hinzufügen/entfernen sie und ihre Verbindungen mit dem Netzwerk iterativ, ein bisschen wie in this tutorial, mit der Ausnahme, dass es viel mehr (Single-Neuron) Schichten geben wird. Vergessen Sie nicht, nach jeder topologischen Änderung die Methode sortModules() aufzurufen.

  2. Die beste Topologie innerhalb eines vordefinierten Rahmens finden (sagen wir ein Maximum von 1000 Neuronen). In diesem Fall ist es einfacher und effizienter, das gesamte Netzwerk am Anfang aufzubauen, und nur Maske einige der Verbindungen (z. B. unter Verwendung des MaskedParameters Moduls). Unter anderem sind memetic algorithms(used like this) entworfen, um solche Topologie Räume zu suchen.

Eine Alternative, wie Sie sagen, die Verwaltung wird manuell alle Gewichte (von what is where Tracking oder mit NeuronDecomposableNetwork), aber ich nicht, dass empfehlen.


Eine allgemeine Bemerkung: für anspruchsvollere Anwendungen von pybrain wie bei Ihnen, auf der `buildNetwork‘ Verknüpfung angewiesen ist wirklich zu begrenzt, und Sie werden das Netzwerk/Module/Anschluss API direkt verwenden möchten.

+0

Super, das hilft mir eine Tonne, danke! Ich mag die erste Idee. Hätte nie gedacht, Schichten als einzelne Neuronen zu verwenden. Und ja, nachdem ich ungefähr drei Tage versucht habe, würde ich die manuelle Verwaltung entweder nicht empfehlen lol (der andere Stack-overflow-Post war tatsächlich, wo ich die Idee hatte). Ich werde nach einigen Experimenten zurückkommen (und NEAT erforschen, da dies das erste Mal ist, dass ich davon erfahren habe, aber fast genau das ist, was ich erreichen wollte) und meinen Beitrag mit den Ergebnissen aktualisieren. – ubomb