2

Ich habe ein Problem mit der Erstellung meiner Daten für ein NN mit einer LSTM-Schicht. Ich habe viele Dateien mit Hunderten von Zeilen. Jede Datei repräsentiert ein Lied und jede Zeile stellt eine Notiz mit 4 Werten. Ich möchte die NN lesen die Notizen mit eine Sequenz von 10 Notizen, so dass es die nächste Note von ihnen vorhersagen kann. Wenn es nötig ist, können wir die Anzahl der Noten auf 5000 pro Song festlegen.Welche Form sollte Eingabe- und Ausgabedaten für ein LSTM NN haben?

Also ich möchte nur wissen, welche Form meine Ein- und Ausgabedaten haben sollte und wie Sie die erste LSTM-Schicht definieren.

model = Sequential() 
model.add(LSTM(32, input_shape=(5000, 4),return_sequences=True)) 

zum Sumpf bis:

  • Eine Datei hat 5000 Zeilen und 4 Spalten und für 1 Song.

  • Eine Zeile in einer Datei steht für eine Note mit 4 Werten.

Vielen Dank für Ihre Hilfe.

+0

Können Sie bitte eine Probe der Eingangsdaten zur Verfügung stellen? – grovina

+0

Die Eingangsdaten haben Tausende von Zeilen, so dass ich es hier nicht bereitstellen kann. Es gibt 4 Spalten und jeder Wert ist eine Zahl zwischen 0 und 1. – Juan

Antwort

1

Die Eingabeform der ersten LSTM-Schicht sollte (None, 10, 4) sein. Die Ausgabeform des Modells wäre (None, 4). Ich verwende None für die Losgröße.

I codiert ein einfaches LSTM als Beispiel:

# ... 
# Define model 
hidden_size = 50 
model = Sequential() 
model.add(LSTM(hidden_size, input_shape=(window_length, note_dim), return_sequences=True)) # The batch dimension is implicit here 
model.add(LSTM(note_dim)) 
# ... 

:

import numpy as np 
from keras.layers import LSTM 
from keras.models import Sequential 

batch_size = 32 
window_length = 10 
note_dim = 4 
n_samples = 5000 

# Input data. TODO: Slide window and modify it to use real data 
x = np.ones(shape=(n_samples, window_length, note_dim)) 
y = np.ones(shape=(n_samples, note_dim)) 

# Define model 
model = Sequential() 
model.add(LSTM(note_dim, input_shape=(window_length, note_dim))) # The batch dimension is implicit here 

model.compile('sgd', 'mse') 
model.fit(x=x, # Batch input shape is: (None, window_length, note_dim) 
      y=y, # Batch output shape is: (None, note_dim) 
      batch_size=batch_size) 

Falls Sie ein komplexeres Modell (dh 2 LSTM Schichten) wollen, dass es auf diese Weise definieren könnte

UPDATE: Beantworten Sie Ihren ersten Kommentar.

x sollte alle Lieder enthalten, nachdem Sie ein Fenster auf sie verschoben haben. Angenommen, Sie haben eine Variable songs mit der Form (n_songs, notes_per_song, note_dim), die alle Ihre Songs enthält.Dann könnten Sie x und y wie folgt erstellen:

# ... 
# Input data  
# Suppose that variable ´songs´ is an array with shape: (n_songs, notes_per_song, note_dim). 
samples_per_song = notes_per_song-window_length 
n_samples = n_songs*samples_per_song 
x = np.zeros(shape=(n_samples, window_length, note_dim)) 
y = np.zeros(shape=(n_samples, note_dim)) 
for n, song in enumerate(songs): 
    for i in range(samples_per_song): 
     x[i+n*samples_per_song, :, :] = song[i:(i+window_length), :] 
     y[i+n*samples_per_song, :, :] = song[i+window_length, :] # note that you want to predict 
# ... 
+0

Vielen Dank für Ihre Hilfe. Wenn ich also gut verstehe, sollten alle Songs in der gleichen Datei sein? Also wird die Datei NB_songs * 5000 Zeilen haben? Oder vielleicht stellt x ein Lied dar und ich benutze es als Eingabe und wenn das NN damit fertig ist, ersetze ich x durch ein anderes Lied? Und was soll ich in den Ausgabedaten hinzufügen? Ich meine, wie baue ich die Ausgabe? – Juan

+0

Wie Ihre Songs auf der Festplatte gespeichert werden, spielt hier keine Rolle (es gibt mehrere Möglichkeiten, sie zu speichern und zu laden). Ich aktualisierte meine Antwort, um zu erklären, wie ich sowohl die Eingabedaten "x" als auch die Ausgabe "y" erstellen würde. Ich habe den Code, den ich hinzugefügt habe, nicht getestet, aber ich hoffe, Sie haben die Idee davon. – rvinas

+0

Vielen Dank für Ihre aktualisierte Antwort! Wenn ich also 2 Songs habe und beide 5000 Noten haben, hat das Array "Songs" dann eine Form (2,5000,4)? Und wie soll die Form des neuen Arrays für Sie aussehen? (Ich bekomme nicht die Werte Ihrer Variablen samples_per_song, n_samples etc ...). Dieses neue Array x wird die Eingabedaten für das NN sein. – Juan

0

Ich möchte die NN lesen Sie die Notizen mit einer Folge von 10 Noten, so dass es die nächste Note von ihnen vorhersagen kann.

Ich habe Keras noch nie verwendet, aber ich denke, dass Sie diese Notizen zuerst in Ids konvertieren sollten. Zum Beispiel: (aa, bb, cc, dd) als 1 und (ab, bb, cc, dd) als 2 usw.

Dann lesen Sie 10 IDs/Noten für den Encoder und fügen Sie dann eine Projektion zum Projekt hinzu der Endzustand zur 11. Note. Und wenn Sie das Modell mit 10 Noten aus einer beliebigen Note im Lied testen möchten, trainieren Sie dann die zweite bis zur elften und legen die 12. als Ziel nach der Projektion fest. Und so weiter und so weiter, bis die letzte Note das Ziel ist. Dies ist für ein Lied und wiederholen Sie dies für alle Lieder.

Sie können die Notizen unbedingt über die IDs abrufen. Sie können ein Vokabular erstellen, um es vor und zurück zu übertragen.

+0

Danke für Ihre Hilfe. Ich werde versuchen, das zu tun. Stellen Sie sich also x vor, ein Array mit Noten für einen Song. Ich werde es dann als Eingabedaten verwenden. Aber wie soll ich meine Ausgabedaten erstellen? Sollte es dasselbe wie x ohne die ersten 10 Noten sein? – Juan

+0

Es hängt von Ihrer Aufgabe ab. In Ihrer Frage wollten Sie nur die nächste Note aus den vorherigen zehn Noten erzeugen, dann schlage ich die Methode in meiner Antwort vor. Könnten Sie Ihre Frage ausarbeiten? – lerner

+0

Ja, ich möchte, dass das NN eine Note aus 10 Notizen vorhersagt. Aber ich muss ein Array für die Eingabe und die Ausgabe definieren, bevor ich maschinell lerne. Ich weiß jetzt, was ich eingeben soll, aber wie soll ich die Ausgabe füllen? Während des ersten Schrittes nimmt das NN die ersten 10 Noten und es wird eine Vorhersage des 11. gemacht und es mit den echten 11. Noten verglichen, die in der ersten Zeile der Ausgabe zu finden sind. Aber was ist mit dem nächsten Teil der Ausgabe? – Juan

Verwandte Themen