Makine Öğrenmesi | Ördü Kader Ağlarını Bölüm 2— Evrişimli Sinir Ağları

Samed Harman
6 min readDec 18, 2020

--

Instagram veya Snapchat’de yüzünüzü filtrelerle bin bir şekle sokarken hiç “ Bu nasıl oluyor yahu” diye düşündüğünüz olmuş muydu?.

Tesla model araçların self-driving videolarını izlerken “ Bizim Doblo niye kendi kendine süremiyor acaba sanayide yapamazlar mı?” diye içinizden geçirip hayatı sorguladığınız oldu mu?

İşte bunlar hep sinir ağı , hem de evrişeninden. Gelin yakından bakalım..

Başlarken

Yeni doğan bir çocuğun nesneleri tanımasına benzer bir biçimde bir algoritmanın nesneleri tanıyabilmesi için onu milyonlarca resim ile eğitmemiz gerekir.

Tabii bilgisayar dünyası 0 1 dir. Haliyle bizim gördüğümüz gibi görmez resimleri. Örneğin benim için Margot Robbie onun için 2-boyutlu bir sayı dizisidir , yani piksel dediğimiz olaydır aslında.

CNN — Evrişimli Sinir Ağları

CNN, girdileri birer görüntü olarak varsayan , görüntü işleme ve resim tanımada kullanılan , çok katmanlı bir yapay sinir ağı.

CNN yapısı iki ana kısımdan ve bu kısımlara bağlı bazı katmanlardan oluşuyor.

  • Feature Extraction
  • Classification

Feature extraction yani nitelik çıkarımı kısmına bakacak olursak ilk katman olarak Convolution katmanını görürüz. Bu katman ağa verilen giriş değerleri üzerinde bazı filtreleme işlemlerinin uygulandığı yerdir.

Giriş değerleri sonrasında ReLu aktivasyon fonksiyonunun kullanıldığı ReLu katmanından geçerek Pooling katmanına verilir

Pooling katmanı Convolution katmanından gelen değerler için bir boyut indirgeme işlemi uygulayarak 2D olan matrisleri lineer bir vektöre çevirir.

Classification için hazırlanan giriş değerlerimiz bir sinir ağına verilir. Bu ağa Fully-Connected diyoruz. Kendisi aslında bildiğimiz Yapay Sinir Ağları’ndaki hidden layer fakat fully connected (Kısaca girişteki bir nöron önündeki her bir nöronla bağlantılı). Bu katmanın sonunda da sınıflandırma işlemini gerçekleştiren bir Softmax regresyonu bulunur.

Kısaca CNN böyle çalışır. Şimdi daha derine :)

Convolution Katmanı

Mimarinin ilk katmanı demiştik az önce. Bazı filtrelemeler uygulanıyordu. Öncelikle bu filtre diğer adı ile kernel kavramından biraz bahsedelim.

Filtre veya kernel , belirli bir niteliği temsil eden resim anlamına gelir. Örneğin yukardaki eğri resmini bir resmin içinde tespit etmeye çalışacaksak eğer soldaki matrisi filtre olarak kullanabiliriz.

Peki Convolution’da özellik çıkarımı nasıl oluyor?

Olan işlem aslında resmimizin matris formu ile filtre matrisinin matris çarpımı. Bunu da filtre matrisinin (resimdeki 3x3 matris gibi) aralığı içindeki tüm hücre değerleri için yapıyor ve bir çıktı (Convolved Feautre) oluşturmak için bunları bir araya getiriyor.

Pekii resmin içinde o özellik var mı yok mu nasıl tespit ediyor?

Yukardaki resimde gördüğünüz ilk matris, farenin kulak tarafından alınan bir kesiti temsil ederken , uygulanan filtre ise bizim yukarda gösterdiğimiz eğri resminin matrisi. Bu iki matris arasında Convolution işlemi uygulandığında sonucun 0 çıktığını görürüz. Bu bi elde dursun.

Burdaki resimde ise bu sefer farenin sırt tarafından alınan bir resim kesiti var. Fark ettiniz mi sanki biraz bizim eğri filtreye benziyor :). Bu ikisi arasında Convolution uygulandığında ise 6000 küsürlü bir sayı elde edilmiş. Yani burdan çıkacak sonuç şu ki , resmin içinde aranan filtreye ne kadar benzer bir görüntü var ise convolution o kadar yüksek sayı döndürüyor , aha feature extraction :).

Matris çarpımında ufak bir optimizasyon

Convolution sırasında gerçekleşen matris çarpımı işlemine dikkatli bakalım şimdi.

Resmin köşelerindeki pikseller ,filtre matrisinin iterasyonu esnasında ortadaki piksellerden daha az kaplanıyor. Bu da sinir ağında ortadaki piksellerin kenarlara nazaran daha fazla ağırlıklandırılmasına sebep oluyor. Bu da resmin kenarları için yapılacak tespitlerde doğruluk oranının kötü olacağı anlamına gelir. Bunun için matrisimize Padding uyguluyoruz. Padding ile hedef matrisimizin kenar tarafları 0 veya 1 olarak kaplanıyor ve bu da filtre matrisinin orjinal resmin kenarlarında daha fazla alan kaplayabilmesini sağlıyor. Kıyılarda gezen filtrenin sayesinde resim hakkında daha fazla bilgi gidiyor sinir ağına ve daha fazla bilgi eşittir daha yüksek accuracy :).

Şimdi bu birer birer kayıyor ya , o çok yormaz mı ya ?

Evet yorar , bunun için de Striding denilen işlem düşünülmüş. Convolution esnasında filtre matrisini 1 satır 1 sütun kaydırmaktansa 2 veya 3 satır 3 sütun şeklinde gezdirelim demişler. Bu da yüksek boyutlu resimlerde hesaplama maliyetini düşürmüşken herhangi bir veri kaybına da sebep olmamış.

ReLU

Rectifier Linear Unit , yapay sinir ağlarından tanıdğımız aktivasyon fonksiyonu. CNN içerisinde de Convolution çıktısındaki tüm hücrelere uygulanıyor.

Belirli bir evrişim işlemi 0 veya negatif bir değerle sonuçlanırsa bu aranan niteliğin orada bulunmadığı manasına geliyor ve o kısım 0 ile ifade ediliyor. Diğer tüm durumlardaki değerler ise korunuyor.

Pooling Katmanı

Havuzlama yani Pooling katmanındaki amaç, çıktı boyutunu azaltıp özelliğin yalnızca varlığına ilişkin olan kısımlarını almaktır. Bu parametre sayısını düşürür ve hesaplama sayısını azaltır.

Pooling işlemi için matris belli ayrılır. Ayrılan parçalardaki hücre değerlerinin ortalaması veya maksimum olanı alınarak yeni ve daha küçük bir matris oluşturulur. CNN mimarisinde genellikle ardışık evrişim blokları arasına birer Pooling katmanı eklenir.

Fully Connected Katmanı

Geldik mimarideki son katmana. Sınıflandırma işleminin gerçekleştiği bu katmanda sınıflandırma algoritması için genellikle Softmax regression kullanılır. Softmax regression ise genelleştirilmiş Logistic regression olarak bilinir. Bir diğer adı ile de multinominal Logistic regression.

Softmax kısaca birden çok sınıf değeri verebilen bir Logistic regression. Yani birden fazla sınıf üzerinde sınıflandırma yapabilir.

CNN mimarisi yapısı kısaca bu şekilde.

Bir de kod üzerinden görelim , Keras üzerinde bir CNN yapısı örneğine bakalım:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape ,padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(no_classes, activation='softmax'))

Convolution katmanı oluşturmak için Conv2D sınıfını kullanıyoruz. Burada ilk verilen parametre olan nöron sayısı, genellikle 2'nin kuvvetleri olacak şekilde katmanlar arasında artırılarak verilmekte. Kullanılacak filtrenin boyutu olarak da 3x3 belirlenmiş. ReLu katmanı içinse activation parametresine ‘relu’ olarak değeri geçiyoruz.

Ardından gelen MaxPooling2D , pooling işlemi için kullandığımız sınıf. Matris boyutu 2x2 olarak veriyoruz.

Ardından aynı yapıyı Convolution katmanı 64 nöron olacak şekilde kurup , verileri Fully Connected katmana verebilmek için Flatten() çağırıyoruz. Bu verilerimizi lineer bir vektör haline getirecektir.

Ardından son katman olan Fully Connected için Dense() çağırıyoruz. 256 nöronluk katmandan sonra ‘softmax’ kullanan son katman sınıflandırma işleminin gerçekleştiği katmandır. Son katmanın nöron sayısı ise veri setimizde kullanılacak olan sınıf sayısına göre verilmekte. Bu kod örneği MNIST veri seti için yazılan bir örnek olduğu için sınıf sayısı burada 0–9 olan rakam sayımız , yani toplam 10 sınıf olmuş oluyor. Ayrıntılı örneğe buradan ulaşabilirsiniz.

Bu yazımda Derin Öğrenme algoritmalarından olan Evrişimli Sinir Ağları’ndan bahsetmeye çalıştım. Eksik , hatalı kısımları veya yorumlarınızı bana bildirmekten çekinmeyin. Başka yazılarda görüşmek dileği ile :).

--

--

Samed Harman
Samed Harman

Written by Samed Harman

Flutter/Android Mobile App Developer | Computer Engineer

No responses yet