0

Ich baue ein neuronales Netzwerk, um Songs zu produzieren. Ich habe eine Datei, die alle Noten von einem Song hat und eine Zeile entspricht einer Anmerkung:Wie baut man ein Keras-Modell mit multidimensionalem Ein- und Ausgang?

0 0 0.05511 0.78740 
0 0 0.07874 0.50393 
0 0 0.71653 1 
0 0 0.50393 0 
.. .. .. .. 

Ich möchte 10 erste Hinweise an das neuronale Netz geben, und ich möchte es die nächste Note geben als die Ausgabe, die nach diesen 10 Noten gespielt werden soll.

aber ich weiß nicht, wie die ersten und die letzten Schichten zu bauen (Dense, LSTM ...), weil ich:

  1. eine Eingabe von 10x4 Dimension (4 Spalten und 10 Zeilen).
  2. ein Ausgabe von 1x4 Dimension (1 Zeile und 4 Spalten).

Dies ist der Beginn meines Codes (die nicht richtig meine Daten lesen):

model = Sequential() 
model.add(Dense(10, activation='relu',input_shape = (10,4))) 
model.add(Dense(4, activation='relu')) 

Vielen Dank für Ihre Hilfe.

Antwort

0

Dies ist ein Sequenzprognoseproblem, das am besten mit wiederkehrenden oder langen Kurzzeitgedächtnisnetzwerken gelöst wird.

Nach kann ein guter Starter sein:

from keras.models import Sequential 
from keras.layers import LSTM, Dense, Dropout 
import numpy as np 

#assuming all 4 columns correspond to 1 song 
data_dim = 4 
#so one song would be 10x4 2D array 
number_of_notes_per_song = 10 
nsongs_train = 100 
#tunable parameter 
batch_size = 32 
epochs = 5 

# I generated dummy data, but you have your own... 
x_train = np.random.random((nsongs_train, number_of_notes_per_song, data_dim)).reshape(nsongs_train*number_of_notes_per_song,data_dim) 

#this is a supervised learning problem, but your dataset has no labels.. 
#we can use last note in each song as a label when training LSTM 
X = x_train[np.mod(np.arange(x_train.shape[0]),number_of_notes_per_song)!=0].reshape(nsongs_train,number_of_notes_per_song-1,data_dim) 
y = x_train[::number_of_notes_per_song].reshape(nsongs_train,data_dim) 

model = Sequential() 
model.add(LSTM(32, input_shape=(number_of_notes_per_song-1, data_dim),return_sequences=True)) 
model.add(Dropout(0.2)) 
model.add(LSTM(64)) 
model.add(Dropout(0.2)) 
model.add(Dense(data_dim, activation='softmax')) 
model.compile(loss='categorical_crossentropy', optimizer='adam') 

model.fit(X,y,batch_size=batch_size, epochs=epochs) 

#predict on unseen data, expects tensors of shape (None, number_of_notes_per_song-1, data_dim) 
model.predict(...) 

Beachten Sie, dass dies ein überwachtes maschinelles Lernen Problem, aber Dataset hat keine Etiketten. Wir können das umgehen, indem wir die letzte Note in jedem Song als Label verwenden. Dies reduziert effektiv die Sequenzlänge um 1 Note.

Beachten Sie auch, dass, wenn Ihr Lied Hunderte von Noten hatte, es am besten wäre, sie in Subsequenzen an LSTM zu senden, ohne die Zustände bis zum Ende des Songs zurückzusetzen. Here ist ein Beispiel für Stateful Training mit Keras.

Wenn Bedarf ganze Songs zu prognostizieren (und nicht nur ein nächstes Zeichen), dann würden Sie return_sequences=True in allen LSTM Schichten setzen müssen und TimeDistributed dichte Schicht am Ausgang verwenden.

+0

Vielen Dank für Ihre Antwort. Es hat mir sehr geholfen. Ich habe das getan und es hat funktioniert. Wie kann ich dieses Programm ändern, um eine Datei einzeln zu lesen, damit das NN viele Lieder lernt und nicht nur eines? Weil eine Datei nur ein Lied ist, das tausende von Noten enthält. Also würde ich gerne wissen, wie die Form der Ein- und Ausgabedaten aussehen soll, dass ich viele Lieder mit tausenden von Noten habe? Vielen Dank. – Juan