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

alierbey
4 min readJan 7, 2020

--

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 800x600 boyutunda bir matris. Biz bu matris üzerinde 3x3, 5x5 veya 7x7'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 7x7' lik bir matriste 3x3' lük bir filtre ile 1' er adım kaydırarak yaptığımız işlem sonucu 5x5' 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. 7x7' lik yukarıdaki örnekte 3x3' lük filtre sonucu 1 stride değeri ile output’ umuz 5x5 oluyordu.

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

Stride 1 için => (9–3)/1 + 1 = 7 çıktımız 7x7 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 2x2' 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 2x2' 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…

--

--

alierbey

Ph.D. Candidate at Gazi University and Lecturer at Usak University | Research Deep Learning | Software Engineer | Go Programming Language | www.alierbey.com