Temel Matematik Denklemini RNN Kullanarak Çözme [Kodlama Örneği ile]
Yayınlanan: 2020-12-07Hayat sana RNN veriyorsa, bir hesap makinesi yap
Tekrarlayan Sinir Ağı, düğümler arasındaki bağlantıların sıralı yönlendirilmiş bir grafik oluşturduğu klasik bir yapay sinir ağlarından biridir. RNN'ler, değişken uzunluktaki dizileri işlemek için dahili durum bellekleri nedeniyle konuşma tanıma, el yazısı tanıma vb. uygulamalarla ünlüdür.
RNN'ler ayrıca iki tipte sınıflandırılır. Birincisi, sinir ağı, bir düğümün ağda görünür bir döngü olmaksızın ileride bir veya daha fazla düğüme bağlanabileceği, yönlendirilmiş bir döngüsel olmayan grafik biçiminde olan sonlu bir dürtüdür. Bir diğeri, sinir ağı, ileri beslemeli bir sinir ağına açılamayan, yönlendirilmiş bir döngüsel grafik biçiminde olan sonsuz bir dürtüdür.
İçindekiler
Ne yapacağız?
Aritmetik bir ifadenin çıktısını tahmin eden bir model oluşturalım. Örneğin, '11+88' girdisi verirsem, model dizideki bir sonraki kelimeyi '99' olarak tahmin etmelidir. Bir RNN sıralı verilerle ilgilendiğinden, giriş ve çıkış bir karakter dizisidir.
Şimdi modelin mimarisini tasarlamak, veri kümesi toplamayla karşılaştırıldığında basit bir görev gibi görünüyor. Veri açlığı AI modelleri, kabul edilebilir doğruluk için makul miktarda veri gerektirdiğinden, veri oluşturmak veya veri kümesi toplamak yorucu bir iştir.
Dolayısıyla bu model 6 temel adımda uygulanabilir:

- veri oluşturma
- Model oluşturma
- Verileri vektörleştirme ve vektörsüzleştirme
- Veri seti yapmak
- Modeli eğitmek
- Modelin test edilmesi
Modeli uygulamaya geçmeden önce, gerekli tüm kitaplıkları içe aktaralım.
numpy'yi np olarak içe aktar tensorflow'u tf olarak içe aktar tensorflow.keras.models'den sıralı içe aktar tensorflow.keras.layers'dan Dense, Dropout, SimpleRNN, RepeatVector, TimeDistributed içe aktarın tensorflow.keras.callbacks'ten EarlyStopping, LambdaCallback'i içe aktarın termcolor ithal renkli _ |
1. Veri Oluşturma
Temel bir aritmetik denklemi yazmak için ihtiyacımız olan tüm karakterleri içeren bir karakter dizisi tanımlayalım. Böylece, dize 0-9 arasındaki tüm karakterlerden ve /, *, +, -, .(ondalık) gibi tüm aritmetik operatörlerden oluşur.
Sayısal verileri doğrudan modelimize besleyemiyoruz, verileri tensör şeklinde iletmemiz gerekiyor. Verideki dizgiyi bir sıcak kodlanmış vektöre dönüştürmek bize optimize edilmiş bir model performansı verecektir. Tek-sıcak kodlanmış bir vektör, char dizgimizin uzunluğuyla aynı uzunluğa sahip bir dizidir, her bir-sıcak vektör, sadece her dizgede mevcut olan ilgili karakter dizininde olanlara sahiptir.
Örneğin, karakter dizgimizin '0123456789' olduğunu varsayalım ve '12' gibi bir dizgeyi kodlamak istersek, tek-sıcak vektör [[0,1,0,0,0,0,0] olur. ,0,0], [0,0,1,0,0,0,0,0,0,0] ]. Bunu yapmak için, bir dizini anahtar olarak ve karakterleri değerler olarak ve diğerini de tam tersi olan iki sözlük oluşturmamız gerekir.
char_string = ' 0123456789/*+-. ' num_chars = len (char_string) karakter_to_index = dict ((c, i) için i, numaralandırmada c ( char_string )) index_to_character = dict (i için (i, c) , numaralandırmada c (char_string)) |
Şimdi bu denklemin sonucuyla birlikte rastgele bir aritmetik denklem döndüren bir fonksiyon yazalım.
def bölümü (n, d): dön n / d ise d != 0 yoksa 0 def veri (): random1 = np.random.randint(düşük = 0 ,yüksek = 100 ) random2 = np.random.randint(düşük = 0 ,yüksek = 100 ) op = np.random.randint(düşük = 0 , yüksek = 4 ) eğer işlem == 1 : arit = str (rastgele1) + ' + ' + str (rastgele2) res = str (rastgele1 + rastgele2) elif op == 1 : arit = str (rastgele1) + ' – ' + str (rastgele2) res = str (rastgele1 – rastgele2) elif op == 2 : arit = str (rastgele1) + ' * ' + str (rastgele2) res = str (rastgele1 * rastgele2) başka : arit = str (rastgele1) + ' / ' + str (rastgele2) res = str ( yuvarlak (bölme(rastgele1, rastgele2), 2 )) geri arit, res |
Ayrıca Okuyun: İlginç Sinir Ağı Proje Fikirleri
2. Bir Model Oluşturma
Model bir kodlayıcıya ve bir kod çözücüye sahip olacaktır. Kodlayıcı, giriş şekli (None,num_chars) ve 128 gizli birim şeklinde basit bir RNN modelidir, gizli birimleri 32,64,128, vb. olarak seçmemizin nedeni, güç olarak gizli birimlere sahip CPU veya GPU'nun daha iyi performansıdır. 2.
Kodlayıcımız tamamen bağlı bir ağ olacak ve bunların çıktısı ağa geri beslenecek, bir RNN böyle çalışır. Bir RNN katmanı varsayılan olarak 'tanh' aktivasyonunu kullanır, kodlayıcıya en uygun olduğu için değişmeyeceğiz. Bu katmanın çıktısı tek bir vektör olacak ve tüm çıktının tek bir vektörünü elde etmek için parametre olarak gerekli sayıda tekrarlaVector() katmanını kullanacağız.
Şimdi çıktı vektörü verilen girdinin özüne sahip olacak ve bu vektör kod çözücüye beslenecek.
Kod çözücü basit bir RNN katmanından oluşur ve bu, 'return_dizilerini' True olarak işaretleyeceğimiz öngörülen diziyi döndürmek için RNN katmanına ihtiyacımız olduğundan çıktı dizisini oluşturacaktır. 'return_sequences'i True olarak atayarak, RNN katmanı her zaman adımı için (çoktan çoğa RNN) tahmin edilen diziyi döndürür.
Bu RNN katmanının çıktısı, 'num_chars' gizli birim sayısına sahip bir Yoğun katmana beslenir ve her karakterin olasılığına ihtiyacımız olduğu için softmax aktivasyonunu kullanacağız. Yoğun bir katmanı dağıtmadan önce, her zaman adımının çıktısı için Yoğun katmanı dağıtmamız gerektiğinden, bu katmanı bir TimeDistributed katmanında kısaltmamız gerekir.
gizli_birimler = 128 max_time_steps = 5 #çıktıyı 5 karakter olacak şekilde kodluyoruz tanımlı model (): model = Sıralı() model.add(SimpleRNN(gizli_birimler, input_shape = ( Yok , num_chars))) model.add(RepeatVector(max_time_steps)) model.add(SimpleRNN(gizli_birimler, dönüş_dizileri = Doğru )) model.add(TimeDistributed(Yoğun(num_chars, activation = ' softmax ' ))) dönüş modeli model = model() model.özet() model.compile(loss = ' categorical_crossentropy ' , optimizer = ' adam ' , metrikler = [ ' doğruluk ' ]) |
Modelin mimarisi yukarıda gösterildiği gibi olacaktır.
Okumalısınız: Sinir Ağı Eğitimi
3. Verileri Vektörleştirme ve Vektörelleştirme
Verileri vektörleştirme ve vektörden arındırma işlevlerini tanımlayalım.
Aritmetik ifadeyi ve sonucu birlikte vektörleştirme işlevi burada.
def vectorize (arith, res): x = np.zeros((max_time_steps, num_chars)) ![]() y = np.zeros((max_time_steps, num_chars)) x_remaining = max_time_steps – uzun ( arith ) y_remaining = max_time_steps – uzunluk (res) i için , numaralandırmada (arith): x[x_remaining + i, karakter_to_index[c]] = 1 i aralığında ( x_remaining ): x[i, karakter_to_index[ ' 0 ' ]] = 1 i için , c numaralandırmada (res): y[y_kalan + i, karakter_to_index[c]] = 1 i aralığında ( y_remaining ): y[i, karakter_to_index[ ' 0 ' ]] = 1 dönüş x, y |
Benzer şekilde, dizgeyi vektörden arındırma işlevi de burada. Aldığımız çıktı bir olasılık vektörü olduğundan, en yüksek olasılığa sahip karakteri seçmek için np.argmax()'ı kullanacağız. Şimdi index_to_character sözlüğü, o dizindeki karakteri geri izlemek için kullanılır.
def devectorize (giriş): res = [index_to_character[np.argmax(vec)] i için , numaralandırmada vec ( input )] ' ' .join(res) döndür |
Şimdi 'devectorize' işleviyle ilgili kısıtlamamız, sondaki karakterleri sıfırlarla dolduracak. Örneğin, giriş vektörü ('1-20', '-19') ise vektörü kaldırılmış çıkış ('01-20', '00-19') olacaktır. Bu ekstra yastıklı sıfırlarla ilgilenmemiz gerekiyor. Dizeyi soymak için bir fonksiyon yazalım.
def sıyırma (giriş): bayrak = Yanlış çıktı = ' ' girişte c için : _ bayrak değilse ve c == ' 0 ' : _ devam et eğer c == ' + ' veya c == ' – ' veya c == ' * ' veya c == ' / ' veya c == ' . ' : bayrak = Yanlış başka : bayrak = Doğru çıktı += c dönüş çıktısı |
4. Veri Seti Oluşturma
Artık veri üretmek için bir fonksiyon tanımlamamız bittiğine göre, bu fonksiyonu kullanalım ve bu tür birçok (aritmetik ifade, sonuç) çifti olan bir veri seti yapalım.
def create_dataset (num_equations): x_train = np.zeros((num_equations, max_time_steps, num_chars)) y_train = np.zeros((num_equations, max_time_steps, num_chars)) aralıktaki i için ( num_equations): e, l = veri() x, y = vektörleştir(e, l) x_train[i] = x y_train[i] = y dönüş x_train, y_train |
5. Modelin Eğitimi
Veri açlığı modelimizi eğitmek için adil bir sayı olan 50.000 örneklik bir veri seti oluşturalım, bu verinin %25'ini doğrulama için kullanacağız. Ayrıca, doğruluk 8 dönem boyunca değişmeden kalırsa, akıllı eğitim kesintisi için bir geri arama oluşturalım. Bu, sabır parametresini 8 olarak ayarlayarak başarılabilir.

x_train, y_train = create_dataset( 50000 ) simple_logger = LambdaCallback( on_epoch_end = lambda e, l: print ( ' {:.2f} ' .format(l[ ' val_accuracy ' ]), bitiş = ' _ ' ) ) Early_stopping = EarlyStopping(monitör = ' val_loss ' , sabır = 8 ) model.fit(x_train, y_train, epochs = 100 , validation_split = 0.25 , ayrıntılı = 0 , geri aramalar = [simple_logger, Early_stopping]) |
6. Modeli Test Etme
Şimdi 30 boyutlu bir veri seti oluşturarak modelimizi test edelim.
x_test, y_test = create_dataset(num_equations = 20 ) preds = model.predict(x_test) full_seq_acc = 0 i için , numaralandırmada pred (preds): pred_str = stripping(devectorize(pred)) y_test_str = sıyırma(devectorize(y_test[i])) x_test_str = sıyırma(devectorize(x_test[i])) col = ' green ' if pred_str == y_test_str else ' red ' full_seq_acc += 1 / len (preds) * int (pred_str == y_test_str) outstring = ' Girdi: {}, Çıktı: {}, Tahmin: {} ' .format(x_test_str, y_test_str, pred_str) yazdır (renkli(dize, sütun)) print ( ' \n Tam dizi doğruluğu: {:.3f} % ' .format( 100 * full_seq_acc)) |
Çıktı aşağıdaki gibi olacaktır
Burada doğruluğun biraz zayıf olduğunu görebiliriz, yine de gizli birim sayısı, doğrulama bölünmesi, dönem sayısı vb. gibi birkaç hiperparametreyi değiştirerek optimize edebiliriz.
Çözüm
Bir RNN'nin temel iş akışını anladık, RNN'lerin sıralı veriler için en uygun olduğunu anladık, rastgele aritmetik denklemlerden oluşan bir veri kümesi oluşturduk, temel bir aritmetik ifadenin çıktısını tahmin etmek için sıralı bir model geliştirdik, bu modeli veri kümesiyle eğittik. yarattık ve sonunda bu modeli, modelin daha önce hiç görmediği küçük bir veri seti ile test ettik.
RNN, makine öğrenimi hakkında daha fazla bilgi edinmek istiyorsanız, çalışan profesyoneller için tasarlanmış ve 450+ saatlik zorlu eğitim, 30'dan fazla vaka çalışması ve ödev sunan IIIT-B & upGrad'ın Makine Öğrenimi ve Yapay Zeka PG Diplomasına göz atın. IIIT-B Mezun statüsü, 5+ pratik uygulamalı bitirme projesi ve en iyi firmalarla iş yardımı.
Makine öğreniminde farklı sinir ağları türleri nelerdir?
Makine öğreniminde yapay sinir ağları, temel olarak insan beynine benzemek üzere tasarlanmış hesaplamalı modellerdir. Elde edilmesi gereken matematiksel hesaplamaya dayalı olarak makine öğreniminin kullandığı farklı türlerde yapay sinir ağları vardır. Bu sinir ağları, verilerden farklı şekillerde öğrenen farklı makine öğrenme tekniklerinin bir alt kümesidir. En yaygın olarak kullanılan sinir ağı türlerinden bazıları şunlardır: - tekrarlayan sinir ağı - uzun kısa süreli bellek, ileri beslemeli sinir ağı - yapay nöron, radyal tabanlı fonksiyon sinir ağı, Kohonen kendi kendini organize eden sinir ağı, evrişimli sinir ağı ve modüler sinir ağı, diğerleri arasında.
Tekrarlayan bir sinir ağının avantajları nelerdir?
Tekrarlayan sinir ağları, derin öğrenme ve makine öğreniminde en sık kullanılan yapay sinir ağları arasındadır. Bu tür sinir ağı modelinde, bir önceki adımdan elde edilen sonuç, bir sonraki adıma girdi olarak beslenir. Tekrarlayan bir sinir ağı, çeşitli avantajlarla birlikte gelir - önceki girdileri de dahil olmak üzere zaman içinde her bilgiyi tutabilir, bu da onu zaman serisi tahmini için ideal kılar. Bu tür, uzun-kısa belleğin en iyi örneğidir. Ayrıca, tekrarlayan sinir ağları, evrişimli katmanları kullanarak yapıcı piksel komşuluğu sağlar.
Gerçek dünya uygulamalarında sinir ağları nasıl kullanılır?
Yapay sinir ağları, yine makine öğrenimi ve yapay zekanın süper özel bir dalı olan derin öğrenmenin ayrılmaz bir parçasıdır. Sinir ağları, çeşitli kritik hedeflere ulaşmak için farklı endüstrilerde kullanılır. Yapay sinir ağlarının en ilginç gerçek dünya uygulamalarından bazıları arasında borsa tahmini, yüz tanıma, havacılık endüstrisinde yüksek performanslı otomatik pilotaj ve arıza teşhisi, savunma sektöründe silahlı saldırıların ve nesne lokasyonunun analizi, görüntü işleme, sağlık sektöründe ilaç keşfi ve hastalık tespiti, imza doğrulama, el yazısı analizi, hava tahmini ve sosyal medya trend tahmini, diğerleri arasında.