Musik automatisch komponieren
Fast unmittelbar nachdem ich Programmieren gelernt hatte, wollte ich eine Software erstellen, die Musik komponieren kann.
Einige Jahre lang habe ich primitive Versuche unternommen, automatisch Musik für
Visions of Chaos zu komponieren. Grundsätzlich wurden einfache mathematische Formeln oder genetische Mutationen zufälliger Notenfolgen verwendet. Nachdem ich kürzlich bescheidene Erfolge bei der Untersuchung und Anwendung von TensorFlow und neuronalen Netzen zur
Suche nach zellularen Automaten erzielt hatte, beschloss ich, neuronale Netze zum Erstellen von Musik zu verwenden.
Wie funktioniert es?
Der Komponist unterrichtet ein neuronales Netzwerk mit
langem Kurzzeitgedächtnis (LSTM). LSTM-Netzwerke eignen sich gut zur Vorhersage der nächsten Datensequenzen. Lesen Sie hier mehr über LSTM.
Ein LSTM-Netzwerk empfängt verschiedene Notenfolgen (in diesem Fall handelt es sich um einkanalige MIDI-Dateien). Nach einer ausreichenden Ausbildung erhält sie die Möglichkeit, Musik zu erstellen, die den Unterrichtsmaterialien ähnelt.
LSTM-Interna mögen einschüchternd wirken, aber die Verwendung von
TensorFlow und / oder
Keras vereinfacht die Erstellung und das Experimentieren von LSTM erheblich.
Quellmusik für das Modelltraining
Für solch einfache LSTM-Netzwerke reicht es für uns aus, dass die Quellkompositionen ein einzelner Midi-Kanal sind. Hervorragend geeignet sind Midi-Dateien von Solo bis Klavier. Ich fand Midi-Dateien mit Klaviersoli auf der
Classical Piano Midi-Seite und in den
Dateien und trainierte damit meine Modelle.
Ich habe die Musik verschiedener Komponisten in separate Ordner gelegt. Dank dessen kann der Benutzer Bach auswählen, auf die Schaltfläche Komponieren klicken und ein Lied erhalten, das (hoffentlich) wie Bach sein wird.
LSTM-Modell
Das Modell, auf dessen Grundlage ich den Code geschrieben habe, hat
dieses Beispiel des Autors
Sigurður Skúli Sigurgeirsson ausgewählt , über den er
hier ausführlicher schreibt.
Ich habe das Skript lstm.py ausgeführt und nach 15 Stunden das Training abgeschlossen. Als ich Predict.py ausführte, um die MIDI-Dateien zu generieren, war ich enttäuscht, weil sie aus einer sich wiederholenden Notiz bestanden. Wenn ich das Training zweimal wiederholte, bekam ich die gleichen Ergebnisse.
Quellmodell
model = Sequential() model.add(CuDNNLSTM(512,input_shape=(network_input.shape[1], network_input.shape[2]),return_sequences=True)) model.add(Dropout(0.3)) model.add(CuDNNLSTM(512, return_sequences=True)) model.add(Dropout(0.3)) model.add(CuDNNLSTM(512)) model.add(Dense(256)) model.add(Dropout(0.3)) model.add(Dense(n_vocab)) model.add(Activation('softmax')) model.compile(loss='categorical_crossentropy', optimizer='rmsprop',metrics=["accuracy"])
Nachdem ich dem Skript eine Grafikausgabe hinzugefügt hatte, sah ich, warum mein Modell nicht funktionierte. Die Genauigkeit ist im Laufe der Zeit nicht so gewachsen, wie es sollte. Unten im Beitrag finden Sie gute Grafiken, die zeigen, wie das Arbeitsmodell aussehen soll.
Ich hatte keine Ahnung, warum es passiert ist. aber dieses Modell aufgegeben und begann, die Einstellungen anzupassen.
model = Sequential() model.add(CuDNNLSTM(512, input_shape=(network_input.shape[1], network_input.shape[2]), return_sequences=True)) model.add(Dropout(0.2)) model.add(BatchNormalization()) model.add(CuDNNLSTM(256)) model.add(Dropout(0.2)) model.add(BatchNormalization()) model.add(Dense(128, activation="relu")) model.add(Dropout(0.2)) model.add(BatchNormalization()) model.add(Dense(n_vocab)) model.add(Activation('softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=["accuracy"])
Es ist kompakter und hat weniger LSTM-Schichten. Ich habe auch BatchNormalization hinzugefügt und es im
sentdex-Video gesehen . Höchstwahrscheinlich gibt es bessere Modelle, aber dieses hat in all meinen Trainingseinheiten ziemlich gut funktioniert.
Beachten Sie, dass ich in beiden Modellen LSTM durch CuDNNLSTM ersetzt habe. So habe ich dank der Verwendung von Cuda ein viel schnelleres LSTM-Training erreicht. Wenn Sie keine
GPU mit Cuda-Unterstützung haben , müssen Sie LSTM verwenden. Vielen Dank an
sendtex für diesen Tipp. Das Erlernen neuer Modelle und das Erstellen von Midi-Dateien mit CuDNNLSTM ist etwa fünfmal schneller.
Wie lange sollte das Modell trainiert werden?
Die Ähnlichkeit der Ergebnisse mit der Originalmusik hängt von der Dauer des Trainings des Modells (der Anzahl der Epochen) ab. Wenn es zu wenige Epochen gibt, enthält das resultierende Ergebnis zu viele sich wiederholende Noten. Wenn es zu viele Epochen gibt, wird das Modell umgeschult und einfach die Originalmusik kopiert.
Aber woher weißt du, wie viele Epochen zu stoppen sind?
Eine einfache Lösung besteht darin, einen Rückruf hinzuzufügen, in dem das Modell und das Genauigkeits- / Verlustdiagramm alle 50 Epochen eines Trainingslaufs in 500 Epochen gespeichert werden. Dank dessen erhalten Sie nach Abschluss des Trainings Modelle und Grafiken in Schritten von 50 Epochen, die zeigen, wie das Training verläuft.
Hier sind die Ergebnisse der Grafiken eines Laufs mit Speichern alle 50 Epochen, kombiniert in einem animierten GIF.
Dies sind die Grafiken, die wir sehen möchten. Die Verluste sollten sinken und niedrig bleiben. Die Genauigkeit sollte steigen und nahe bei 100% bleiben.
Es ist erforderlich, ein Modell mit der Anzahl der Epochen zu verwenden, die dem Zeitpunkt entspricht, an dem die Graphen zum ersten Mal an ihre Grenzen stießen. Für die oben gezeigte Grafik sind es 150 Epochen. Wenn Sie ältere Modelle verwenden, werden diese umgeschult und führen höchstwahrscheinlich zu einem einfachen Kopieren des Quellmaterials.
Das diesen Spalten entsprechende Modell wurde auf Midi-Dateien der Kategorie Anthems trainiert, die
von hier stammen .

MIDI-Daten in einem Modell mit 150 Epochen ausgeben.

Midi-Ausgabe in einem 100-Epochen-Modell.
Selbst ein Modell mit 100 Epochen kann die Quelle zu genau kopieren. Dies kann auf eine relativ kleine Auswahl von MIDI-Dateien für das Training zurückzuführen sein. Mit mehr Notizen ist das Lernen besser.
Wenn das Lernen schlecht wird
Das Bild oben zeigt ein Beispiel dafür, was während des Trainings passieren kann und was passiert. Die Verluste werden reduziert und die Genauigkeit wie üblich erhöht, aber plötzlich werden sie verrückt. In diesem Stadium kann es sich auch lohnen, anzuhalten. Das Modell wird (zumindest nach meiner Erfahrung) nicht mehr richtig lernen. In diesem Fall ist das gespeicherte Modell mit 100 Epochen immer noch zu zufällig, und mit 150 Epochen ist der Moment des Modellfehlers bereits vergangen. Jetzt bin ich alle 25 Epochen gerettet, um genau den idealen Moment des Modells mit dem besten Training zu finden, noch bevor sie umschult und abstürzt.
Ein weiteres Beispiel für Lernfehler. Dieses Modell wurde auf Midi-Dateien trainiert, die
von hier stammen . In diesem Fall hielt sie sich etwas länger als 200 Epochen. Bei Verwendung eines Modells mit 200 Epochen wird in Midi das folgende Ergebnis erzielt.

Ohne die Erstellung von Diagrammen würden wir nie wissen, ob das Modell Probleme hat und wann sie auftreten, und könnten auch kein gutes Modell erhalten, ohne von vorne zu beginnen.
Andere Beispiele

Ein Modell mit 75 Epochen, das auf den Kompositionen von
Chopin basiert.

Ein Modell aus der 50er-Ära, das auf
Midi-Dateien für Weihnachtskompositionen basiert.

Ein 100-Epochen-Modell basierend auf
Midi-Dateien für Weihnachtskompositionen . Aber sind sie wirklich "Weihnachten"?

Ein Modell aus 300 Epochen, das auf Bach-Midi-Dateien basiert, die
von hier und
von hier stammen .

Ein Modell aus 200 Epochen, das auf Balakirevs einziger Midi-Datei basiert.

Modell mit 200 Epochen, basierend auf
Debussy- Kompositionen.

Ein Modell aus 175 Jahren, das auf Mozarts Kompositionen basiert.

Ein Modell mit 100 Epochen basierend auf
Schubert- Kompositionen.

Ein Modell aus der 200er-Ära, das auf
Schumann- Kompositionen basiert.

Ein Modell aus der 200er-Ära, das auf
Tschaikowskys Kompositionen basiert.

Ein Modell mit 175 Epochen basierend auf Volksliedern.

Modell mit 100 Epochen basierend auf Schlafliedern.

Ein 100-Ära-Modell basierend auf Hochzeitsmusik.

Ein Modell aus 200 Epochen, das auf meinen eigenen Midi-Dateien basiert, die aus meinen
YouTube-Video- Soundtracks stammen. Es kann ein bisschen umgeschult werden, weil es im Grunde Kopien meiner kurzen Ein- und Zweitakt-Midi-Dateien generiert.
Scores
Sobald Sie
Ihre Midi-Dateien erhalten haben, können Sie sie mit Online-Tools wie
SolMiRe in Partituren konvertieren. Unten ist die Punktzahl der oben dargestellten Midi-Softology-Datei mit 200 Epochen aufgeführt.
Wo kann ich den Komponisten testen?
LSTM Composer ist jetzt in
Visions of Chaos enthalten .
Wählen Sie einen Stil aus der Dropdown-Liste aus und klicken Sie auf Verfassen. Wenn Sie das erforderliche Minimum an Python und TensorFlow installiert haben (siehe Anweisungen
hier ), erhalten Sie in wenigen Sekunden (wenn Sie eine schnelle GPU haben) eine neue maschinengeschriebene MIDI-Datei, die Sie anhören und für andere Zwecke verwenden können. Kein Urheberrecht, keine Lizenzgebühren. Wenn Ihnen die Ergebnisse nicht gefallen, können Sie erneut auf "Verfassen" klicken. Nach einigen Sekunden ist eine neue Komposition fertig.
Die Ergebnisse können noch nicht als vollwertige Kompositionen betrachtet werden, aber sie enthalten interessante kleine Notenfolgen, mit denen ich in Zukunft Musik machen werde. In dieser Hinsicht kann der LSTM-Komponist eine gute Inspirationsquelle für neue Kompositionen sein.
Python-Quelle
Unten finden Sie den Python-Skriptcode, den ich für das LSTM-Training und die Prognose verwendet habe. Damit diese Skripte funktionieren, muss Visions of Chaos nicht installiert werden, und das Lernen und Generieren von MIDI funktioniert über die Befehlszeile.
Hier ist das Trainingsskript
lstm_music_train.py
Und hier ist das Generierungsskript midi
lstm_music_predict.py
:
Modelldateigrößen
Der Nachteil der Einbeziehung neuronaler Netze in Visions of Chaos ist die Größe der Dateien. Wenn die Generierung des Modells schneller wäre, würde ich einfach eine Schaltfläche hinzufügen, damit der Endbenutzer die Modelle selbst trainieren kann. Da einige der Schulungen für viele Modelle mehrere Tage dauern können, ist dies nicht besonders praktisch. Es schien mir, dass es besser ist, das gesamte Training und Testen selbst durchzuführen und nur die besten Arbeitsmodelle hinzuzufügen. Dies bedeutet auch, dass der Endbenutzer nur einen Knopf drücken muss und trainierte Modelle musikalische Kompositionen erstellen.
Jedes der Modelle hat eine Größe von 22 Megabyte. Unter den Bedingungen des modernen Internets ist dies nicht so sehr, aber im Laufe der Jahre der Entwicklung hat Visions of Chaos allmählich an Größe zugenommen und ist erst kürzlich plötzlich von 70 auf 91 MB gestiegen (aufgrund des Suchmodells für zellulare Automaten). Daher habe ich bisher nur ein Modell zum Hauptinstallationsprogramm von Visions of Chaos hinzugefügt. Für Benutzer, die mehr wollen, habe ich einen Link zu weiteren 1 GB Modellen gepostet. Sie können auch das obige Skript verwenden, um ihre eigenen Modelle basierend auf ihren MIDI-Dateien zu erstellen.
Was weiter?
In dieser Phase ist der LSTM-Komponist das einfachste Beispiel für die Verwendung neuronaler Netze zum Komponieren von Musik.
Ich habe bereits andere Musikkomponisten in neuronalen Netzen gefunden, mit denen ich in Zukunft experimentieren werde. Sie können also erwarten, dass es in Visions of Chaos neue Möglichkeiten gibt, automatisch Musik zu komponieren.