Ein künstliches Neuronennetzwerk (ANN) mit einer beliebigen Anzahl von Ein- und Ausgängen

10

Ich möchte ANNs für mein Problem verwenden, aber das Problem ist, dass meine Ein- und Ausgabeknotennummern nicht behoben sind.

Ich habe eine Google-Suche durchgeführt, bevor ich meine Frage gestellt habe, und festgestellt, dass der RNN mir bei meinem Problem helfen kann. Aber alle Beispiele, die ich gefunden habe, haben irgendwie eine definierte Anzahl von Eingabe- und Ausgabeknoten.

Also suche ich nach einer Strategie, wie man sie real macht oder zumindest nach einigen Beispielen, die in Keras oder PyTorch vorzuziehen sind.

Weitere Details zu meinem Problem:

Ich habe zwei Eingabelisten, in denen die Länge der ersten fest ist und zwei beträgt, z.

in_1 = [2,2] 

aber die Länge der zweiten Liste ist flexibel, die Länge kann von drei bis inf sein, zB:

in_2 = [1,1,2,2]

oder

in_2 = [1,1,1,2,2,2,3,3,3]

Auch Eingabelisten hängen voneinander ab. Die erste Liste zeigt die Dimension der Ausgabeliste. Wenn also in_1 = [2,2], bedeutet dies, dass die Ausgabe die Möglichkeit haben muss, sich in die Form [2,2] umzuformen.

Derzeit denke ich daran, zwei Eingabelisten zu einer zu kombinieren:

in = in_1 + in_2 = [2, 2, 1, 1, 2, 2]

Darüber hinaus hat die Ausgabe die gleiche Länge wie die in_2- Liste, z.

wenn Eingabelisten sind:

in_1 = [2, 2]
in_2 = [1, 1, 2, 2]

Die Ausgabe sollte sein:

out = [1, 2, 1, 2]

Irgendwelche Ideen sind willkommen!

Paddy
quelle

Antworten:

6

Die Antwort kann von der Bedeutung der Länge des Eingabevektors oder seiner Entstehung abhängen.

Die einfachste Lösung besteht jedoch normalerweise darin, die Eingabe mit der größten Größe zu kennen und diese als Anzahl von Vektoren zu verwenden. Wenn die angegebene Eingabe eine geringere Länge hat, können Sie das Auffüllen mit Nullen oder entsprechenden Symbolen durchführen. Anstelle eines Vektors [1, 2, 3] und [1, 2, 2, 3] können Sie also Vektoren [1, 2, 3, 0] und [1, 2, 2, 3] haben.

Gleiches kann für die Ausgabe gelten. Wenn die erwartete Ausgabe [1, 2, 1] und [1, 3, 4, 1] ist, können Sie die erste Ausgabe als [1, 2, 1, 0] behandeln.

Ist das nicht nur ein Hack?

Typischerweise funktionieren neuronale Netze in der Approximation. Idealerweise repräsentiert es Vektoren (Matrizen) als Eingabe und Vektoren (Matrizen) als Ausgabe. Aus diesem Grund ist es immer wünschenswert, dass die Größe Ihres Eingabevektors festgelegt wird.

Dipan Mehta
quelle
Ok, das ist klar, ich kann die Eingabe auffüllen. Aber wie definiert man die Größe der Ausgabeknoten?
Paddy
3

Ich denke, Sie haben möglicherweise die feste Anzahl von Eingaben für das RNN falsch verstanden. Dies ist die Anzahl der Eingänge pro Zeitschritt . Alle Ihre Beispiele haben eine feste Anzahl von Eingaben pro Zeitschritt: 1! Sie geben sie einzeln an Ihr neuronales Netzwerk weiter und beenden sie mit einem speziellen "End" -Token (Sie könnten immer eine zweite Eingabe dafür haben). Bringen Sie ihm bei, keine Ausgabe zu geben, bis das End-Token angezeigt wird, und geben Sie dann die Komponenten des Ergebnisses einzeln aus, wobei Sie mit einem speziellen End-Ausgabe-Token enden.

Arthur Tacca
quelle
Wow, danke! Kennen Sie ein anständiges Tutorial / Beispiel, um es besser zu verstehen?
Paddy
1
@Paddy Siehe awesome-rnn für einige Links, zB char-rnn macht ziemlich viel Spaß.
Arthur Tacca
2

Wenn Sie wissen, dass die erste Liste ziemlich unveränderlich ist (nur eine bestimmte Geometrie beschreibt), können Sie auch versuchen, viele verschiedene, spezialisierte NN für jede unterschiedliche in_1- Konfiguration zu erstellen und nur in_2 zum Einspeisen des Netzwerks zu verwenden.

So in_1 verschiedene networks.ie fahren

in_1=[1,1]? --> NN #1 (n1) --> (o1)
in_1=[2,1]? --> NN #2 (n1,n2) --> (o1,o2)
in_1=[2,2]? --> NN #3 (n1,n2,n3,n4) -> (o1,o2,o3,o4)

In einem ersten Schritt bestimmen Sie die Konfiguration (dh erstellen ein Diktat) und trainieren / speisen dann die spezialisierten Netzwerke entsprechend.

Jürgen Schwietering
quelle
Eigentlich ist es eine gute Idee, aber die Anzahl der Formen ist ziemlich groß ... trotzdem, danke für die Eingabe!
Paddy