Giriş
Serinin üçüncü yazısında yapay sinir ağları ve ileri beslemeli yapay sinir ağlarına değinmiştik bu yazıda ise DL4J kütüphanesi kullanarak ileri beslemeli bir yapay sinir ağı oluşturacağız. MNIST veri setini kullanarak sinir ağını eğitecek ve el yazılarını tahmin etmeye çalışacağız. MNIST veri seti ile ileri beslemeli bir yapay sinir ağı kurarak sınıflandırma yapmak, makine öğrenmesi için başlangıç niteliğinde bir uygulamadır. Tensorflow, Kaggle, Caffe ve tabiki DL4J için de vazgeçilmez bir başlangıç olacaktır.
Problem ve Çözüm
Problemimiz el yazısı ile yazılmış olan rakamları OCR ile tespit edememek. OCR yani optik karakter okuma görüntü işleme içerisinde yer alabilecek, belirli fontlar ile yazılmış metinleri görsel üzerinden ayrıştırarak tekrar metin haline getirmektir. OCR kütüphanelerinin yaşadığı zorluklardan bir tanesi el yazı ile yazılmış metinleri analiz edememesidir. Bu problemin çözümü için önerilen yol, bir yapay sinir ağı oluşturmak ve bu sinir ağı ile metni analiz etmeye çalışmaktır. Sinir ağının eğitimi için ise bolca el yazısı verisine ihtiyaç duyulmaktadır, bu veri ihtiyacını ise mnist veri seti karşılamaktadır.
MNIST
Mnist bir veri setidir. IDX dosya formatını kullanmaktadır bu dosya formatı ile veriler vektör şeklinde saklanabilmektedir. Mnist veri seti içerisinde el yazısı ile yazılmış rakamlar yer almaktadır, ayrıca bu rakamların ne olduğuda etiketlenmiştir bu sayede sinir ağını eğitirken ağa hangi girdinin sonucunun ne olduğu verebiliriz, hatırlarsanız bu tür bir öğrenme modelinin “Gözetimli Öğrenme” olduğuna değinmiştik. Bu veri seti içerisinde yaklaşık 70.000 adet ver bulunmaktadır, bunların 60.000 tanesi eğitim, 10.000 tanesi ise test için kullanılmak üzere ayrılmıştır.
DL4J kütüphanesi içerisinde mnist veri setine erişim için kolaylık olmasına adına “MnistFetcher.java” sınıfı geliştirilmiştir. Bu sınıf veri setini indirme ve dizine çıkarma işlemlerini yapmaktadır. Örnek projeyi doğrudan çalıştırdığınızda veri setini “user home” dizinine MNIST klasörü içerisine indirecektir. Bu sınıfa aşağıdaki bağlantıdan göz atabilirsiniz.
Veri setini http://yann.lecun.com/exdb/mnist/ adresinden veya aşağıdan manuel olarak kendiniz de indirebilirsiniz. Öncelikle eğitim için kullanacağımız “training set images” ve bu görsellerin etiketlerini “training set labels” indirin. Eğitim sonucu ağı test etmek için kullanacağımız “test set images” ve “test set labels” dosyalarını da indirin. Dosyaları UserHome dizinine MNIST klasörü oluşturarak buraya taşıyın, eğitim ve test için kalan süreçleri dl4j kendisi halledecektir. (Windows için dizin Root\Users\username\MNIST\ şeklindedir.)
train-images-idx3-ubyte.gz | training set images (9912422 bytes) |
train-labels-idx1-ubyte.gz | training set labels (28881 bytes) |
t10k-images-idx3-ubyte.gz | test set images (1648877 bytes) |
t10k-labels-idx1-ubyte.gz | test set labels (4542 bytes) |
İleri Beslemeli Sinir Ağının Oluşturulması
İleri beslemeli (feed forward) bir yapay sinir ağı oluşturacağız. Yapay sinir ağının öğrenme süreci için ise Supervised Learning (Gözetimli Öğrenme) modelini kullanacağız. MNIST veri setinde yer alan görseller 28 x 28 piksel boyutlarına sahiptir bu sebeple sinir ağının girişi 28 *28=784 adet, rakamları tahmin edeceğimiz içinde sıfırdan dokuza 10 adet çıkışa sahip olacak. Sinir ağında gizli katman sayımız ise 1 olacak, bu sayede basit ve anlaşılır bir model oluşturmuş olacağız.
Kodlama
Öncelikle bu örneğin kaynak kodunu aşağıdaki github deposundan çekebilirsiniz. Nasıl yapıldığını bilmiyor iseniz bu https://www.youtube.com/watch?v=Jm7HDGFayvk göz atabilirsiniz.