Keras/Tensorflow ile Rakamları tanıma (MNIST Dataset)

Keras; Tensorflow veya Theano üzerinde çalışan python ile yazılmış bir derin öğrenme kütüphanesidir. Yapay sinir ağları(neural network) kurulumunda hızlıca ve kolayca prototipleme yapmamızı sağlar.

An itibari ile Python 2.7 ve 3.5 ile uyumlu olduğu için 3.6 kurulu bir sisteminiz varsa çalışmayacaktır.

Tensorflow; işin daha çok matematik kısmını halleden ve bunu görselleştiren Google’ın sahip olduğu kütüphane.

MNIST; (Modified National Institute of Standards and Technology database) cümlesinin kısaltmasıdır. El yazısı ile yazılmış ve uygun bir şekilde sınıflandırılmış rakamlardan oluşur. 60.000 öğrenme(train) ve 10.000 doğrulama(test) görseli barındırır.

Bu iki kütüphane de GPU üzerinde çalışabiliyor. Nvidia ekran kartları için CUDA gibi kütüphaneler kurulması gerektiği için basit tutmak adına bu örneği CPU üzerinde çalıştıracağız.

Geliştirme ortamını oluşturmak için pek çok kurulum yapmamız gerekli. Bunun basit bir yolu Anaconda kurmak. Linkten indirip kurduktan sonra Anaconda Navigator’ı açtığımızda root Environment’ı ve üzerinde bir kaç uygulama kurulu geliyor. Burada Spyder uygulaması kurulu değilse Install’a tıklayarak kuruyoruz sonra Launch ile başlatıyoruz.

Örnek kodu şu gist‘te görebilirsiniz. Burada kodları paylaşıp açıklamaya çalışayım.

Neden y verimizi to_categorical ile genişlettik?
Yapay sinir ağımız bir tahminde bulunduğunda bize her bir sınıf için 0-1 aralığında bir sayı verecektir. Bu sayı hangi sınıf için daha yüksek ise o sınıf bizim tahminimiz olacaktır. Ağımızın hata hesaplamaları yapabilmesi ve kendini daha iyi eğitebilmesi için verdiğimiz verinin hangi sınıfa ait olduğunu ağa uygun bir şekilde(shape) vermemiz gerekir. Ağ sonuçta bulduğu/tahmin ettiği 10 sayıyı bizim verdiğimiz 10 sayı ile (bu örnekte 9 adet sıfır 1 adet bir) karşılaştırıp bir sonraki epochta hatasını en aza indirmeye çalışır.

Conv2D(32, kernel_size=(3, 3), activation=’relu’, input_shape=input_shape)
Modelimize bir 2 boyutlu Convolutional katman(layer) ekler. İlk parametresi kaç adet filtrenin bu katmanda kullanılacağıdır. İkinci parametre filtrenin/kernelin boyutudur. Bu modelin ilk katmanı olduğu için input_shape parametresi vermemiz gerekli, boş bırakılırsa compile edilirken hata verecektir.

MaxPooling2D(pool_size=(2, 2))
MaxPooling işlemi, verimizden, verilen pool_size boyutunda kümeler alıp bu kümeler içerisindeki en büyük değerleri kullanarak yeni bir matris oluşturur. Oluşan matrisin boyutu daha küçüldüğü için sonraki katmanlarda işlem hızımızı arttıracaktır ayrıca MaxPooling overfit durumunun önüne geçer.

Dropout
Verilen oranda train matrisinden rastgele veri siler/sıfırlar yani etkisiz hale getirir. Yine Overfit durumlarının önüne geçmek için ve train verimizin çeşitliliğini arttırmak için kullanılır. Dropout katmanı test verisi ağdan geçiyorsa kullanılmaz.

Flatten
Genellikle Convolutional bölümün sonuna konan Flatten metodu çok boyutlu olan verimizi tek boyutlu hale getirerek standart yapay sinir ağı için hazır hale getirir.

Dense
Bir standart yapay sinir ağı katmanı oluşturur, ilk parametrede verilen sayı kadar nöron barındırır.

Eğitme(Train) işlemi Intel i5 – 1.60GHz işlemci, 8 GB DDR3 ram üzerinde yaklaşık 30 dakika sürdü. Çıktılar bu şekilde;

Train on 60000 samples, validate on 10000 samples
Epoch 1/2
60000/60000 [==============================] - 921s - loss: 0.3414 - acc: 0.8960 - val_loss: 0.0849 - val_acc: 0.9746
Epoch 2/2
60000/60000 [==============================] - 892s - loss: 0.1203 - acc: 0.9651 - val_loss: 0.0562 - val_acc: 0.9825
Test loss: 0.056160167551
Test accuracy: 0.9825

loss/acc: train verisi üzerindeki hata oranı ve başarımdır.
val_loss/val_acc: test verisi üzerindeki hata oranı ve başarımdır.
Bu değerlerin hesaplanmasında model.compile metoduna verdiğimiz parametreler kullanılır.

Son epochta görüldüğü gibi test verimizin üzerinde %98 başarı ile tahmin yürütebiliyoruz.

Bir Cevap Yazın