Ich versuche, mein eigenes System so zu programmieren, dass ein neuronales Netzwerk ausgeführt wird. Um die Anzahl der benötigten Knoten zu verringern, wurde vorgeschlagen, die Rotationen der Eingabe gleich zu behandeln.
Mein Netzwerk zielt darauf ab, Conways Spiel des Lebens zu lernen und vorherzusagen, indem es jedes Quadrat und seine umgebenden Quadrate in einem Raster betrachtet und die Ausgabe für dieses Quadrat angibt. Seine Eingabe ist eine Folge von 9 Bits:
Das Obige wird als 010 001 111 dargestellt.
Es gibt jedoch drei weitere Umdrehungen dieser Form, und alle erzeugen dieselbe Ausgabe:
Meine Netzwerktopologie besteht aus 9 Eingabeknoten und 1 Ausgabeknoten für den nächsten Status des mittleren Quadrats in der Eingabe. Wie kann ich die verborgenen Ebenen so konstruieren, dass jede dieser Umdrehungen gleich ist, wodurch die Anzahl der möglichen Eingaben auf ein Viertel des Originals reduziert wird?
Bearbeiten:
Es gibt auch einen Flip jeder Umdrehung, der ein identisches Ergebnis erzeugt. Wenn ich diese einbeziehe, werden meine Eingaben um 1/8 reduziert. Mein Ziel beim Segelflugzeug ist es, dass alle diese Eingaben genau gleich behandelt werden. Muss dies mit Vorverarbeitung erfolgen oder kann ich es in das Netzwerk integrieren?
quelle
Antworten:
Wenn ich es gut verstehe, wird Ihr einzelner Ausgabeknoten der nächste Status des Quadrats in der Mitte sein. Sie müssen sich keine Gedanken über die Anzahl der Knoten in den verborgenen Ebenen machen, während Sie über ausreichende Ressourcen verfügen, um das Modell zu trainieren. Dieses Problem ist für ein neuronales Netzwerk sehr einfach zu erlernen, sodass keine Größenprobleme auftreten.
Sie müssen ein überwachtes Training durchführen, dh Sie müssen Eingabedaten und die entsprechende erwartete Ausgabe eingeben. Sie müssen sicherstellen, dass in Ihren Trainingsdaten alle 4 Umdrehungen demselben Ausgang zugeordnet sind. Auf diese Weise sollte Ihr Netzwerk lernen, alle diese gleich zu behandeln.
Du hast mich neugierig gemacht, also habe ich es selbst versucht. Meine Lösung konnte in ungefähr 20 Epochen, die auf meinem alten Laptop innerhalb weniger Sekunden ausgeführt wurden, 100% korrekt lernen. Ich habe die Ausgabe nur geringfügig so geändert, dass sie entweder [0,1] oder [1,0] kategorisch ist, aber das ergibt das gleiche Ergebnis, das Sie suchen. Nur als Referenz hier ist der in Python geschriebene Code:
quelle
Sie haben eine Optimierung in Ihrem Problembereich festgestellt und möchten diese in Ihr neuronales Netz einbinden. Ich schlage eine Vorverarbeitung vor: Verfassen Sie Ihre Optimierung mit einem neuronalen Netz, das eine Teilmenge Ihrer Wünsche erfüllt.
Mit anderen Worten, normalisieren Sie Ihre Eingabe, indem Sie manuell einen Rotationsalgorithmus codieren, der die Eingaben dreht, um die in Ihrem Beitrag hervorgehobene Äquivalenz zu erfassen. Führen Sie dann die Ausgabe dieser Transformation für das Training und alle anderen Zwecke in Ihr neuronales Netz ein. Dies bedeutet, dass Sie das neuronale Netz trainieren, um das von Ihnen identifizierte Unterproblem anzugehen - Rotationen sind redundant.
Testen Sie Ihren Normalisierer, indem Sie zufällige Eingaben generieren, ihn auf alle vier möglichen Transformationen drehen, den Normalisierer auf jeder ausführen und dann überprüfen, ob alle gleichwertig sind.
quelle
Um puristisch zu sein, betrachten Sie die Eingabe zunächst anders als ein kreisförmiges Array der Größe vier, wobei jedes Element ein Bitpaar und zusätzlich ein Mittelbit enthält:
Setzen Sie diese kreisförmige Struktur und das Mittelpunktsparadigma während des gesamten Netzwerkdesigns fort.
quelle