Ich habe Mühe, den Keras-Codierungsunterschied für die Eins-zu-Viele-Sequenzkennzeichnung (z. B. Klassifizierung einzelner Bilder) und die Viele-zu-Viele-Sequenzkennzeichnung (z. B. Klassifizierung von Bildsequenzen) zu interpretieren. Ich sehe häufig zwei verschiedene Arten von Codes:
Bei Typ 1 wird kein TimeDistributed wie folgt angewendet:
model=Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode="valid", input_shape=[1, 56,14]))
model.add(Activation("relu"))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Reshape((56*14,)))
model.add(Dropout(0.25))
model.add(LSTM(5))
model.add(Dense(50))
model.add(Dense(nb_classes))
model.add(Activation("softmax"))
In Typ 2 wird TimeDistributed folgendermaßen angewendet:
model = Sequential()
model.add(InputLayer(input_shape=(5, 224, 224, 3)))
model.add(TimeDistributed(Convolution2D(64, (3, 3))))
model.add(TimeDistributed(MaxPooling2D((2,2), strides=(2,2))))
model.add(LSTM(10))
model.add(Dense(3))
Meine Fragen sind:
Ist meine Annahme richtig, dass Typ 1 die Eins-zu-Viele-Art und Typ 2 die Viele-zu-Viele-Art ist? Oder
TimeDistributed
hat diesbezüglich keine Relevanz?In jedem Fall von Eins-zu-Viele oder Viele-zu-Viele ist die letzte dichte Schicht 1 Knoten "lang" (wobei wiederum nur ein Wert ausgegeben wird), und
die vorherige wiederkehrende Schicht ist dafür verantwortlich, zu bestimmen, wie viele
1-lang sind Wert zu emittieren? Oder soll die letzte dichte Schicht aus N Knoten bestehen, woN=max sequence length
? Wenn ja, wozu sollte
RNN hier verwendet werden, wenn wir
mit N parallelen "Vanille" -Schätzern einen ähnlichen Eingang mit mehreren Ausgängen erzeugen könnten ?Wie definiere ich die Anzahl der Zeitschritte in RNNs? Ist es irgendwie
mit der Länge der Ausgabesequenz korreliert oder ist es nur ein
Hyperparameter zum Einstellen?In meinem obigen Beispiel vom Typ 1: Was
bringt es , LSTM anzuwenden, wenn das Modell nur eine Klassenvorhersage (von möglich
nb_classes
) ausgibt? Was ist, wenn man die LSTM-Schicht weglässt?
Antworten:
Der Zweck der Verwendung einer wiederkehrenden Ebene besteht darin, dass die Ausgabe nicht nur ein Ergebnis eines einzelnen Elements ist, das von anderen Elementen unabhängig ist, sondern vielmehr eine Folge von Elementen, sodass die Ausgabe der Operation der Ebene für ein Element in der Sequenz das Ergebnis ist sowohl dieses Elements als auch eines beliebigen Elements davor in der Sequenz. Die Anzahl der Zeitschritte definiert, wie lang eine solche Sequenz ist. Das heißt, wie viele Elemente in einer Sequenz behandelt werden sollen und sich gegenseitig auf die resultierende Ausgabe auswirken.
Eine LSTM-Schicht arbeitet so, dass sie Eingaben in der Form number_of_timesteps, dimensions_of_each_item akzeptiert. Wenn der Parameter return_sequences auf False gesetzt ist, was standardmäßig der Fall ist, "setzt" die Ebene die Eingaben aller Zeitschritte zu einer einzigen Ausgabe zusammen. Wenn Sie eine Folge von beispielsweise 10 Elementen betrachten, erzeugt eine LSTM-Ebene mit den auf False gesetzten return_sequences aus einer solchen Folge ein einzelnes Ausgabeelement, und die Attribute dieses einzelnen Elements ergeben sich aus allen Elementen (Zeitschritten) in der Reihenfolge. Dies ist, was Sie bei einem Viele-zu-Eins-Design wollen.
Eine LSTM-Ebene mit auf True gesetzten return_sequences erzeugt für jedes Element (Zeitschritt) in einer Eingabesequenz eine Ausgabe. Dies geschieht so, dass die Ausgabe zu jedem Zeitpunkt nicht nur von dem Element abhängt, an dem gerade gearbeitet wird, sondern auch von den vorherigen Elementen in der Sequenz. Dies ist, was Sie bei einem Viele-zu-Viele-Design wollen.
Da eine LSTM-Ebene eine Folge von Elementen als Eingabe verwendet, muss jede Ebene vor einer LSTM-Schicht in Ihrem Modell eine Folge als Ausgabe erzeugen. Bei Ihrem Modell vom Typ 1 arbeiten die ersten Ebenen nicht mit Sequenzen, sondern jeweils mit einem einzelnen Element. Dies erzeugt daher keine Folge von Elementen, mit denen für das LSTM gearbeitet werden soll.
Durch die Verwendung von TimeDistributed kann jedes Element in einer Sequenz mit einer Ebene bearbeitet werden, ohne dass sich die Elemente gegenseitig beeinflussen. TimeDistributed-Layer arbeiten also mit Sequenzen von Elementen, es gibt jedoch keine Rekursion.
Bei Ihrem Typ-2-Modell erzeugen die ersten Ebenen eine Sequenz mit 5 Zeitschritten, und die Operationen, die für jedes der Elemente in der Sequenz ausgeführt werden, sind unabhängig voneinander, da die in TimeDistributed eingeschlossenen Ebenen nicht wiederkehrend sind. Da die LSTM-Ebene die Standardeinstellungen return_sequences = False verwendet, erzeugt die LSTM-Ebene eine einzelne Ausgabe für jede solche Sequenz von 5 Elementen.
Die endgültige Anzahl der Ausgabeknoten in Ihrem Modell hängt vollständig vom Anwendungsfall ab. Ein einzelner Knoten eignet sich für eine binäre Klassifizierung oder für die Erstellung einer Partitur.
quelle
Ich denke, dass Sie möglicherweise meine vorherige Arbeit verwenden können. In diesem Code erstelle ich Sinuswellen (mit zufälligen Wellenlängen und Phasen) und trainiere ein LSTM zu einer Folge von Punkten aus diesen Sinuswellen und gebe eine Folge von 150 Punkten aus, die jede Sinuswelle vervollständigen.
Dies ist das Modell:
Und das ist das gesamte Skript:
quelle