Wie kann ich dafür sorgen, dass mein Netzwerk Rotationen der Eingabe gleich behandelt?


11

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:

Segelflugzeug

Das Obige wird als 010 001 111 dargestellt.

Es gibt jedoch drei weitere Umdrehungen dieser Form, und alle erzeugen dieselbe Ausgabe:

Segelflugrotationen

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?


Hervorragende Frage! Ich habe ein ähnliches, behinderndes Problem mit meinem eigenen Projekt und werde sehr daran interessiert sein, die effizientesten Techniken zur Reduzierung der Symmetrie kennenzulernen.
DukeZhou

@DukeZhou Ich habe den Eindruck, dass es eine Weile dauern wird, bis ich eine Antwort bekomme. Ich bin bereit, meinen mageren Vorrat an Vertretern zu verbrauchen, um bei Bedarf ein Kopfgeld einzurichten ...
Aric

Eine andere Lösung besteht darin, die Eingabe so vorzuverarbeiten, dass alle 4 Umdrehungen in dasselbe Bild konvertiert werden, bevor sie dem Netzwerk zugeführt werden.
BlueMoon93

Antworten:


4

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:

from keras.models import Sequential
from keras.layers import Input, Dense
from keras.models import Model
from keras import optimizers
from keras.utils.np_utils import to_categorical
import helper

x_,y_ = helper.fnn_csv_toXY("conway.csv","output",False)
y_binary = to_categorical(y_)

model = Sequential()
model.add(Dense(100, activation='relu', kernel_initializer='glorot_uniform',input_shape =(9,)))
model.add(Dense(20, activation='relu', kernel_initializer='glorot_uniform'))
model.add(Dense(2, activation='softmax'))
adam=optimizers.Adam()
model.compile(optimizer=adam,
              loss='categorical_crossentropy',
              metrics=['acc'])
model.fit(x_, y_binary, epochs=100)

Das Netzwerk, das ich verwenden werde, wird von einer von mir selbst geschriebenen Klasse simuliert, daher betrifft das Gedächtnis.
Aric

Wenn Sie die Speichernutzung durch das Netzwerk reduzieren möchten, hilft die Reduzierung der Anzahl möglicher Eingaben (durch Drehen), ein kleineres Netzwerk zu haben. Je einfacher die Lernaufgabe ist, desto kleiner wird das Netzwerk benötigt. In diesem Fall wäre eine Vorverarbeitung besser. Trotzdem ist NN für das Konzeptlernen gedacht und um das Konzept des Spiels des Lebens zu lernen, sollten Sie alle Muster eingeben. Wenn Sie den Speicherbedarf absolut minimieren möchten, lösen Sie das Problem linear.
Manngo

Wenn der Speicher kein Problem darstellt, würde ich es vorziehen, wenn das Netzwerk diesen Vorgang aus den gleichen Gründen ausführt, die Sie angegeben haben. Durch die Vorverarbeitung wird ein Teil der Aufgabe aus dem Netzwerk entfernt und vereinfacht.
Aric

Richtig, dann Vorverarbeitung durchführen. Ich denke damit ist die Frage beantwortet. Sie können es implementieren, wenn Sie Probleme mit dem Speicher haben. Tipp: Verwenden Sie float für die Gewichte, die nur 32 Bit anstelle von double für 64 benötigen. Dadurch wird weniger Speicher benötigt.
Manngo

4

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.


1

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:

... 01, 01, 11, 10 ...

0

Setzen Sie diese kreisförmige Struktur und das Mittelpunktsparadigma während des gesamten Netzwerkdesigns fort.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.