Birkaç gün önce, LSTM RNN’yi (Long Short Term Memory Recurrent Neural Networks) öğrenmeye karar verdim, hali hazırda Andrew NG tarafından verilen kursu aldığım için teorik olarak bilgim bulunmaktaydı fakat kodlama konusunda eksiklerim olduğunun ve bunu bir proje yaparak öğrenmenin iyi bir fikir olacağını düşündüm.

LSTM RNN’nin çok sayıda uygulaması vardır. Ben her zaman metin verilerinin nasıl işleneceğini, bir metinin duygusunun analizini, şiir ve şarkı yazdırmasını öğrenmek istediğim için projeyi bu konulardan birisi üzerinde yapmaya karar verdim ve Sezen Aksunun şarkılarını öğrenip yine Sezen Aksu gibi şarkı yazan bir model oluşturmaya karar verdim.

Peki Nedir Bu LSTM Tekrarlayan Sinir Ağları?

RNN vs LSTM
Örnek bir LSTM Yapısı
LSTM recurrent neural network içinde döngülerin bulunduğu bir ağ türü olmakla birlikte bilgilerin kendi içinde tutulmasını ve bir sonraki düğüme aktrılmasına izin verir. Her bir düğüme LSTM(Long short term memory) denir.LSTM ünitesindeki bir hücre, input, output ve forget kapılarından oluşmaktadır. Hücre, keyfi zaman aralıklarında değerleri hatırlar ve üç geçit, hücrenin içine ve dışına bilgi akışını düzenler. LSTM RNN hakkında daha fazla bilgi almak isterseniz size şu makaleleri tavsiye ederim. Understanding LSTM Networks ve Long short-term memory Ayrıca maddi durumunuza ve ingilizce seviyenize göre Andrew NG’nin Coursera’da bulabileceğiniz Deep Learning Specialization kursunu şiddetle tavsiye ederim.

LSTM RNN Uygulamaları
LSTM Recurrent neural networks birçok uygulamada kullanılmaktadır, aşağıdakiler en popüler olanlardır:
      • Doğal dil işleme
      • Doğal dil işleme
      • Video to text
      • Çeviri uygulaması

      LSTM ve RNN hakkında biraz bilgimiz olduğuna göre artık projemize başlayabiliriz.
      Öncelikle modeli oluşturmak için iki farklı yöntem izleyeceğiz.

      • Sıfırdan kendi modelimizi oluşturma
      • Textgenrnn kütüphanesi ile model oluşturma

      Verisetinin oluşturulması

      Sezen aksunun şarkılarının sözlerinin yer aldığı bir veri setini bulamadım, bunun yerine yabancı birçok şarkıcının veriseti internette bulunmakta, bende sezen aksuya olan hayranlığımdan dolayı kendi verisetimi oluşturmaya karar verdim. Fakat sezen aksunun birçok şarkısı var ve her bir şarkının sözlerini tek tek kopyala yapıştır yapmak yerine neredeyse birçok şarkısının sözlerinin yer aldığı bir siteden verileri çekmeye karar verdim.
      Beautiful Soup

      BeautifulSoup, HTML veya XML dosyalarını işlemek için oluşturulmuş güçlü ve hızlı bir kütüphanedir. Bu modül ile bir kaynak içerisindeki HTML kodlarını ayrıştırıp sadece istediğimiz alandaki verileri alabiliriz.

      Ben bu sitedeki verileri almayı planladım. Dilerseniz adım adım nasıl yapıldığına bakalım.

      import requests
      import csv
      from bs4 import BeautifulSoup, NavigableString, Tag
      from google.colab import files
      import pandas as pd

      # Sanatşı sayfasındaki verilerin alınması
      sayfa = requests.get('https://www.sarkisozleri.bbs.tr/sanatci/181/sezen-aksu')
      soup = BeautifulSoup(sayfa.text, 'html.parser')

      # şarkıların bulunduğu div'in seçilmesi
      sarkilar = soup.find(class_='col-sm-8 col-md-6 col-lg-8')

      # div etiketinin içindeki <a> taglarının seçilmesi
      sarki_adlari = sarkilar.find_all('a')
      print(sarki_adlari)

      Bu işlem sonucunda aşağıdak gibi şarkıa adlarını ve her bir şarkının sözlerinin bulunduğu şarkı adreslerini elde ederiz.

      Sezen Aksu Sarki
      Şarkı adları ve adresleri

      Şimdi her bir şarkının adresine gidip sözleri csv dosyasına kaydedelim

      # sarki sözlerinin yazılacağı dosyanın oluşturulması ve başlık satırının eklenmesi
      f = csv.writer(open('Sezen Aksu.csv', 'w', newline='', encoding='utf-8-sig'))
      f.writerow(['Sanatçı Adı','Şarkı Id','Şarkı Adı', 'Şarkı Sözü','Satır No'])
      sarki_id=1 # her bir şarkıya ait id

      # her bir şarkı için dön
      for sarki in sarki_adlari:
      sarki_adi = sarki.contents[0]
      print(sarki_adi)
      sarki_link = "https://www.sarkisozleri.bbs.tr"+sarki.get('href')
      sarki_sayfasi = requests.get(sarki_link)
      soup = BeautifulSoup(sarki_sayfasi.text, 'html.parser') # sözlerin bulunduğu sayfayı parse et

      sarki_sozu = soup.findAll(class_='col-md-6') # sadece sözlerin bulunduğu div'i seç
      satir_no=1

      # her bir şarkı sözü için dön
      for sarki_satirlar in sarki_sozu:
      for br in sarki_satirlar.findAll('br'): # sözleri satır satır kaydedeceğimiz için her bir <br> tagından böl
      sarki_satir=br.previous_sibling # birinci satıra geri git

      # <br> taglarını sil ve sözleri satır satı kaydet
      if not (sarki_satir and isinstance(sarki_satir,NavigableString)):
      continue
      sarki_satir_2 = sarki_satir.nextSibling

      if sarki_satir_2 and isinstance(sarki_satir_2,Tag) and sarki_satir_2.name == 'br':
      soz = str(sarki_satir).strip()
      if soz:
      f.writerow(['Sezen Aksu',sarki_id,str(sarki_adi).strip(), soz,satir_no])
      satir_no=satir_no+1
      sarki_id=sarki_id+1;

      Yukarıdaki kod ile Sezen Aksu.csv dosyası oluşturduk. Daha sonra her bir şarkı için bir döngü oluşturduk, bu döngü her bir şarkının sözlerinin bulunduğu sayfaya gidecek ve bu sayfa içindeki sözlerin bulunduğu divi seçip şarkı sözlerini kaydedecek, fakat burada bizim istediğimiz şey sözlerin tümünü tek seferde değil satır satır kaydetmek, bu sebeple her bir satır için ikinci bir döngü oluşturdum. daha sonra her bir <br> tagı arasındaki sözleri sırası ile kaydettim.

      dataset = pd.read_csv('Sezen Aksu.csv', encoding = "utf_8")
      dataset.head()
      files.download('Sezen Aksu.csv')
      dataset
      Verisetinin önizlemesi

      Verisetini hazırladığımmıza göre artık projeye başlayabiliriz. Önce gerekli kütüphaneleri import edelim.

      # Gerekli kütüphaneleri import edelim
      import numpy as np
      import pandas as pd
      import sys
      from keras.models import Sequential
      from keras.layers import LSTM, Activation, Flatten, Dropout, Dense, Embedding, TimeDistributed, CuDNNLSTM,BatchNormalization
      from keras.callbacks import ModelCheckpoint,EarlyStopping
      from keras.utils import np_utils
      from keras import optimizers
      from sklearn.model_selection import train_test_split
      from keras.callbacks import TensorBoard
      from time import time
      from google.colab import files

      Ben Colab üzerinde çalıştığım için verisetini projeye dahil etmem gerekli fakat siz lokal jupyter notebook üzerinde çalışıyorsanız verisetini upload etmenize gerek yok.

      # verisetini yükleyelim
      uploaded = files.upload()

      # yüklenen verisetini seçelim
      dataset = pd.read_csv('Sezen Aksu.csv', encoding = "utf_8")
      dataset.head()

      Verisetini projeye dahil ettik. Şimdi verisetini düzenleme kısmına geçelim. Modelin eğitimi için sadece şarkı sözleri gerekli o halde sadece şarkı sözlerini seçelim ve her bir şarkının sözlerini kendi içinde birleşecek şekilde kaydedelim.

      def processFirstLine(lyrics, songID, songName, row):
      lyrics.append(row['Şarkı Sözü'] + '\n')
      songID.append(row['Şarkı Id'])
      songName.append(row['Şarkı Adı'])
      return lyrics,songID,songName

      # Boş listeleri tanımlayalım (lyrics , songID , songName)
      lyrics = []
      songID = []
      songName = []

      # songNumber verisetindeki şarkının sırasını belirtir.
      songNumber = 1
      # i veisetindeki şarkı sözünün sırasını belirtir.
      i = 0
      isFirstLine = True
      # Her bir satırdaki verileri sırası ile birleştirelim.
      for index,row in dataset.iterrows():
      if(songNumber == row['Şarkı Id']):
      if (isFirstLine):
      lyrics,songID,songName = processFirstLine(lyrics,songID,songName,row)
      isFirstLine = False
      else :
      # Eğer aynı şarkıdaysak birleştirmeye devam edelim
      lyrics[i] += row['Şarkı Sözü'] + '\n'
      # Aynı şarkı için söz birleştirme işlemi bittiyse bir sonrarki şarkıya geç:
      else :
      lyrics,songID,songName = processFirstLine(lyrics,songID,songName,row)
      songNumber = row['Şarkı Id']
      i+=1
      Şimdi LSTM RNN’de kullanmak için sözleri bir metin dosyasına kaydedelim:
      # Sözleri .txt dosyasına kaydedelim
      with open('lyricsText.txt', 'w',encoding="utf-8") as filehandle:
      for listitem in lyrics:
      filehandle.write('%s\n' % listitem)
      İstenen verileri verisetinden aldıktan sonra, ön işleme(preprocesing) işelmi yapalım.

      Şarkı sözlerinin önişlenmesi

      1. Şarkının küçük harfe dönüştürülmesi
      # yeni verisetini yükle ve tüm karakterleri küçük harfe dönüştür :
      textFileName = 'lyricsText.txt'
      raw_text = open(textFileName, encoding = 'UTF-8').read()
      raw_text = raw_text.lower()
      2. Harflerin eşlenmesi
      İki tane sözlük(dictionary) oluşturalım, bir tanesi her bir karakterin int karşılığı diğeri ise her bir int değerin karakter karşılığını tutsun.
      # her karakteri int <=> char türünde dönüştürelim
      chars = sorted(list(set(raw_text)))
      int_chars = dict((i, c) for i, c in enumerate(chars))
      chars_int = dict((i, c) for c, i in enumerate(chars))
      Toplam char ve unique char sayısı:
      n_chars = len(raw_text)
      n_vocab = len(chars)
      print('Toplam karakter sayısı :' , n_chars) # lyricsText.txt dosyasındaki tüm harf sayısı
      print('Unique karakter sayısı : ', n_vocab) # farklı harakter sayısı

      Toplam karakter sayısı : 340460
      Unique karakter sayısı : 61

      3. Verisetinin Input ve Target olarak oluşturulması

      LSTM RNN’i beslemek için verisetini input ve target olarak ayarlayalım:

      # verisetinin işlenmesi:
      seq_len = 100
      data_X = []
      data_y = []
      for i in range(0, n_chars - seq_len, 1):
      # Input Sequeance(Input olarak kullanılacak)
      seq_in = raw_text[i:i+seq_len]
      # Output sequence (Target olarak kullanılacak)
      seq_out = raw_text[i + seq_len]
      # Input verisini data_X olarak saklayalım
      data_X.append([chars_int[char] for char in seq_in])
      # Target verilerini data_y olarak saklayalım
      data_y.append(chars_int[seq_out])
      n_patterns = len(data_X)
      print( 'Veri setindeki toplam veri sayısı : ', n_patterns)
      4. Verisetinin son işleminin tamamlanması

      Modelin eğitilebilmesi için verilerin son işlemlerini gerçekleştirelim.
      Bu işlemler:

      • Verilerin yeniden şekillendirilmesi
      • Normalize edilmesi
      • One hot encoding
      # data_x verisinin LSTM RNN' de işlenecek şekilde yeniden düzenlenmesi:
      X = np.reshape(data_X , (n_patterns, seq_len, 1))
      # verilerin normalize edilmesi:
      X = X/ float(n_vocab)
      # Target verisi için One hot encoding:
      y = np_utils.to_categorical(data_y)

      Verisetini oluşturup düzenlediğimize göre artık eğitim ve test olarak ikiye ayırabiliriz.

      # eğitim ve test verilerini oluşturalım
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, shuffle=True, random_state=64)
      print (X_train.shape, y_train.shape)
      print (X_test.shape, y_test.shape)

      Verilerin %10’unu test için ayırdık. Artık LSTM RNN modelini oluşturmaya başlayabiliriz.

      Modelin Oluşturulması

      Modeli oluşturmadan önce LSTM ve CuDNNLSTM arasındaki farkı bakalım: Aralarındaki en temel fark, LSTM cpu kullanırken CuDNNLSTM gpu kullanır, buda CuDNNLSTM’in daha hızlı olduğu anlamına gelir. (yaklaşık x15 kat daha hızlı)

      Bu nedenle LSTM yerine CuDNNLSTM’i tercih ediyoruz.

      Eğer colab üzerinde çalışıyorsanız runtime ayarlarından GPU’yu seçmeyi unutmayın, eğer lokal jupyter notebook üzerinde çalışıyorsanız Nvidia tarafından geliştirilen cuda ve CuDNN kütüphanelerini yüklemeyi unutmayın.

      Kurulum işlemleri tamamlandıktan sonra modeli oluşturmaya başlayabiliriz. Öncelikle ardışık bir model inşa edelim, giriş katmanı olarak 512 nörondan oluşan ve [32,1] adet giriş verisi alan bir katman tanımlayalım, daha sonra aşırı öğrenme yani overfitting’i önlemek için bir adet batc norm ve arkasına yine 512 adet nörondan oluşan bir gizli CuDNNLSTM katmanı ekleyelim. Oluşturulan 2 boyutlu veriyi 1 boyutlu bir diziye dönüştürmek için flatten katmanı ekleyelim, daha sonra sınıflandırma işlemini yapmak için bir adet 61 adet nörondan oluşan ve ativasyon fonksiyonunu ‘softmax’ olarak belirlediğimiz dense katmanı ekleyelim.

      Modeli oluşturduk, şimdi modeli şu parametreler ile derleyelim:

      # modelin oluşturulması 
      model = Sequential()

      model.add(CuDNNLSTM(512, input_shape =(X_train.shape[1], X_train.shape[2]), return_sequences = True,name='input'))
      model.add(BatchNormalization(name='BatchNorm'))
      model.add(CuDNNLSTM(512, return_sequences=True, name='CuDNNLSTM'))

      model.add(Flatten(name='Flatten'))

      model.add(Dense(y.shape[1],name='FullyConnected'))
      model.add(Activation('softmax',name='output'))

      adam=optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=1e-6, amsgrad=False)

      model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics=['accuracy'])
      model.summary()

      Modeli derledikten sonra model detaylarını görmek için model.summary() kodunu kullanabiliriz.

      _________________________________________________________________
      Layer (type) Output Shape Param #
      =================================================================
      input (CuDNNLSTM) (None, 32, 512) 1054720
      _________________________________________________________________
      BatchNorm (BatchNormalizatio (None, 32, 512) 2048
      _________________________________________________________________
      CuDNNLSTM (CuDNNLSTM) (None, 32, 512) 2101248
      _________________________________________________________________
      Flatten (Flatten) (None, 16384) 0
      _________________________________________________________________
      FullyConnected (Dense) (None, 61) 999485
      _________________________________________________________________
      output (Activation) (None, 61) 0
      =================================================================
      Total params: 4,157,501
      Trainable params: 4,156,477
      Non-trainable params: 1,024
      _________________________________________________________________

      Modeli tanımladık, şimdi callbacks’leri tanımlayalım. 
      Peki nedir bu callback? Callback her epoch’tan sonra cağrılan bir fonksiyondur.

      Ben 3 farklı callback tanımladım, bunlar;

      • Her epochtan sonra modelin kayıp fonksiyonunda iyileştime olmuşsa modeli kaydetmeye yarayan checkpoint.
      • Modelin gelişimi anlık ve grafiksel olarak gelişimini tensorboard ekranından görmek için tensorboard. 
        (verilerin bulunduğu dosyada cmd açın ve tensorboard — logdir=logs/komutunu çalıştırın, daha sonra browserdan http://localhost:6006/#scalars adresini açın. Artık model eğitilirken modelin gelişimini anlık olarak görebilirsiniz.)
      • Modelin gelişim gösteremediği 3 epochtan sonra daha fazla eğitime devam edip zaman kaybeymek yerine eğitimi bitirmeye yarayan early_stopping.
      # Checkpoit oluşturalım :
      checkpoint_name = 'Sezen-Aksu-Epoch_{epoch:02d}-Acc_{acc:.2f}-Val_Acc_{val_acc:.2f}.hdf5'
      checkpoint = ModelCheckpoint(checkpoint_name, monitor='loss', verbose = 1, save_best_only = True, mode ='min')

      #Modelin gelişimi grafiksel olarak görmek için tensorboar kullanalım
      tensorboard = TensorBoard(log_dir="logs/{}".format(time()),
      write_graph=False,
      write_images=True,
      batch_size = 1024,
      write_grads=True)

      # Model gelişim göstermezse daha fazla vakit kaybetmeyelim
      earlyStopping=EarlyStopping(monitor='val_loss',
      min_delta=0,
      patience=3,
      verbose=1,
      mode='auto',
      baseline=None,
      restore_best_weights=False)

      callbacks_list = [checkpoint,earlyStopping,tensorboard]

      Artık modeli eğitmeye başlayabiliriz.

      Eğitim

      Modeli eğitirken birden çok parametre kullanırız. Bu parametreler modelin aşırı öğrenmesini engellemek için veya modelin eğitiminin hızı için çok önemlidir. Ben birden çok parametre üzerinde oynamalar yaparak optimum halini bulmaya çalıştım, tabi bu uzun bir süre gerektirdi, siz de parametreler ile oynayarak daha iyi sonuçlar üretebilirsiniz.

      # Modeli eğitelim :
      history = model.fit(X_train, y_train,
      epochs = 150,
      batch_size = 1024,
      callbacks= callbacks_list,
      verbose = 1,
      validation_data = (X_test, y_test),
      initial_epoch = 0)
      Train on 306385 samples, validate on 34043 samples
      Epoch 1/150
      306385/306385 [==============================] - 121s 394us/step - loss: 3.0673 - acc: 0.1379 - val_loss: 2.9531 - val_acc: 0.1634

      Epoch 00001: loss improved from inf to 3.06729, saving model to Sezen-Aksu-Epoch_01-Acc_0.14-Val_Acc_0.16.hdf5
      Epoch 2/150
      306385/306385 [==============================] - 120s 392us/step - loss: 2.8149 - acc: 0.1774 - val_loss: 2.8241 - val_acc: 0.1720
      ...
      Epoch 95/150
      306385/306385 [==============================] - 121s 394us/step - loss: 0.0760 - acc: 0.9936 - val_loss: 0.5620 - val_acc: 0.9041

      Epoch 00095: loss improved from 0.07969 to 0.07599, saving model to Sezen-Aksu-Epoch_95-Acc_0.99-Val_Acc_0.90.hdf5
      Epoch 00095: early stopping
      trainaccuracy
      Modelin gelişiminin gösterimi

      Eğitim sırasında başarım oranı gelişen modeli checkpoint sayesinde kaydettik, daha sonraki aşamalarda modeli tekrar eğitmek yerine kaydedilen modeli kullanabiliriz.

      Model Ağırlıklarının yüklenmesi
      # model ağırlıklarının yüklenmesi :
      wights_file = 'Sezen-Aksu-Epoch_95-Acc_0.99-Val_Acc_0.90.hdf5'
      model.load_weights(wights_file)
      model.compile(loss = 'categorical_crossentropy', optimizer = adam)

      Eğitilmiş model yüklendikten sonra yeni şarkılar yazdırılmaya başlanabilir.

      Şarkı sözü oluşturma

      Modelin şarkı sözüoluşturnası için sezen aksu şarkılarından rastele bir şarkı öbeği seçeceğiz, ardından eğitilmiş modelimiz bu şarkı öbeğine göre karakterler üretip şarkı yazmaya çalışacak.

      # rastgele bir şarkı öbeği seç:
      start = np.random.randint(0, len(data_X)-1)
      pattern = data_X[start]
      print('Seçilen söz : ')
      print("\"",''.join([int_chars[value] for value in pattern]), "\"\n")
      # karakter olarak oluşturulmak istenen şarkı uzunluğu
      generated_characters = 300
      # karakter üret:
      for i in range(generated_characters):
      x = np.reshape(pattern, ( 1, len(pattern), 1))
      x = x / float(n_vocab)
      prediction = model.predict(x,verbose = 0)
      index = np.argmax(prediction)
      result = int_chars[index]
      sys.stdout.write(result)
      pattern.append(index)
      pattern = pattern[1:len(pattern)]
      print('\Bitti')

      Çıktı:

      Seçilen söz : 
      "gitme dur daha şimdiden deliler "

      gibi özledim
      i̇kimiz içinde doğru olan böylesi git
      i̇nan bana sandığın kadar bile haçırım var
      van yaylar
      hayırsıl tüsü dklerin dükülden girki gelen kardığınmeyin
      bereen o çücül tür gelme
      teni gördüm uan
      bir dünya bir tırd gön eelir
      yat oomadak tenenen aşkın oldum dilere gamiı yon
      yuruş malpi ee göl
      Bitti
      Rahat bir şekilde görebilirsiniz ki üretilen sözler gerçek değil ve birçok yazım hatası var. Parametreler ile oynayarak belki daha iyi bir sonuç üretebilirsiniz fakat eğitim süresi hesaba katılırsa epeyce bir vakit gerekli olduğunu tahmin edebilirsiniz.

      Textgenrnn keras ve tensorflow ile geliştirilmiş bir char-rnn kütüphanesidir. bu kütüphane ile karakter veya kelime seviyesinde yeni veriler üretebilirsiniz.

      Nasıl kullanılıdığı ve yeni bir modelin nasıl oluşturulduğuna kendi sayfasından bakabilirsiniz.

      1. Gerekli kütüphanelerin import edilmesi
      !pip install -q textgenrnn
      from google.colab import files
      from textgenrnn import textgenrnn
      import os

      Ben yine google colab üzerinde çalıştığım için bazı ekstra modüller kullanıyorum, eğer siz lokalde çalışıyosanız 1. ve 2. satırı kullanmanıza gerek yok.

      Veriseti:
      # colab:
      uploaded = files.upload()
      all_files = [(name, os.path.getmtime(name)) for name in os.listdir()]
      file_path = sorted(all_files, key=lambda x: -x[1])[0][0]
      # lokal:
      #file_path='Sezen Aksu Only Lyrics.csv'
      Birinci yöntemle verisetini kendimiz kod ile temizlemiş ve kullanmıştık. Bu yöntem kendi içerisinde verisetini temizleyemediği için verisetini kendimiz manuel olarak temizlememiz gerekli. Kod ile uğraşmak yerine csv dosyasını açıp şarkı sözlerinin bulunduğu kolon hariç tüm kolonları sildim, bu sayede model sadece şarkı sözlerini öğrenecek.

      Modelin eğitilmesi:

      Textgenrnn modeli, modelin oluşturulması ve eğitilmesi için birçok parametre almakta. Bu parametreler az çok isminden alaşılmaktalar fakat anlamadığınız veya detaylı kullanımını görmek istediğiniz parametreler için modülün kendi kütüphanesine gözatabilirsiniz.

      model_name = 'Sezen_Aksu_textgenrnn_Model'

      textgen = textgenrnn(name=model_name)
      train_function = textgen.train_from_file if train_cfg['line_delimited'] else textgen.train_from_largetext_file
      train_function(
      file_path=,file_path
      new_model=True,
      num_epochs=100,
      gen_epochs=25,
      batch_size=1024,
      train_size=0.9,
      dropout=0.5,
      max_gen_length=300,
      validation=True,
      is_csv=False,
      rnn_layers=4,
      rnn_size=32,
      rnn_bidirectional=True,
      max_length=15,
      dim_embeddings=100,
      word_level=False)
      Modelin özet halinin görüntülenmesi:
      print(textgen.model.summary())
      ____________________________________________________________________
      Layer (type) Output Shape Param # Connected to
      =============================================
      input (InputLayer) (None, 15) 0
      ____________________________________________________________________
      embedding (Embedding) (None, 15, 100) 6200 input[0][0]
      ____________________________________________________________________
      dropout (SpatialDropout1D) (None, 15, 100) 0 embedding[0][0]
      ____________________________________________________________________
      rnn_1 (Bidirectional) (None, 15, 64) 34304 dropout[0][0]
      ____________________________________________________________________
      rnn_2 (Bidirectional) (None, 15, 64) 25088 rnn_1[0][0]
      ____________________________________________________________________
      rnn_3 (Bidirectional) (None, 15, 64) 25088 rnn_2[0][0]
      ____________________________________________________________________
      rnn_4 (Bidirectional) (None, 15, 64) 25088 rnn_3[0][0]
      ____________________________________________________________________
      rnn_concat (Concatenate) (None, 15, 356) 0 dropout[0][0]
      rnn_1[0][0]
      rnn_2[0][0]
      rnn_3[0][0]
      rnn_4[0][0]
      ____________________________________________________________________
      attention (AttentionWeightedAve (None, 356) 356 rnn_concat[0][0]
      ____________________________________________________________________
      output (Dense) (None, 62) 22134 attention[0][0]
      ===============================================
      Total params: 138,258
      Trainable params: 138,258
      Non-trainable params: 0
      ____________________________________________________________________

      Eğitilmiş model ile şarkı sözü oluşturma:

      generated_characters = 300
      textgen.generate_samples(15)
      textgen.generate_to_file('lyrics.txt', 300)
      Çıktı:
      ####################
      Temperature: 0.2
      ####################
      Bir gün ayrılık kapımı çektim bir de atmadın
      Bir gün ayrılık kapımı çektim bir derdiniz bir de alda
      Sen seç artık bıktım senden çek git Allahaşkına
      Bir kadeh kalbini
      Bir deli rüzgar savurdu beni sevilmeyi
      Bir tek içten gülüşüne gibi söyle biraz
      Bir kadını bir çiçek açtı ile öterek de vardır
      Bir kıvılcım yeter ben hep yakarsam da
      Bir karanlık sevgilim özlemle
      Bir kahrefes kaldı
      Bir daha göre değil yaşlanmaz, düşüncemiyimle beni
      Bir daha güç de ben bu yüzden
      Bir kıvılcım yeter ben sana kaldım
      Bir gün ayrılık korkuları
      Bir kıvılcım yeter ben hazırım bak
      ####################
      Temperature: 0.5
      ####################
      İster güneş ol yak beni
      "Sen misin başları gibi korkmadan ki bir şarkılarım hıranlıktan
      Ama sen özlerim daha hey yavrum şinanay
      O beni değiştirir ayrılık kapımı çektim bu yalnızca çok önemli bir korker herkes gibi hey
      Kolay olmayacak elbet var yüreğin
      Ben duygularım beni
      Anlamak için doğru budur en saklarıma
      Bir gün gelir demirleri yüreğini artık benim
      Hani haber bekliyorum
      Seni içime çekilir soldu
      Aşkımıza aşk değilim
      Ben sana tellerini versem
      Haydi gel gel kolları boynuma dola
      "Ben seni öyle sevmez oldum teşi
      İnan bize hava halimden
      ####################
      Temperature: 1.0
      ####################
      Ayrılmak inanmam içim şimdi günahlı teninde
      Pardon dalsalarsın
      O-kudum-da
      "İnsan, sevgi kokuyorsun
      Çaplaya olmaz ki düşün
      Allahsın o gençliğimim bana herkes kötü günde hayat
      Ümidimin içine dayanırsın
      Gün dezdim bir yaşam
      Hani herkes aradım dema bitmez öğütür
      Ayaraklarım hemen
      Savaşma seviş beğeler
      Bu şarkılar sıcak ama şakan kaygın ah barılarda
      Boynu bükükleri sen yapacağım
      Sen ağlama dolan kaldım
      Yüz çizgiden içimde

      Temperature değerinin düşük olaması şarkı sözünün gerçek şarkı sözleri ile benzerlik gösterdiği anlamına gelirken bu değerin yüksek olması, sözlerin tamamen yeni yazıldığı anlamına gelir.

      Eğer iyi bir model tasarlanır ve temperature değeri 1 olarak seçildiğinde oluşturulan şarkı sözü anlamlı ve gerçekçi oluyorsa gerçek dünyada kullanabilrsiniz.

      Textgenrnn ile kolay bir şekilde model oluşturulduğunu gördünüz. Sözler tam anlamıyla gerçeksi olmasa da kendi oluşturduğumuz modele göre nispeten daha iyi sonuç verdiğini gözlemledik. Sizde başka bir sanatçının şarkısını veya bir yazarın kitaplarını veriseti olarak kullanarak yeni projeler üretebilirsiniz.

      Bir sonraki aşamada LSTM ile şarkı ritimlerini oluşturmayı düşünüyorum.

      Belkide oluşturulan bir şarkı sözü ve ritim ile gerçek bir şarkı oluşturulabilir.

      Kodların tamamına buradan erişebilirsiniz 💻

      Belki şunlarda dikkatinizi çekebilir. 👇

      😍 Yapay Zeka’da Hold-out & Cross validation Nedir?

      😏 K En Yakın Komşu (K-NN)

      😃 Evrişimsel Sinir Ağında Niçin Dropout Kullanmamalısınız

      😅 Convolutional Neural Network (ConvNet yada CNN) nedir, nasıl çalışır?

      😄 Keras ile Derin Öğrenme Modeli Oluşturma