2016-04-09 5 views
2

Ich versuche, ein LSTM-Rnn zu erzeugen, um Musikfolgen zu erzeugen. Die Trainingsdaten sind eine Folge von Vektoren der Größe 4, die verschiedene Merkmale (einschließlich einer MIDI-Note) jeder Note in einigen Liedern zum Trainieren repräsentieren.tensorflow/tflearn Eingabeform

Aus meiner Lektüre sieht es so aus, als ob ich für jeden Eingabe-Sample habe, das Ausgabe-Sample ist der nächste Größe 4-Vektor (dh es sollte versuchen, die nächste Note vorherzusagen, und wegen der LSTMs, die das Wissen von Proben, die vorher gekommen sind, einbeziehen).

Ich benutze Tflearn, wie ich noch sehr neu zu RNNs bin. Ich habe den folgenden Code

net = tflearn.input_data(shape=[None, seqLength, 4]) 
net = tflearn.lstm(net, 128, return_seq=True) 
net = tflearn.dropout(net, 0.5) 
net = tflearn.lstm(net, 128) 
net = tflearn.dropout(net, 0.5) 
net = tflearn.fully_connected(net, 4, activation='softmax') 
net = tflearn.regression(net, optimizer='adam', 
        loss='mean_square') 

# Training 
model = tflearn.DNN(net, tensorboard_verbose=3) 
model.fit(trainX, trainY, show_metric=True, batch_size=128) 

Vor diesem Code ich die trainX und Trainy in Sequenzen von 20 Länge geteilt habe (willkürlich, aber ich habe irgendwo gelesen, dass die Ausbildung auf Sequenzen wie dies ein guter Weg, dies zu tun).

Dies scheint in Ordnung zu sein, aber ich bekomme den Fehler ValueError: Kann nicht Wert der Form (128, 16, 4) für Tensor u'TargetsData/Y: 0 ', die Form' (?, 4) '

hat

SO: Meine bisherigen Annahmen ist, dass die Eingabeform [None, seqLength, 4] zu TF [batchLength (die von tflearn sequentiell gefüttert wird), Sequenzlänge, Merkmalslänge der Probe] sagt. Was ich nicht verstehe ist, warum es sagt, dass die Ausgabe die falsche Form hat? Gehe ich fälschlicherweise mit der Aufteilung der Datensequenz um? Wenn ich nur versuche, alle meine Daten einzufügen, ohne in Sequenzen zu gehen, so lautet die Eingabeform [None, 4]. TF sagt mir, dass die LSTM-Ebene eine Eingabeform mit mindestens 3 Dimensionen erwartet.

Ich kann mir nicht vorstellen, was die Formen der Ein- und Ausgänge sein sollen. Es fühlt sich an, als ob das eine einfache Sache sein sollte - ich habe eine Reihe von Eingabesequenzen von Vektoren und ich möchte, dass das Netzwerk versucht, den nächsten in der Sequenz vorherzusagen. Es gibt sehr wenig online, das nicht ein ziemlich fortgeschrittenes Niveau des Wissens voraussetzt, also habe ich eine Backsteinmauer geschlagen. Ich schätze jeden Einblick, den jemand geben kann!

Antwort

3

Ich löste das, also schreibe ich die Antwort hier für jeden, der das gleiche Problem hat. Es basierte auf einem Missverständnis, wie diese Netzwerke funktionieren, aber das ist angenommenes Wissen in den meisten Tutorials, die ich gelesen habe, so dass es für andere Anfänger nicht klar sein kann.

Die LSTM-Netzwerke sind in diesen Situationen nützlich, da sie die Eingabehistorie berücksichtigen können. Die Art und Weise, wie die Historie dem LSTM gegeben wird, erfolgt durch die Sequenzierung, aber jede Sequenz führt immer noch zu einem einzelnen Ausgabedatenpunkt. Die Eingabe muss also eine 3D-Form haben, während die Ausgabe nur 2D ist.

Gegeben eine ganze Sequenz und eine gewünschte historyLength, teile ich die Eingabe in Sequenzen von historyLength und einem einzelnen Ausgabevektor. Dies löste mein Formproblem.

+2

Hi henreh, möchten Sie mehr Ihre Lösung erarbeiten? Können Sie das Codeskript zum Lösen dieses Formproblems freigeben? – user288609