Menulis musik secara otomatis
Hampir segera setelah saya belajar pemrograman, saya ingin membuat perangkat lunak yang mampu membuat musik.
Selama beberapa tahun saya membuat upaya primitif untuk secara otomatis mengarang musik untuk
Visions of Chaos . Pada dasarnya, rumus matematika sederhana atau mutasi genetik dari urutan acak catatan digunakan. Setelah baru-baru ini mencapai keberhasilan sederhana dalam studi dan penerapan TensorFlow dan jaringan saraf untuk
mencari automata seluler , saya memutuskan untuk mencoba menggunakan jaringan saraf untuk membuat musik.
Bagaimana cara kerjanya
Komposer mengajarkan jaringan saraf dengan memori jangka pendek (LSTM). Jaringan LSTM sangat cocok untuk memprediksi apa yang terjadi selanjutnya dalam urutan data. Baca lebih lanjut tentang LSTM di
sini .
Jaringan LSTM menerima berbagai urutan catatan (dalam hal ini, ini adalah file midi saluran tunggal). Setelah pelatihan yang cukup, ia mendapat kesempatan untuk membuat musik yang mirip dengan materi pengajaran.
Internal LSTM mungkin tampak menakutkan, tetapi menggunakan
TensorFlow dan / atau
Keras sangat menyederhanakan pembuatan dan eksperimen LSTM.
Sumber musik untuk pelatihan model
Untuk jaringan LSTM yang begitu sederhana, cukup bagi kami bahwa komposisi sumber adalah saluran midi tunggal. Bagus untuk ini adalah file midi dari solo ke piano. Saya menemukan file midi dengan solo piano di
Piano Klasik Page dan
mfiles , dan menggunakannya untuk melatih model saya.
Saya memasukkan musik komposer yang berbeda ke dalam folder terpisah. Berkat ini, pengguna dapat memilih Bach, klik tombol Tulis dan dapatkan lagu yang (semoga) akan seperti Bach.
Model LSTM
Model yang menjadi dasar saya menulis kode memilih
contoh penulis
Sigurður Skúli Sigurgeirsson ini , tentang siapa yang ia tulis secara lebih rinci di
sini .
Saya menjalankan skrip lstm.py dan setelah 15 jam itu menyelesaikan pelatihan. Ketika saya menjalankan predict.py untuk menghasilkan file midi, saya kecewa karena mereka terdiri dari satu catatan berulang. Mengulangi pelatihan dua kali, saya mendapat hasil yang sama.
Model sumber
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"])
Setelah menambahkan output grafik ke skrip, saya melihat mengapa model saya tidak berfungsi. Akurasi tidak tumbuh seiring waktu, sebagaimana mestinya. Lihat di bawah di pos untuk grafik yang bagus yang menunjukkan bagaimana model kerja seharusnya terlihat.
Saya tidak tahu mengapa itu terjadi. tetapi meninggalkan model ini dan mulai menyesuaikan pengaturan.
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"])
Ini lebih kompak dan memiliki lebih sedikit lapisan LSTM. Saya juga menambahkan BatchNormalisasi, melihatnya di
video sentdex . Kemungkinan besar, ada model yang lebih baik, tetapi yang ini bekerja cukup baik di semua sesi pelatihan saya.
Perhatikan bahwa di kedua model saya mengganti LSTM dengan CuDNNLSTM. Jadi saya mencapai pelatihan LSTM yang jauh lebih cepat berkat penggunaan Cuda. Jika Anda tidak memiliki
GPU dengan dukungan Cuda , maka Anda harus menggunakan LSTM. Terima kasih kepada
sendtex untuk tip ini. Mempelajari model baru dan menyusun file midi menggunakan CuDNNLSTM sekitar lima kali lebih cepat.
Berapa lama model harus dilatih
Kesamaan hasil dengan musik asli tergantung pada durasi pelatihan model (jumlah era). Jika ada terlalu sedikit era, maka hasil yang dihasilkan akan memiliki terlalu banyak catatan berulang. Jika ada terlalu banyak era, model akan dilatih ulang dan cukup menyalin musik asli.
Tapi bagaimana Anda tahu berapa era untuk berhenti?
Solusi sederhana adalah menambahkan callback yang menyimpan model dan grafik akurasi / kehilangan setiap 50 era pada pelatihan yang dijalankan dalam 500 era. Berkat ini, setelah menyelesaikan pelatihan, Anda akan mendapatkan model dan grafik dengan kenaikan 50 era, yang menunjukkan bagaimana pelatihan berlangsung.
Berikut adalah hasil grafik dari satu menjalankan dengan menyimpan setiap 50 era, digabungkan menjadi satu GIF animasi.
Ini adalah grafik yang ingin kita lihat. Kerugian harus jatuh dan tetap rendah. Akurasi harus meningkat dan tetap mendekati 100%.
Penting untuk menggunakan model dengan jumlah zaman yang sesuai dengan saat ketika grafik pertama kali mencapai batasnya. Untuk grafik yang ditunjukkan di atas, itu akan menjadi 150 era. Jika Anda menggunakan model lama, mereka akan dilatih ulang dan kemungkinan besar akan mengarah pada penyalinan sederhana dari bahan sumber.
Model yang sesuai dengan kolom ini dilatih pada file midi dari kategori Lagu Kebangsaan yang diambil
dari sini .

Output data midi dalam model dengan 150 era.

Output Midi dalam model 100-zaman.
Bahkan model dengan 100 era dapat menyalin sumber terlalu akurat. Ini mungkin disebabkan oleh sampel file midi yang relatif kecil untuk pelatihan. Dengan lebih banyak catatan, belajar lebih baik.
Ketika belajar memburuk
Gambar di atas menunjukkan contoh apa yang bisa dan tidak terjadi selama pelatihan. Kerugian berkurang, dan akurasi meningkat, seperti biasa, tetapi tiba-tiba mereka mulai menjadi gila. Pada tahap ini, mungkin juga layak untuk dihentikan. Model tidak akan lagi (setidaknya dalam pengalaman saya) belajar dengan benar lagi. Dalam hal ini, model yang disimpan dengan 100 era masih terlalu acak, dan dengan 150 era saat kegagalan model telah berlalu. Sekarang saya diselamatkan setiap 25 era untuk menemukan momen ideal model dengan pelatihan terbaik, bahkan sebelum dia berlatih kembali dan jatuh.
Contoh lain dari kesalahan belajar. Model ini dilatih pada file midi yang diambil
dari sini . Dalam hal ini, ia bertahan dengan baik selama sedikit lebih dari 200 era. Saat menggunakan model dengan 200 era, hasil berikut diperoleh dalam Midi.

Tanpa pembuatan grafik, kita tidak akan pernah tahu apakah model memiliki masalah dan kapan mereka muncul, dan juga tidak bisa mendapatkan model yang baik tanpa memulai dari awal.
Contoh lainnya

Model dengan 75 era, dibuat berdasarkan komposisi
Chopin .

Model 50-era berdasarkan
file Midi untuk komposisi Natal .

Model 100 zaman berdasarkan
file Midi untuk komposisi Natal . Tetapi apakah mereka benar-benar "Natal"?

Model 300 zaman berdasarkan file Bach Midi yang diambil
dari sini dan
dari sini .

Model 200 zaman yang didasarkan pada satu-satunya file Midi milik Balakirev yang diambil di
sini .

Model dengan 200 era, berdasarkan komposisi
Debussy .

Model era 175 berdasarkan komposisi Mozart.

Model dengan 100 era berdasarkan komposisi
Schubert .

Model era 200 berdasarkan komposisi
Schumann .

Model era 200 berdasarkan komposisi
Tchaikovsky .

Model dengan 175 era berdasarkan lagu daerah.

Model dengan 100 era berdasarkan lagu pengantar tidur.

Model 100-era berdasarkan musik pernikahan.

Model 200 zaman yang didasarkan pada file midi saya sendiri yang diambil dari soundtrack
video YouTube saya. Mungkin sedikit dilatih ulang karena pada dasarnya menghasilkan salinan file midi pendek satu dan dua langkah saya.
Skor
Setelah Anda
mendapatkan file midi, Anda dapat menggunakan alat online seperti
SolMiRe untuk mengonversinya menjadi skor. Di bawah ini adalah skor file 200-midi Softology midi yang disajikan di atas.
Di mana saya bisa menguji komposer
Komposer LSTM sekarang termasuk dalam
Visions of Chaos .
Pilih gaya dari daftar tarik-turun dan klik Tulis. Jika Anda telah menginstal Python dan TensorFlow minimum yang diperlukan (lihat instruksi di
sini ), maka dalam beberapa detik (jika Anda memiliki GPU cepat), Anda akan menerima file midi baru yang dibuat mesin yang dapat Anda dengarkan dan gunakan untuk tujuan lain. Tidak ada hak cipta, tidak ada royalti. Jika Anda tidak menyukai hasilnya, Anda dapat mengklik Menulis lagi dan setelah beberapa detik komposisi baru akan siap.
Hasilnya belum dapat dianggap sebagai komposisi lengkap, tetapi mereka memiliki urutan kecil yang menarik dari catatan yang akan saya gunakan untuk membuat musik di masa depan. Dalam hal ini, komposer LSTM dapat menjadi sumber inspirasi yang baik untuk komposisi baru.
Sumber python
Di bawah ini adalah kode skrip Python yang saya gunakan untuk pelatihan dan perkiraan LSTM. Agar skrip ini berfungsi, tidak perlu menginstal Visions of Chaos, dan mempelajari dan menghasilkan midi akan bekerja dari baris perintah.
Berikut ini script pelatihan
lstm_music_train.py
Dan inilah skrip generasi midi
lstm_music_predict.py
:
Ukuran file model
Kerugian dari memasukkan jaringan saraf dalam Visions of Chaos adalah ukuran file. Jika generasi model lebih cepat, maka saya hanya akan menambahkan tombol sehingga pengguna akhir dapat melatih model sendiri. Tetapi karena beberapa sesi pelatihan untuk banyak model dapat memakan waktu beberapa hari, ini tidak terlalu praktis. Tampak bagi saya bahwa lebih baik melakukan semua pelatihan dan menguji diri sendiri, dan hanya menambahkan model kerja terbaik. Ini juga berarti bahwa pengguna akhir hanya perlu menekan tombol, dan model yang terlatih akan membuat komposisi musik.
Masing-masing model memiliki ukuran 22 megabyte. Dalam kondisi Internet modern, ini tidak begitu banyak, tetapi selama bertahun-tahun perkembangan, Visions of Chaos telah tumbuh dalam ukuran secara bertahap, dan hanya baru-baru ini tiba-tiba meningkat dari 70 menjadi 91 MB (karena model pencarian otomat seluler). Oleh karena itu, saya sejauh ini hanya menambahkan satu model ke installer Visions of Chaos utama. Untuk pengguna yang menginginkan lebih, saya memposting tautan ke model 1 GB lainnya. Mereka juga dapat menggunakan skrip di atas untuk membuat model mereka sendiri berdasarkan file midi mereka.
Apa selanjutnya
Pada tahap ini, komposer LSTM adalah contoh paling sederhana menggunakan jaringan saraf untuk menggubah musik.
Saya telah menemukan komposer musik lain di jaringan saraf yang akan saya coba di masa depan, sehingga Anda dapat berharap bahwa dalam Visions of Chaos akan ada kemungkinan baru untuk membuat musik secara otomatis.