Restricted Boltzmann Machine – einfacher Test

Die neue Generation der neuronalen Netzwerke ist angebrochen!
Ich hab mal versucht meine Infrastruktur auf die neuronalen Netze von hier anzuwenden. Natürlich erst mal mit dem ganz einfachen Beispiel am Anfang probiert. Meine Anwendung sieht jetzt so aus:

Dazu hab ich mir noch ein kleines Control geschrieben, was die Pixeleingabe ermöglicht. Man kann also jetzt ein Muster eingeben:

und dann mit Train trainieren. Ich hab das mal mit ein Paar Einsen ausprobiert, und jetzt kommt eine Eins, die er noch nie gesehen hat:

Ok, zugegeben ich bin nicht besonders gut im Einsen malen, aber er macht die noch schön gerade, und verändert sie dabei fast nicht:

Und dabei hab ich ihn nur mit handgemalten(hässlichen) Daten, und auch nicht mit besonders vielen trainiert. Find ich genial, vor allen Dingen, weil das ja eigentlich noch gar nicht fertig ist, es kommen ja noch sehr viele Schichten dazu(also höhere Genauigkeit). Ich werden demnächst mal meine Anwendung mit diesen Beispielen erweitern. Vorher sind aber erstmal die  nächsten Schichten angesagt.

Neural Nets extendet — Alles vernetzt

Hi,

das erste Stable Release von meiner Anwendung zum Bauen neuronaler Netze ist einsatzbereit! Gleich mit dazu kommt eine Anwendung, die die Zahlen 1 bis 5 als Muster erkennt(Mehr über das Projekt und Download)


Pattern Recognizer
Neural Networks in action


Die Implementierung davon ist mit meiner schönen Infrastruktur ganz einfach


  • Step 1, Netz laden


Das Netz wird aus einer Datei mit der Endung .nnet geladen:

try
{
    using (FileStream fs = new FileStream(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "patrec.nnet"), FileMode.Open, FileAccess.Read))
    {
           this.LayerList = ((SerializationObject)new BinaryFormatter().Deserialize(fs)).LayerList.ToList();
    }
}
catch
{
    MessageBox.Show("Error, net file not found", "Error");
}

Dabei wird einfach der Binary Formatter genutzt um die Kontraktklasse SerializationObject, in der alle wichtigen Informationen enthalten sind, zu speichern, und zu laden.


  • Step 2, Execute Vorbereiten


Wenn die Ausführung beendet ist, wollen wir das Ergebnis in Variablen(strings) abspeichern, die an die Oberfläche gebunden sind(PropertyChanged aktualisiert die WPF Obberfläche). Dazu definieren wir für jede Ausgabeunit folgendes:

buildNet.First(el => el.Key.Layer == 2 && el.Key.Index == #).Value.OutputChanged += delegate
{
    this.Result# = buildNet.First(el => el.Key.Layer == 2 && el.Key.Index == #).Value.Output.ToString();
    this.OnPropertyChanged("Result#");
};

(Vorrausgesetzt es handelt sich um ein 3-Schichtiges Netz, da Layer 0 der kleinste Layer ist, ist dann 2 der größte, also der Ausgabelayer)

Das Delegate wird sofort bei Wertänderung aufgerufen, und die Ergebnisse werden weitergeleitet.

# ist durch den jew. Index der Augabeunit zu ersetzen, dann wird bei erfolgter asynchroner Ausführung der Wert der zuvor zu definierenden Variable gesetzt, also: alles ganz easy!


  • Step 3, Execute itself


Dann muss das Netz natürlich ausgeführt werden, wobei alle Eingabewerte durch Benutzereingabe gegeben sind. Es braucht nur noch folgendes für jede Eingabeunit an die Infrastruktur weitergeleitet zu werden:

buildNet.First(el => el.Key.Index == # && el.Key.Layer == 0).Value.Input(Value#);

# ist der Index der Eingabeunit, Value# der Wert, den der Benutzer für die Unit angegeben hat.

Dann wird das ganze asynchron ausgeführt, und die Ergebnisse erscheinen im Fenster.

Thats it!