Elimizde ABD başkanlarının resimlerinin olduğunu ve ağımızın bu resimde hangi başkanın bulunduğunu bilmesini istediğimizi varsayalım. Görseldeki Lincoln mü, Washington mı, Jefferson mı yoksa Obama mı? Bilgisayar, bu problemi nasıl cevaplıyor? Makinenin görüntüleri okuması nasıl gerçekleşiyor? Çoğumuzun aklına gelen ortak soru budur ve görüntü işlemenin de ilk adımı bu soruya yanıt aramaktır. Evrişimli sinir ağları da bu sorulara yanıtlar üretebildiğimiz, görüntü tanıma ve bilgisayarlı görü görevlerinde uzmanlaşmış bir tür sinir ağıdır.
Evrişimli (ya da evrişimsel) sinir ağları (Convolutional Neural Networks, CNN) görüntü işleme, sınıflandırma ve segmentasyonu için en popüler ve güçlü araçtır. Bir evrişimsel sinir ağı bir girdi görüntüsünü alabilen, görüntüdeki çeşitli nesnelere önem (weight ve bias) atayan ve nesnelerin birbirinden ayırt edilebilmesini sağlayabilen, aynı zamanda nesnelerin birbirleriyle olan ilişkilerini çıkarabilen bir derin öğrenme algoritmasıdır. Bu makale kapsamında evrişimli sinir ağlarına kısa bir giriş yapılacaktır.
Evrişimli sinir ağlarının detaylarına giriş yapmadan önce görüntünün ne olduğuna kısaca değinmek faydalı olacaktır. Bir görüntü temel olarak 2B parlaklık değerleri dizisidir [0, 255]. Sıfıra yakın olan sayılar koyu tonları, 255’e yakın sayılar ise daha açık tonları temsil eder. Yukarıdaki görselde en soldaki görüntüde, piksel değerlerinin parlaklığa göre atandığını görebiliriz.
Makine, görüntüleri piksel değerlerine göre okur. Her görüntü piksel değerlerinin bir kombinasyonudur. Piksel değerlerini değiştirmek görüntüyü de değiştirecektir.
Genel sınıflandırma, genellikle bir kategorinin (insan, eşya vb.) üst düzey özelliklerinin varlığı tespit edilerek yapılır. Burun, göz veya ağız tespiti yapabilirsek bunun bir yüz görüntüsü olduğunu söyleyebiliriz.
Yapay sinir ağları karmaşık veriler ile oldukça iyi iş çıkarırken neden başka bir mimariye ihtiyaç duyulmuştur? Bu sorunun cevabını vermek için öncelikle yapay sinir ağının yapısına bakalım.
Yapay sinir ağlarında (çok katmanlı algılayıcıda) üç temel katman vardır:
Bu çok katmanlı algılayıcı model sayısal/kategorik verilerde oldukça iyi iş çıkaracaktır.
Sinir ağının özellikleri/girdileri piksel değerleri haline gelir. Böylece model bir görüntü için piksel değerlerini okur, özellik çıkarımı ve sınıflandırma yapar. Ancak konunun biraz daha derinine inildiğinde, bir görüntünün özelliklerinin sadece piksel değerleri olmadığı, pikseller arasındaki ilişkinin veya başka bir deyişle görüntü özelliklerinin kenarlar, çizgiler, köşeler veya temelde bir görüntünün şekilleri ve desenleri olduğu söylenebilir. Yapay sinir ağı ile sınıflandırma yapılabilmesi için ilgili veriyi temsil eden özelliklerin (feature extraction) yapay sinir ağına verilmesi gerekir. Doğru özelliklerin seçilmesi özellikle görüntü verileri söz konusu olduğunda oldukça zordur. Oysa evrişimsel sinir ağlarında, evrişim katmanı özellik seçimini otomatik olarak yapmaktadır.
Sinir ağına, evrişimsel katmanı eklenir ve ağ artık evrişimsel sinir ağı olarak adlandırılır. Evrişimsel katmanın amacı yukarıda da bahsedildiği gibi bir görüntüden özellik çıkarmaktır.
Görsel Referansı - Evrişimli Sinir Ağı
Evrişimli sinir ağının iki ana bölümü vardır: Birincisi görüntüyü özelliklere bölen ve bunları analiz eden bir evrişim/havuzlama mekanizması, ikincisi ise evrişim/havuz oluşturma çıktısını alan ve görüntüyü tanımlamak için en iyi etiketi tahmin eden tam bağlantılı bir katmandır.
Evrişim, bir girdi görüntüsünden özellikleri çıkaran ilk katmandır. Evrişim, girdi verilerinin küçük karelerini kullanarak görüntü özelliklerini öğrenir ve pikseller arasındaki ilişkiyi korur. Evrişimsel katmanı anlamak için bilinmesi gereken dört temel kavram vardır:
Evrişim, iki matris (girdi ve filtre matrisleri) arasındaki matematiksel bir işlem olup, çıktısı da bir matristir.
Filtre (turuncu), sol üst köşeden başlayarak her seferinde girdi görüntüsünün (yeşil) üzerinde bir piksel kayar. Bu filtre, görüntünün üzerinde kayarken kendi değerleri ile örtüşen değerleri çarpar ve hepsini toplayarak her örtüşme için tek değer verir. Elde edilen bu çıktı matrisi, evrişim işleminin sonuç matrisidir.
Çıktı matrisinde elde edilen sol üst köşedeki değeri aşağıdaki gibi hesaplanmaktadır:
Yukarıdaki girdi matrisinin boyutu 5x5 ve kernel matrisinin boyutu 3x3’tür. Beklenen çıktı matrisinin (convolved feature) boyutu ise 3x3’tür. Çünkü 3x3 filtrenin 5x5 matris ile oluşturabileceği maksimum pozisyon sayısının 3x3’tür.
Görseldeki örnekte sonuç olarak bulunan -1 değeri yeni piksel değeridir. ‘Destination’ piksel olarak da adlandırılır. Görselde ‘kernel’ olarak adlandırılan matris bazı kaynaklarda ‘convolution’ veya ‘filter’ olarak da adlandırılmaktadır.
Kernel nedir?
Padding, bir evrişimsel sinir ağı tarafından işlenirken girdi matrisine eklenen piksel miktarıdır. Evrişim işleminden sonra girdi ve çıktı matrisi arasındaki boyut farkının kontrol edilebilmesini sağlar. Çekirdeğin (kernel) görüntüyü kaplaması için daha fazla alan sağlamak amacıyla görüntünün çerçevesine piksel eklenir.
Evrişimsel sinir ağı tarafından işlenen görüntüye padding eklemek, görüntülerin daha doğru analizine olanak tanır.
6x6 boyutunda bir görüntü, herhangi bir başka işlem uygulanmadan (padding vb.) 3x3 boyutunda bir filtre ile evrişim işlemine tabi tutulduğunda elde edilecek çıktının boyutu 4x4 olacaktır. Bunun sebebi 3x3 filtrenin 6x6 matris ile oluşturabileceği maksimum pozisyon sayısının 4x4 kadar olmasıdır. Matematiksel olarak ifade etmek istersek nxn boyutlarındaki bir görüntü ile fxf boyutlarındaki bir filtreyi evrişim işlemine tabi tutarsak çıktı matrisinin boyutu (n-f+1)x(n-f+1) ifadesi ile hesaplanabilir.
Bu aşamada oluşabilecek iki olumsuzluğa dikkat etmek gerekir: Birincisi, her seferinde evrişim işlemini uygulamak görüntünün küçülmesine neden olmaktadır. Örneğin yukarıdaki örnekte girdi görüntüsü 6x6 boyutlarında iken filtre uygulanmış görüntü 4x4 boyutuna küçülmüştür. Görüntünün boyutunun küçülmesi yararlanılabilecek bilgi ve detayları azaltmaktadır. İkinci olumsuz nokta ise, kenardaki veya köşedeki piksellerin çıktı üzerindeki etkisinin az olmasıdır. Örneğin, girdi görüntüsünde x yazan piksel sadece bir adet çıktıya etki edecektir. Girdi görüntüsünde y yazan piksel ise filtre matrisi ile evrişim işlemi uygulandığında birden çok bölgeye temas edecektir. Dolayısıyla kenar veya köşedeki pikseller iç bölgelerdeki piksellere oranla çıktıda çok daha az kullanılırlar. Bunun anlamı kenar ve kenara yakın bölgelerdeki piksellerin birçok bilgisinin kullanılamamasıdır. Bu iki problemi (hem çıktı boyutunun girdiye oranla küçülmesi hem de kenarlardaki piksellerin bilgilerinin az kullanılması) çözmenin yolu girdi görüntüsüne evrişim işlemi uygulamadan önce görüntüye piksel eklemekten geçmektedir.
Piksel ekleme işlemi genellikle 0 sayısı kullanılarak yapılmaktadır. Sıfır sayısını kullanarak piksel ekleme işlemi yapıldığında orijinal girdi boyutu korunmuş olur. Yani girdi ve çıktı boyutu aynı olur. Padding kullanıldığında elde edilecek çıktı boyutu aşağıdaki formül yardımı ile hesaplanabilmektedir:
Burada n girdi görselinin boyutunu, p padding değerini ve f filtre boyutunu temsil etmektedir.
Aşağıdaki görselde üçüncü karede bulunan girdiye eklenen padding değeri 1’dir. Çünkü girdinin çevresi ekstra 1 pikselle doldurulmuştur. Örneğin, (8 x 8) bir görüntüye bir katman padding eklemek ve (3 x 3) bir filtre kullanmak, evrişim işlemini gerçekleştirdikten sonra (8 x 8) bir çıktı alacağımız anlamına gelir.
Padding ile girdi ve çıktının boyutunun aynı olduğu, girdi boyutunun korunduğu görülebilmektedir. Padding değerini belirlerken iki yaygın seçenek bulunmaktadır: Bunlar geçerli evrişim (valid convolution) ve aynı evrişimdir (same convolution). Geçerli evrişimde padding işlemi bulunmamaktadır. Aynı evrişimde ise padding işlemi gerçekleştirildiğinde çıktının boyutu ile girdinin boyutunun aynı olması beklenir.
Stride (kaydırma adımı), girdi matrisi üzerinde kernel matrisinin kaç adım ile taşınacağını belirtir. Stride sayısının 1 olması durumunda filtreler tek seferde 1 piksele taşınır. Benzer şekilde stride sayısı 2 olduğunda, filtreler tek seferde 2 piksele taşınmaktadır. Adım değeri ne kadar küçükse, çıktı o kadar büyüktür (tersi de geçerlidir).
Stride (kaydırma adımı) işleminin çıktı boyutu üzerindeki etkisi matematiksel olarak aşağıdaki şekilde ifade edilebilir:
Burada n girdi görselinin boyutunu, p padding değerini, f filtre boyutunu ve s stride değerini temsil etmektedir.
Pooling katmanı, evrişimsel sinir ağının bir diğer yapı taşıdır. İşlevi, ağdaki parametre ve hesaplama miktarını azaltmak için gösterimin uzamsal boyutunu aşamalı olarak azaltmaktır. Bu aynı zamanda rotasyonel ve konumsal değişmez olan baskın özelliklerin çıkarılması için de yararlı olup modelin etkin bir şekilde eğitilmesi sürecini sürdürür.
İki tür pooling (havuzlama) vardır: Kernelin kapsadığı kısımdan maksimum değeri veren maksimum havuzlama ve görüntünün kernel tarafından kapsanan kısmındaki tüm değerlerin ortalamasını veren ortalama havuzlama.
Görsel Referansı - Maksimum Pooling örneği
Görsel Referansı - Ortalama Pooling örneği
Buraya kadar olan kısımda, evrişimsel sinir ağının iki temel işleminden bahsettik: Evrişim katmanı (convolution, padding, stride) ve pooling katmanı. Şimdi, evrişimsel katmanların bir görüntüden özellikleri nasıl çıkardığını öğrenelim.
Çıktı matrisindeki ortadaki beyaz alan girdi matrisindeki ortadaki dikey çizgiyi tanımlar.
Girdi matrisimizin sol yarısının beyaz, sağ yarısının ise gri renkte, [6x6] boyutlarında bir görüntü olduğunu ve bu görüntüde dikey çizgileri belirlemek istediğimizi düşünelim. Görüntünün merkezinde sol ve sağ yarıları birbirinden ayıran bir dikey çizgi mevcuttur. Dikey çizgileri algılamak için tasarlanmış bir matris olan filtre/kernel matrisimizin de [3x3] boyutlarında olduğunu düşünelim. Herhangi bir piksel ekleme veya kaydırma adım işlemi uygulanmadığında çıktı matrisimiz [4x4] boyutlarında olacaktır. Çıktı matrisi, girdi görüntüsünden dikey çizgileri başarıyla çıkardığımız evrişim işleminin sonuç matrisidir.
Görüntüde yatay çizgileri belirlemek istediğimizde ise yukarıdaki örnekte gösterilen filtre matrisine benzer bir yaklaşımla oluşturulan aşağıdaki filtre matrisi kullanılabilir.
Evrişimsel katmanlarda yatay ve dikey sınırların belirlenmesi ile ilgili bir örneği inceledik. Yukarıdaki örnekte matrisler ile verilen aynı örnek aşağıda görseller ile verilmiştir. 1. görselde dikey çizgiler, 2. görselde ise yatay çizgiler çıkarılmıştır.
1. Görsel Referansı - 2. Görsel Referansı
Makine öğrenmesinde sınıflandırma algoritmasına geliştirici tarafından önemli özellikler girdi (input) olarak verilmekteyken derin öğrenme modelinde özellik çıkarımı ve sınıflandırma bir aradadır. Model önemli özellikleri kendisi çıkarır.
Derin öğrenmede manuel özellik çıkarımı neden tercih edilmez?
Kısaca, farklı senaryoları işlemek zor olduğu için manuel özellik çıkarımı tercih edilmez.
Her bir evrişimsel sinir katmanı, artan karmaşıklık filtrelerini öğrenir. İlk katmanlar kenarlar, köşeler gibi temel özellikleri algılarken, orta katmanlar nesnelerin parçalarını (gözler, burun vb.) algılar. Son katmanlar ise daha yüksek temsillere sahiptir ve insan yüzü gibi nesnelerin tamamını tespit edebilir.
Evrişime iyi bir şekilde destek veren bütün derin öğrenme yapılarında evrişim işlemini uygulamak için bir fonksiyon mevcuttur. Örneğin python için conv_forward, tensorflow için tf.nn.conv2d ve keras için conv2D evrişim işlemi için kullanılan fonksiyonlardır.
Daha önce evrişimli sinir ağının iki ana bölümü olduğundan bahsetmiştik: Birincisi, evrişim/havuzlama mekanizması iken ikincisi ise tam bağlantılı bir katmandır.
Şimdi, evrişimli sinir ağının son katmanı olan tamamen bağlı katmanlara değinelim.
Evrişimsel sinir ağını kullanma sebebimiz; bir sınıflandırma modeli geliştirmek ve bu modelin girdilerinin doğru olmasını sağlayabilmektir.
Tamamen bağlı katman, pooling katmanından sonra yer almakta olup evrişimsel sinir ağının son aşamasında olduğumuzda devreye girer. Pooling katmanı (ortaklama) sonucu elde edilen çıktı, bu katmanda bir boyutlu bir vektöre dönüştürülür. Bunun sebebi, tek boyutlu vektöre dönüşmüş olan girdinin yapay sinir ağına eklenecek olmasıdır.
Modele verilecek olan girdilerin 1 boyutlu doğrusal vektör şeklinde olması gerekir. İşte bu yüzden düzleştirici (flatten) ve tam bağlantılı katmanlara ihtiyaç duyulmaktadır.
Bu makale kapsamında evirişimli sinir ağlarına ve ana öğelerine kısa bir giriş yapılmıştır. Özellikle görüntü işleme gibi konularda oldukça iyi çalışan ve harika sonuçlar verebilen evrişimli sinir ağları;
Daha geniş ve kapsamlı bilgilerin bulunduğu, Miuul'un sunduğu Data Scientist Path eğitimine katılarak kariyerinizde fark yaratabilirsiniz.
Kaynaklar