Anasayfa / Makine Öğrenmesi / Derin Öğrenme (Deep Learning) / LSTM Ağları ile Yeni Nirvana Şarkısı Bestelemek

LSTM Ağları ile Yeni Nirvana Şarkısı Bestelemek

Merhabalar, bugünkü yazımda sizlere LSTM Ağları ile nasıl şarkı besteleyip, bunu selenium adlı kütüphane ile canlı olarak çalabileceğimizden bahsedeceğim. Yazının içeriği şu şekilde;

  • LSTM Ağları Nedir?
  • Selenium Nedir?
  • Pythonda Keyboard ve Pynput Kütüphaneleri?
  • Next Character Prediction Nedir?
  • LSTM ile Şarkı Bestelemek
    • Nota Verilerinin Alınması
    • Verilerin İşlenmesi
    • X ve Y’lerinin Belirlenmesi
    • Verinin Model için Hazırlanması
    • Modelin Kurulması ve Ayarları
    • Modelin İlk Testleri
  • Bestelenen Şarkının Selenium Yardımıyla Çalınması
    • Sistem Nasıl Çalışıyor?
    • Nota-Keyboard Bağlantısı Nedir?
    • Nota:Keyboard Dictionarysinin Oluşturulması
    • Selenium ile Siteye Bağlanma ve Keyboard ile Notaların Arasında Çalışacak Fonksiyonların Yazılması
    • Verisetinden Seed Seçerek ilk Çıktıların Alınması ve Çalınması
    • Girdilerin Kullanıcı Tarafından Verilip İlk Çıktıların Alınması
  • Çıkan Sonuçlar
  • Bütün Kodlar

İşimiz bittiğinde şunlara benzer birşey elde edeceğiz ;

LSTM(Long-Short-Time-Memory) Ağları Nedir?

  • Uzun kısa süreli bellek (LSTM), değerleri rastgele aralıklarla hatırlayan bir tekrarlayan sinir ağı (RNN) bir mimarisidir. Öğrenilen ilerleme kaydedildiğinde saklanan değerler değiştirilmez. RNN’ler, nöronlar arasında ileri ve geri bağlantılara izin verir.[1]
  • Daha detaylı bilgi için LSTM ile Dolar/TL Kuru Tahmini yazıma göz atabilirsiniz.
  • Projede kullanmak için LSTM’i keras üzerinden çağıracağız. Bunları yüklemek için cmd ekranına şu kodları yazmanız gerekiyor ;
 

Selenium Nedir?

  • Selenium Web testleri için kullanılan bir python kütüphanesi. Selenium sayesinde yazacağınız bot insan gibi davranabiliyor. Bu sayede bazı siteler tarafından direk sitenin yüklenmesiyle gelmeyip, siz bir şeylere tıkladıkça gelen şeyleri çekebiliyorsunuz. Biz bu projede selenium’u web sitesini açarken kullanıyoruz. Burada kritik birkaç şey var;
    • Selenium’u kullanırken chromedriver.exe adlı taşınabilir google chrome üzerinden açılışı yapıyoruz. Bu yüzden bu dosyayı kodlarınızla aynı yerde saklamanız gerekiyor. Bu dosyayı TIKLAYARAK indirebilirsiniz. Onun dışında selenium’u yüklemek için ;

Pythonda Keyboard ve Pynput Kütüphaneleri

  • Bizim için en kritik kütüphaneler bunlar sebebi ise lstm tarafından besteleyeceğimiz şarkıyı bu kütüphaneler yardımıyla çalacağız. Bu kütüphanelerin ikiside klavyede yaptığınız herşeyi yazdığınız kod ile yapabilmemizi sağlıyor.  Bu kütüphaneleri indirmek için yapmanız gereken şey cmd ekranına şu kodu yazmak :

Next Character Prediction Nedir?

Next Character Prediction, yazılan önceki kelimelere göre yazılacak diğer kelimeyi tahmin etmeye deniyor. Örnek olarak telefonlarınızda mesaj yazarken, mesajın tamamlanması ve klavyenin üzerinde cümleyi devam ettirecek yeni kelimeler önerilmesi next character prediction’a örnektir.

LSTM ile Şarkı Bestelemek

Nota Verilerinin Alınması

Nota verilerini Buradan Tek tek şarkılara girerek aldık. Sadece notaları aldık, burada satır aralarında bekleme kısımlarına sleep, şarkının sonuna da new taglarını koyduk. Bu kısımda verileri elle almada yardımcı olan Feyza Zeynep Salam‘a teşekkürler. Nota verilerine TIKLAYARAK erişebilirsiniz.

Verilerin İşlenmesi

Bu kısımda elimizdeki veri şuna benziyordu;

Burada yapmamız gereken birkaç işlem var, öncelikle boşlukları atmalıyız. Ardından bütün notaları bir listenin elemanı haline getirmeliyiz. Onu da şu aşağıdaki kod ile yapacağız.

Öncelikle kütüphanelerimizi ve verisetimizi tanıtalım.

Şimdi ise verimizi listenin elemanları haline getirip boş aralıkları atalım.

Bütün notaları sayı haline getirmemiz gerekiyor bunun için her notaya bir sayı atanan bir dictionary oluşturacağız.

Çıktımız :

X ve Y’lerinin Belirlenmesi

Şimdi ise en önemli kısıma geldik, notaları X ve Y şeklinde belirlemeye. Örneğin, 10 Notalık bir şarkı düşünelim. Buradaki mantık şu şekilde oluyor;

E G C C7 B7 Am Em G C ise ;

E G C C7 B7 Am Em G –> C şeklinde seçiliyor. Burada “E G C C7 B7 Am Em G” bizim X’imiz C bizim Y’miz oluyor.

Evet şimdi bunu verimize uygulayalım;

Bu projede totalde 2559 Örnek ile çalışıyoruz.

Verinin Model için Hazırlanması

Bildiğiniz gibi derin öğrenme çalışmalarında algoritmamızdan daha iyi sonuç almak için veriyi normalize etmeliyiz.

Evet şimdi modelimizi kurabiliriz.

Modelin Kurulması ve Ayarları

Burada model yapısı olarak 3 Hidden Layerlı bir model kullanacağız. Burada hidden_size olarak 512, 100 epoch ve batch_size olarak 5 belirledik. Bu parametrelerin ne olduğunu hiç duymadıysanız bilgilenmek için BURAYA bakabilirsiniz.

Modelimizin Yapısı ;

Modeli fit etmeden önce bu kısımda modelin ağırlıklarını kaydetmek için şu şekilde bir metod uyguluyoruz ;

  • Eğer yeni epochta(period) şu ana kadarki en düşük loss(hata oranı) varsa onun ağırlıklarını kaydet yoksa devam et.
Evet şimdi modelimizi fit edelim.
Çıktılarımız da şu şekilde;
Ve bunun gibi devam ediyor. En son olarak 0.2360 loss’a sahip modelimizin ağırlıklarını birkez daha çağırıp, ilk çıktılarımızı alacağız.

Modelin İlk Testleri

Öncelikle en düşük loss’lu ağırlıkları çağıralım.

Şimdi çıktılar numerik olacağı için onları notaya çevirmek için yukarıdaki oluşturduğumuz nota:numara dictionarysinin tam tersini oluşturmalıyız numara:nota şeklinde;

Şimdi olay başlıyor. Gerçekleşen olay şu, öncelikle başlangıç değerleri veriliyor bunlara göre predictionlar yapılarak sürekli yeni nota tahminleniyor. Ardından sürekli başlangıç değerleri silinerek devam ediliyor.

Örnek

  • D B7 D B7 A G F# sleep A F için bir nota tahmin edildi. Mesela buna **B7** diyelim. Ardından
  • B7 D B7 A G F# sleep A F B7 şeklinde verilip yeni tahmin alınıyor.

Şimdi koduna geçelim.

Çıktılarımız da şu şekilde;

Evet şimdi Selenium ile Bu notaları çaldırmaya bakalım.

Bestelenen Şarkının Selenium Yardımıyla Çalınması

Sistem Nasıl Çalışıyor?

Sistemin çalışma mantığı çok basit. Apronus.com adlı sitedeki Canlı Gitar sayfasını kullanıyoruz. Bu sayfada hem mouse ile hem de klavyedeki tuşlar ile notalara basabiliyorsunuz. Bizde öncelikle siteyi açtırıyoruz. Ardından notalar ile klavyedeki tuşları eşliyoruz. Biz notayı verdiğimizde eşlendiği klavye tuşuna basıp notayı çalıyor.

Nota-Keyboard Bağlantısı Nedir?

Apronus.com üzerinde Her nota için klavyede bir tuş var. Örnek vermek gerekirse “G” notası için a tuşuna basmak yeterli.  Bizde burada bütün tuşların notalar ile bağlantısına bakarak bunları bir dictionary’e kaydedeceğiz.

Nota:Keyboard Dictionarysinin Oluşturulması

Evet şimdi ise selenium fonksiyonlarını oluşturalım

Selenium ile Siteye Bağlanma ve Keyboard ile Notaların Arasında Çalışacak Fonksiyonların Yazılması

Öncelikle Tuşa basma fonksiyonunu yazalım.

Şimdi ise Direkt nota listesini verince yukarıdaki Press Fonksiyonunu kullanan ve siteyi açan ana fonksiyonumuzu yazalım.

Evet şimdide öncelikle modelimizi çağıralım. Ardından verisetinden rastgele bir kısım alıp başlangıcı orası yapıp nota ürettirelim. Yeni notaları üretmemizi sağlayacak random kısmı kendi verisetimizden seçebilir veya kendimiz belirleyebiliriz. Ben burada verisetinden seçmek istediğim için verisetini tanımlıyorum.

Bu kısımda daha önceden Eğitilmiş modeli çağırıyorum. Sadece mimarisini tanıtıp, ağırlıkları tanımlıyor ve kullanıma hazır hale getiriyorum.

Evet şimdi rastgele bir kısım alıp tahminleme yaptıracağım.

Çıktılarım ise şu şekilde;

Şimdi bu çıktıları selenium yardımıyla çaldırmak istiyorum. Burada bana numaraların olduğu bir pattern dizisi döndürüyor. Ben bu dizideki numaraları az önce kurduğum numara:nota dictionarysi ile notalara çevireceğim. Ve bu notaların listesini de Selenium içinde yazdığım Play Fonksiyonuna vereceğim ve kod çalışacak.

Şimdi ise notaları selenium’a verelim. Ve Çalıştıralım.

Ve ortaya çıkacak olay şu şekilde olacak;

Evet şimdi en güzel kısma yani ortaya çıkan sonuçlara gelelim;

Çıkan Sonuçlar

Çıkan sonuçlarımız şu şekilde;

LSTM Guitar v1- Loss ortalama 1-1.5 arasındayken ortaya çıkan parça, biraz kendi kendini tekrarlıyor ama anlamlı gibi 🙂

Şimdi ise Loss’un 0.26 olduğu kısımda ortaya çıkan kısa parçamıza bakalım 🙂 Bu biraz daha anlamlı

Bütün Kodlar

Bütün kodlara BURAYA tıklayarak github hesabımdan erişebilirsiniz. Buraya kadar gelip okuduğunuz için teşekkür ederim. Merak ettiklerinizi yorumlarda yazmayı unutmayın.

Referanslar

[1] https://veribilimcisi.com/2017/09/26/uzun-kisa-sureli-bellek-long-short-term-memory/

[2] https://www.veribilimiokulu.com/lstm-ile-dolartl-kuru-tahmini/

[3] http://www.akormerkezi.net/nirvana_akorlar-tablar-fnj-1.html

[4] https://apronus.com/music/onlineguitar.htm

 

 

Hakkında Yunus Emre GÜNDOĞMUŞ

Machine Trainer & Junior Data Scientist

GÖZ ATMAK İSTEYEBİLİRSİNİZ

R ile Sıralı Logit Modelleri

Herkese merhaba, bu yazıda sıralı logit modelleri ve bu modellerin tahmincileri üzerine bir uygulama yapacağız. …

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir