Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ss20:song-generator [2020/08/26 12:33] dahin |
ss20:song-generator [2020/08/27 14:19] (aktuell) dahin |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | [[projekte_im_sommersemester_2020|← Zurück zur Projektauswahl]] | ||
====== Song-Generator (Charts Garantie) [SS20] ====== | ====== Song-Generator (Charts Garantie) [SS20] ====== | ||
Zeile 18: | Zeile 19: | ||
Ziele: Mit bestimmten Style ein Lied zu generieren ggf. mit Stimme | Ziele: Mit bestimmten Style ein Lied zu generieren ggf. mit Stimme | ||
- | Zwischenziele: Sounds generieren (müssen sich nicht perfekt anhören) | + | Zwischenziele: Sounds generieren |
**Neuronale Netze:** | **Neuronale Netze:** | ||
- | Ein neuronales Netz arbeitet anders als ein normales Programm am Computer. Ein Programm gibt meistens für jeden möglichen Fall, der eintreffen kann ein Szenario aus und macht das einfach immer wieder. Ein neuronales Netz dagegen bekommt ein Dataset, das für möglichst viele Fälle die Ausgangswerte und das erwünschte richtige Ergebnis hat. Davor wird das Dataset in Trainings- und Testdateien aufgeteilt. Das neuronale Netz arbeitet mit den Trainingsdaten. Mit diesen versucht das neuronale Netz mithilfe einer oder mehrerer Funktionen je nach Komplexität so gut wie möglich für alle Trainingsdateien diese Funktionen anzupassen, damit es bei den Trainingsdaten möglichst geringe Fehler macht. Dazu werden werden die Parameter in der Funktion mit jeder neuen Datei angepasst. | + | Ein neuronales Netz arbeitet anders als ein "normales" Programm am Computer. Ein Programm gibt meistens für jeden möglichen Fall ein Szenario aus und wiederholt diesen Vorgang. Ein neuronales Netz dagegen bekommt ein Dataset, das für möglichst viele Fälle die Ausgangswerte und das erwünschte richtige Ergebnis hat. Das Dataset wird vorher in Trainings- und Testdateien aufgeteilt. Das neuronale Netz arbeitet dann mit den Trainingsdaten. Mithilfe einer oder mehrerer Funktionen versucht es dann so gut wie möglich diese Funktion(-en) für alle Trainingsdateien anzupassen, um so die Fehlerquote möglichst gering zu halten. Dazu werden werden die Parameter der Funktion bei jeder neuen Datei angepasst. |
- | Um zu schauen wie gut das neuronale Netz wirklich ist, können nun die Testdateien dem neuronalen Netz übergeben werden. Dann wird der Output mit den echten Ergebnissen verglichen. Je ähnlicher der Output den echten Ergebnissen ist, desto besser ist das neuronale Netz. | + | Um zu testen, wie gut das neuronale Netz wirklich ist, können diesem im Anschluss die Testdateien übergeben werden. Der Output wird dann mit den echten Ergebnissen verglichen. Je geringer die Differenz, desto besser ist das neuronale Netz. |
- | **Was ist der Song-Generator:** | + | **Was ist der Song-Generator:** |
- | Der Song-Generator ist ein mit unseren gesammelten Musikdateien trainiertes neuronales Netz, dass einen Ton, eine Tonfolge oder auch ein Lied bekommt und daraus ein oder mehrere verschiedene Klavierlieder generiert, die im besten Fall gut klingen und zu der gegebenen Tonfolge oder dem gegebenen Ton passen. | + | Der Song-Generator ist ein mit unseren gesammelten Musikdateien trainiertes neuronales Netz, das einen Ton, eine Tonfolge oder auch ein Lied übergeben bekommt und daraus ein oder mehrere verschiedene Klavierlieder generiert, die im besten Fall gut klingen und zu der gegebenen Tonfolge oder dem gegebenen Ton passen. |
Zeile 38: | Zeile 39: | ||
**Projektablauf:** | **Projektablauf:** | ||
- | Als erstes brauch man für Machine learning immer ein Dataset. Also in unserem Fall möglichst viele Midi Dateien. Um diese zusammenzusuchen, haben wir auf mehreren Websites geguckt und dann aus allen Dateien zusammen ein Dataset erstellt. | ||
- | Um unser neuronales Netz zu trainieren benutzen wir Magenta (baut auf Tensorflow und Keras auf). In Magenta können neuronale Netze aber meistens nicht direkt mit Midi Dateien trainiert werden. Deswegen haben wir anschließend alle Midi Dateien in eine .tfrecord Datei umgewandelt. In der Magenta Dokumentation wird .tfrecord als besseres Dateiformat beschrieben, weil man damit leichter und schneller auf die wichtigen Inhalte zugreifen kann. Außerdem werden so sehr viele Midi Dateien in eine Datei zusammengefasst, wodurch der Zugriff auf die Dateien zusätzlich erleichtert wird. Die entstandene .tfrecord-Datei wird anschließend in Training- und Testdateien geteilt. Bei der Erstellung der .tfrecord-Dateien muss bereits die Konfiguration, mit der später gearbeitet werden soll angeben, damit die .tfrecord-Datei richtig formatiert wird. | ||
- | Magenta bietet die Konfigurationen Basic, Mono, Lookback und Attention an. Wir haben uns für Attention entschieden, weil mit Attention Muster besser erkannt werden und damit generierte Lieder mehr Struktur haben und besser klingen. Zu jeder Konfiguration gibt es auch schon vortrainierte Modelle. Damit können die verschiedenen Modelle ohne Vorbereitung auch schon ausprobiert und verglichen werden. | ||
- | Als nächstes haben wir also unser neuronales Netz trainiert, indem wir die Trainingsdateien dem neuronalen Netz übergeben haben und dieses daraus gelernt hat. Genauer gesagt geht das neuronale Netz ohne Informationen an diese Daten heran und arbeitet dann in dem gegebenen Rahmen. Wir haben die Hyperparameter auf 64 gesetzt, was in diesem Fall bedeutet, dass immer 64 Stücke zusammen angeguckt werden und ein Teil immer aus einer 64x64 Matrix besteht. Je höher diese Zahl desto weiter ist der Rahmen, in dem das neuronale Netz arbeiten kann. Je weiter der Rahmen, desto eher neigen neuronale Netze zu Over Fitting, also fast perfekten Vorhersagen bei den Testdateien und sehr schlechten Vorhersagen bei nicht Testdateien. Wenn der Rahmen zu klein ist, werden die Vorhersagen auch schlecht. Eine gute Veranschaulichung dafür ist, wenn man sich Punkte auf einer Parabel vorstellt dafür eine Gerade zu finden, die alle Punkte möglichst gut trifft. Das kann nie wirklich genau werden, weil die Gerade keine Kurven hat. | + | Als erstes braucht man für Machine Learning immer ein Dataset, also in unserem Fall möglichst viele Midi Dateien. Gemeinsam haben wir einige Songs zusammengetragen und daraus unser Dataset erstellt. |
+ | Um unser neuronales Netz zu trainieren benutzen wir Magenta (baut auf Tensorflow und Keras auf). In Magenta können neuronale Netze aber meistens nicht direkt mit Midi Dateien trainiert werden. Deswegen haben wir anschließend alle Midi Dateien in eine .tfrecord Datei umgewandelt, dabei werden alle Midi Dateien in einer einzigen .tfrecord - Datei zusammengefasst. In der Magenta Dokumentation wird .tfrecord als effizienteres Dateiformat (im Vergleich zu Midi) beschrieben, auf das sich leichter zugreifen lässt. Die entstandene .tfrecord-Datei wird anschließend in Trainings- und Testdateien geteilt. Bei der Erstellung der .tfrecord-Datei muss bereits die Konfiguration, mit der später gearbeitet werden soll, angegeben werden, damit sie entsprechend formatiert wird. | ||
+ | Magenta bietet die Konfigurationen Basic, Mono, Lookback und Attention an. Wir haben uns für Attention entschieden, weil mit Attention Muster besser erkannt werden und damit generierte Lieder mehr Struktur haben. Zu jeder Konfiguration gibt es auch bereits vortrainierte Modelle, so können die Modelle auch ohne Vorbereitung ausprobiert und miteinander verglichen werden. | ||
- | Das neuronale Netz versucht jetzt also praktisch eine möglichst gute Funktion zu finden, um aus gegebenen Daten möglichst nah an die gewünschten Daten zu kommen. Das fordert sehr viel Leistung von einem Computer, da dabei sehr viele Rechnungen durchgeführt werden. Deshalb haben wir ab diesem Schritt mit Google-Colab gearbeitet, da man dort Rechner von Google diese Rechnungen durchführen lassen kann und auch sehr gut mit mehreren Personen an Code arbeiten kann. | + | Als nächstes haben wir also unser neuronales Netz trainiert, indem wir die Trainingsdateien dem neuronalen Netz übergeben haben und dieses daraus gelernt hat. Genauer gesagt geht das neuronale Netz ohne Informationen an diese Daten heran und arbeitet dann in dem gegebenen Rahmen. Wir haben den Hyperparameter "batch size" auf 64 gesetzt, was in diesem Fall bedeutet, dass immer 64 Stücke gemeinsam angeguckt werden und ein Teil aus einer 64x64 Matrix besteht, die Größe der Matrix haben wir mit dem Hyperparameter "rnn_layer_sizes" festgelegt. Je höher diese Zahl desto weiter ist der Rahmen, in dem das neuronale Netz arbeiten kann. Je weiter der Rahmen, desto eher neigen neuronale Netze zu Over Fitting, also fast perfekten Vorhersagen bei den Testdateien und sehr schlechten Vorhersagen bei nicht Testdateien. Wenn der Rahmen zu klein ist, werden die Vorhersagen auch schlecht. Eine gute Veranschaulichung dafür ist, wenn man sich Punkte auf einer Parabel vorstellt dafür eine Gerade zu finden, die alle Punkte möglichst gut trifft. Das kann nie wirklich genau werden, weil die Gerade keine Kurven hat. |
- | Dieses Netzwerk haben wir ungefähr 20000 Durchläufe machen lassen und die Ergebnisse entstanden mit dem so trainierten Netzwerk. | + | |
- | Da mit unserer Methode Midi Dateien mit einem Ton zu jedem gegebenen Zeitpunkt generiert wird, haben wir auch versucht mehrere generierte Midi Dateien übereinander zu legen, damit es sich eher wie ein echtes Musikstück anhört. Die so entstandenen Lieder klingen spannender, aber oft auch sehr durcheinander. Das liegt daran, dass auch wenn das gleiche Netzwerk mehrere Midi Dateien mit dem gleichen Input generiert, diese generierten Dateien nicht aufeinander abgestimmt und teilweise ziemlich unterschiedliche Muster haben. | + | Das neuronale Netz versucht eine Funktion zu finden, die mit gegebenen Daten möglichst nah an die gewünschten Daten herankommt. Das erfordert eine hohe PC-Leistung aufgrund der vielen Rechnungen, weshalb wir ab diesem Schritt mit Google-Colab gearbeitet haben, dort wird der Code über Google Rechner durchgeführt. |
+ | Dieses Netzwerk haben wir ungefähr 20000 Durchläufe machen lassen, woraus dann unsere Endergebnisse entstanden sind. | ||
+ | |||
+ | Da mit unserer Methode immer nur ein Ton pro Zeitpunkt generiert wird (es also keine Akkorde entstehen), haben wir auch versucht mehrere generierte Midi Dateien übereinander zu legen. Die so entstandenen Lieder klingen spannender, aber oft auch sehr durcheinander. Das liegt daran, dass auch wenn das gleiche Netzwerk mehrere Midi Dateien mit dem gleichen Input generiert, diese generierten Dateien nicht aufeinander abgestimmt sind und verschiedene Muster haben können. | ||
**[[Journal]]** | **[[Journal]]** | ||
Zeile 53: | Zeile 55: | ||
**Code:** | **Code:** | ||
- | [[https://colab.research.google.com/drive/1wc5DE3N-9V6jSkt_Dzd3yfvBxMriuHYB?usp=sharing | Google-Colab-Notebook]] | + | {{:ss20:song-generator.ipynb.zip|}} |
+ | **Musikbeispiele (von uns generiert):** | ||
+ | {{:ss20:2020-07-13_162359_10.mid.zip|}} | ||
**Danksagung:** | **Danksagung:** |