CNN (Konvolüsyonel — Evrişimsel Sinir Ağı)

Source: Deep Learning on Medium

CNN (Konvolüsyonel — Evrişimsel Sinir Ağı)

Yapay zekaya giriş 101 yazımda yapay zeka, derin öğrenme ve makine öğrenmesi kavramları için, kim kimin altında, istatistik ve lineer cebir bunların neresinde diye değinirken, derin öğrenme mimarilerini de başlık olarak vermiştik.

Bu mimarilerden biri olan CNN (Konvolüsyonel — Evrişimsel Sinir Ağı) diğerlerine nazaran başlangıç için daha önemlidir. Özellikle nesne tanıma ve bilgisayarlı görüde kullandığımız CNN, nedir ne değildir bir bakalım.

Öncelikle CNN’ i anlamak için aşağıdaki soruyu cevaplamak lazım.

Bilgisayarlar, resimleri nasıl görür?

Bilgisayarlar için resimler sadece sayılardan ibarettir. Biz bir resme baktığımızda onu anlamlandırabilirken bu arkadaş için o anlamlı değildir. İşte bizim temel amacımızda, onun için resimleri anlamlı hale getirmek olacak.

Stanford cs231 ders slaytından

Peki bu işlemi nasıl gerçekleştireceğiz ?

Evrişim dediğimiz şey tam da burada işe koşuluyor. Yukarıdaki resim 800×600 boyutunda bir matris. Biz bu matris üzerinde 3×3, 5×5 veya 7×7’lik filtreler kullanarak bir şeyleri toplayıp çıkartıp(detaylarda değineceğiz) resim üzerinde keskin kenarlar, köşe, herhangi bir ayrıt, göz gibi niteliyici özellikleri elde ederiz.

Bu elde ettiklerimiz sonucunda, daha sonra test edeceğimiz resimlerle bu elimizdeki nitelikleri kullanarak tahmin etmeye çalışırız.

Yeri gelmişken hemen değinelim, işte bu nitelikleri çıkarmak için veri sayımızın ve çeşitliliğimizin çok olması işimizi kolaylaştıracaktır.

Stride (Adım Kaydırma)

Tabi bu filtreleri adım kaydırma(stride) ile tüm resim üzerinde uyguluyoruz.

Burada gerçekleştirilen stride işlemi her bir adımda 1 piksel şeklindedir. Bu değiştirilebilen bir rakamdır. Bazen stride değerini artırıp azaltabiliriz. Gerçekleştirilen stride değerine göre çıktı boyutu değişecektir. Yukarıdaki örnekte 7×7′ lik bir matriste 3×3′ lük bir filtre ile 1′ er adım kaydırarak yaptığımız işlem sonucu 5×5′ lik bir çıktı elde edilecektir. Adım sayısı değiştiğinde çıktı boyutunu bulabilmek için ;

(N-F)/S + 1

formülünü kullanabiliriz. Burada;

N = Giriş matrisi boyutu
F = Filtre boyutu
S = Adım sayısı (Stride)

Stride 1 için => (7–3)/1 + 1 = 5

Eğer stride değişirse;

Stride 2 için => (7–3)/2 + 1 = 3
Stride 3 için => (7–3)/3 + 1 = 2.33

Görüldüğü üzere stride değeri output’umuzu etkilemektedir.

Padding (O ekleme)

  • Stride sonucu output boyutunu değiştiriyor ve biz bunu istemiyorsak,
  • Uyguladığımız stride değeri sonucu filtre matrisin sonuna geldiğinde uygulanamıyorsa
  • Katmanlar arasında evrişim işlemi sırasında bilgi kaybı istemiyorsak

padding işlemi uygulayarak, resmin kenarlarına 0 ekleriz.

Böylelikle yukarıda saydığımız maddeleri gerçekleştirmiş oluruz. 7×7′ lik yukarıdaki örnekte 3×3′ lük filtre sonucu 1 stride değeri ile output’ umuz 5×5 oluyordu.

7×7’lik boyutun korunmasını istersek padding değerimizi 1 yaparak, 1 tane satırda ve 1 tane sütünda 0 ekleyerek boyutu 9×9 yapıyoruz. Şimdi;

Stride 1 için => (9–3)/1 + 1 = 7 çıktımız 7×7 aynı boyutta bir görüntü olacaktır.

Pooling (Havuzlama — Ortaklama)

Yukarıdaki işlemler bu örnekler için kolay gözükürken gerçek hayatta resimlerin boyutları büyüyeceğinden ve boyutu artacağından dolayı bilgisayarlar için komplike hale gelecektir. Bu durum daha fazla iş yapılması anlamına gelmektedir. Böyle durumlar için boyut küçültmek isteriz ve bu işleme pooling denmektedir. Birkaç farklı pooling yöntemi vardır.

  • Max Pooling
  • Average Pooling

Yukarıdaki örnekte 2×2′ lik filtre ve 2 stride değeri kullanılarak yapılan max pooling işleminde aynı renkte olan bölümlerden en yüksek değer seçilerek yeni 2×2′ lik bir çıktı elde edilmiştir. Böylelikle nihai hedef olan küçültme işlemi gerçekleştirilmiştir.

İsimlerinden de anlaşılacağı üzere Max Pooling işleminde en büyük değer seçilirken, Average Pooling işleminde ortalama değer alınmaktadır.

Farklı modeller için farklı pooling yöntemleri uygulandığını da belirtmekte fayda vardır. Aşağıda en popüler Deep Learning modellerinde kullanılan pooling yöntemlerini göreceksiniz;

  • LeNET = average pooling
  • AlexNet = max pooling
  • VGGNet = max pooling

Aktivasyon Fonksiyonu

Stride’ ı, Padding’ i ve Pooling’i öğrendiğimize göre gelelim Aktivasyon Fonksiyonuna. Artık bu işlemlerden sonra elde ettiğimiz değeri bir fonkisiyona sokuyoruz ki kayıp değerimiz azalsın. Bu bizim en büyük hedefimiz. Kayıp değeri ne kadar düşükse test için vereceğimiz resimleri tahmin ihtimalimiz o kadar yükselir. Aktivasyon fonksiyonları dediğimizde aklımıza;

  • Sigmoid
  • Tanjant Hiperbolik
  • Relu
  • Leakly Relu

gibi isimlerle haşır neşir olacağız Bunlara daha sonra diğer yazılarda detaylı ele alacağız. Burada anlatmaya kalkarsak bu yazı bitmez. Sadece kısa bir bilgi olarak Relu son zamanlarda hız kazandırması bakımından çok tercih edilmektedir. Relu’nun yaptığı ise evrişim işleminde filtre uygulandıktan sonra değerler toplanır çarpılarak yeni bir değer elde edilir. O değer 0 (sıfır)’dan küçükse eksi bir değer ise onu 0(Sıfır) sayar. Pozitif bir değer ise olduğu gibi korur. Aktivasyon fonksiyonlarından Relu’ya kısaca böyle bir değinelim ve kaçalım.

Bu yazımızda CNN’de temel kavramların ne anlama geldiğini ve bu kavramların uygulama esnasında neler yaptıklarına değindik. Sonraki yazılarda daha fazla detaya girmek umuduyla…