YZ06: Kapsül Ağını (Capsule Network) 68 Saat Eğittim!

Kapsül ağları (Capsule Networks) ile ilgili epey bir araştırma yaptıktan ve şu Türkçe yazıyı da okuduktan sonra bu yeni ağı denemeye karar verdim. GPU’lu bir bilgisayarım olmadığı için Sıradan CPU’lu Dizüstü Bilgisayarda Derin Öğrenme Çalışmak yazımda özelliklerini belirttiğim bilgisayarımda denemekten başka çarem yoktu.

Aşağıdaki Github reposunda yer alan -Türkçe yorum satırları da bulunan- kodu kendi bilgisayarımda çalıştırdım.

https://github.com/deeplearningturkiye/kapsul-agi-capsule-network

Kullandığım Kapsül Ağı Mimarisi

28×28 boyutundaki 60 bini eğitim ve 10 bini de test olmak üzere toplam 70 bin resimden oluşan MNIST veriseti ile çalıştım. Kullandığım model şöyle:

Veri Artırma (Data Augmentation)

Başarım oranını artırmak için orijinal makalede de yer aldığı şekliyle yatay ve dikey eksenlerde yaklaşık 2’şer piksel kaydırma uyguladım.

Eğitim Ne Kadar Sürdü

Öncelikle kapsül ağını MNIST veriseti üzerinde eğitmek, benim için çok yorucu oldu. Eğitim toplam 68 saat, yani yaklaşık 3 gün aralıksız sürdü.

Eğitim Sonuçları

Toplam 50 epoch çalıştırmıştım. Kapsül ağı mimarisinde yaklaşık 8.2 MİLYON parametre vardı. Eğitim işlemi sonucunda elde ettiğim parametreleri saklayan dosyanı boyutu 32.9 MB idi. Her bir epoch yaklaşık bir buçuk saat sürdü.

En iyi validasyon doğruluk oranını 34. epochta % 99.66 olarak elde ettim. Eğitim işlemi bitince test işlemini gerçekleştirdim. Test işleminde eğitim süresince hiç göstermediğim toplam 10 BİN resmi gösterdim. Test işlemi sonucunda % 99.61 başarı ile tanıma gerçekleştirdim. Diğer bir deyişle % 0.39 hata ile tanıma işlemi gerçekleştirdim.

SONUÇ

  • Kapsül ağları güzel fakat henüz yeni ortaya atıldığı için daha önünde çok yol var.
  • Derin öğrenme çalışmalarını CPU’da yapmak zaten ızdıraptı ama Kapsül Ağları ile ızdırap daha da artacak gibi duruyor. Çünkü gerçekten yavaş çalışıyor.
  • Eğitimin bitmesini beklediğim 68 saatte aklıma bir çok yeni fikir geldi 🙂 Bir sonraki hedefim onları gerçekleştirmek olacak.

YZ05: Sıradan CPU’lu Dizüstü Bilgisayarda Derin Öğrenme Çalışmak

Herkese merhaba. Derin öğrenme (deep learning) çalışanların “derin öğrenme için GPU şart!” dediğini duymuşsunuzdur. Derin öğrenmede matris çarpımları yapıldığı için grafiksel işlemler için üretilen GPU’ların işe yaradığı görülmüş. GPU ile CPU’nun farkı nedir derseniz:

GPU’lar, yani grafiksel işleme birimleri, en çok videolarda ve ekranınızda çizilen grafiklerde kullanılır. GPU’suz bilgisayarlar çalışabilse de böyle bir bilgisayara monitör bağlayamazsınız. Bu tür GPU’suz PC’ler (genellikle sunucular) uzak bağlantı ile yönetilmektedir.

GPU’lar, bazen anakartınıza entegre edilmiş bir çip olarak, bazen ise ayrı bir PCI-Express kartı olarak karşımıza çıkarlar. CPU ve GPU arasındaki fark ise, GPU’ların grafiklerle ilgili işlemler için optimize edilmiş olmasıdır. GPU içerisinde bulunan çekirdek sayısı, üreticisine göre değişir. Nvidia, daha az çekirdekle daha fazla güç sunmayı tercih ederken, AMD’nin çözümleri genellikle daha fazla çekirdek içeriyor. Örnek vermek gerekirse, uç nokta bir Nvidia kartında 68 çekirdek, AMD ekran kartında ise 1.500 çekirdek bulunuyor. [1]

Bu yazıda TensorFlow sitesinde yer alan Deep MNIST for Experts sayfasındaki evrişimli sinir ağı (CNN) mimarisinde çeşitli değişiklikler yapacağım. Kendi CPU’lu bilgisayarımda ne kadar sürdüğünü, doğruluk oranlarını ve çeşitli notlarımı paylaşacağım.

MNIST verisetinde 0’dan 9’a kadar olan el yazısı ile yazılmış 28×28 boyutunda 60 bin’i eğitim ve 10 bin’i test için olmak üzere 70 bin resim bulunmaktadır. Amacımız 60 bin resmi kullanarak CNN algoritması ile eğitim işlemini yapmak ve 10 bin resim üzerinde test işlemini gerçekleştirmektir.

MNIST: http://yann.lecun.com/exdb/mnist/

Bilgisayarımın özellikleri şöyle:

  • Samsung Ultrabook Np530U3C
  • İşlemci: Intel(R) Core (TM) i5-337U CPU @ 1.8 Ghz 1.8 Ghz
  • RAM: 4 GB
  • İşletim Sistemi: Windows 10 Pro
  • Güç Planı: Yüksek Performans

Evrişimli Sinir Ağlarının (CNN) çalışma prensiplerini şu yazımdan okuyabilirsiniz: https://yapaybot.com/2017/07/03/derin-ogrenme-ile-resimdeki-objeyi-tanima/

Aşağıda mimari olarak belirtiğim satırlarda:

  • 5x5x32 CONV: 32 adet 5×5 filtre (kernel, filtre)
  • 2×2 MAX POOL: 2×2 MAX POOL işlemi için çerçeve boyutunu
  • 1024 FC: Tam bağlı (fully connected) katmandaki toplam nöron sayısını

belirtmektedir.

1. Deneme: Aynı Mimari Aynı Kod

İlk olarak sayfada yer alan kodu aynen çalıştırmayı denedim. Mimari şöyle:

5x5x32 CONV + 2x2 MAX POOL + 5x5x64 CONV + 2x2 MAX POOL + 1024 FC + DROPOUT + 10 FC

Bu çalışma 2 saat 11 dakika sürdü. 16 epoch boyunca test doğruluk (accuracy) oranı sürekli artış gösterdi. 16 epoch sonunda elde ettiğim doğruluk oranı 0.9921

2. Deneme: DROPOUT Katmanını Çıkardım

Başarımı ve ağın genelleştirme yeteneğini artırmak için kullanılan DROPOUT katmanını çıkarıp deneme yaptım. Mimari şöyle:

5x5x32 CONV + 2x2 MAX POOL + 5x5x64 CONV + 2x2 MAX POOL + 1024 FC + 10 FC

Bu çalışma 2 saat 17 dakika sürdü. Eğitim doğruluk oranı (training accuracy) 3. epoch’tan sonra 1 oldu. DROPOUT katmanı eğitim verisine bağımlığı artırdığını test etmiş oldum. Test doğruluk oranında osilasyonlar (azalma artma) meydana geldi. En iyi doğruluk oranını 15. epoch’ta 0.9913 olarak elde ettim.

3. Deneme: İkinci CONV ve MAX POOL Katmanlarını Çıkardım

Ağın mimarisini daha basistleştirmek için ikinci CONV ve MAX POOL katmanlarını çıkardım. Bu çalışma 1 saat 18 dakika sürdü. Yani çalışma süresinde yaklaşık bir saatlik kısalma söz konusu oldu. Her seferinde tek bir değişiklik yaptığım için bu adımda DROPOUT katmanını tekrar ekledim. Mimari şöyle:

5x5x32 CONV + 2x2 MAX POOL + 1024 FC + DROPOUT + 10 FC

Ağın derinliğini azaltmak, özellikle de iki olan CONV katman sayısını teke düşürmek test doğruluğunu ciddi şekilde azalttı. 2. deneme kadar olmasa da test doğruluk oranında osilasyon gözlemledim. En iyi test doğruluğunu 16. epoch’ta 0.9902 olarak kaydettim.

4. Deneme: İlk MAX POOL Katmanını Çıkarmaya Çalıştım

MAX POOL katmanı hem boyut azaltma hem de önemli bilgilerin özetleme yöntemi olarak düşünüldüğünden çok önemli. Çalıştırmaya çalıştığım mimari şöyle idi:

5x5x32 CONV + 5x5x64 CONV + 2x2 MAX POOL + 1024 FC + DROPOUT + 10 FC

İlk CONV katmanından hemen sonra gelen MAX POOL katmanını çıkarmaya çalıştığımda kodlarımda “Python çalışmayı durdurdu” hatası aldım. MAX POOL katmanı işlenen resmin boyutunu azalttığı için ilk katmanı çıkarmam ikinci CONV katmanına yük bindirdi. 4 GB RAM yetmediği için bu denemeyi gerçekleştiremedim. Bu sorunun farklı çözümleri var. Batch boyutunu azaltmak gibi. Fakat karşılaştırma yapabilmek adına onlara bu çalışmada yer vermedim.

5. Deneme: İkinci MAX POOL Katmanını Çıkardım

İlk MAX POOL katmanını donanım yetersiz kaldığı için çıkaramadım o yüzden ikinci MAX POOL katmanı çıkarmayı denedim. Bu çalışma 3 saat 19 dakika sürdü. Yani orijinal mimariden yalnızca bir MAX POOL katmanını çıkarmak eğitim süresini 1 saat artırdı. Mimari şöyle:

5x5x32 CONV + 2x2 MAX POOL + 5x5x64 CONV + 1024 FC + DROPOUT + 10 FC

Bu mimaride test doğruluk oranının 16 epoch boyunca sürekli arttığını gözlemledim. En iyi doğruluk oranı ise 16. epoch’ta 0.9906 idi.

SONUÇ

CNN mimarisinde doğruluk oranına en fazla etki eden katman tartışmasız CONV katmanıdır.

Ufak bir veriseti olan MNIST ile 2’şer CONV ve MAX POOL katmanından oluşan bir mimaride bile işlemler gerçekten uzun sürüyor. Veriseti boyutu ve ağ derinliği arttıkça işlerde içinden çıkılmaz bir hal alıyor. Ama yine de algoritmaların çalışma prensiplerini öğrenmek için CPU yeterli olur. Derin öğrenmeye başlamak için yalnızca bir bilgisayara ihtiyacınız var!

[1] https://www.chip.com.tr/haber/cpu-gpu-apu-nedir-bunlar-gpu-nedir-cpu-dan-ne-farki-var-apu-nedir_38704_2.html

YZ04: KNN (En Yakın K Komşu = K Nearest Neighbor) Algoritması ile Veri Sınıflama

KNN Algoritması

Merhabalar. Yapay Zeka pratik örnekler serimize devam ediyoruz. Bu yazıda verileri kolayca sınıflamak için kullanılan KNN (En Yakın K Komşu = K Nearest Neighbor) algoritmasının temel prensiplerini açıkladıktan sonra her zamanki gibi Python ile örnek uygulamamızı yapacağız. Yeni yazılardan ve duyurulardan anında haberdar olmak için sağ taraftaki menüden e-posta listemize abone olmayı unutmayın. “YZ04: KNN (En Yakın K Komşu = K Nearest Neighbor) Algoritması ile Veri Sınıflama” yazısını okumaya devam et

YZ03: Türk Yapay Zekası Cognitus’un Python ile Kullanımı

YZ00: Yapay Zeka’ya Giriş

YZ01: Derin Öğrenme ile Resimdeki Objeyi Tanıma

YZ02: Clarifai API ile Adrina Lima’yı Tanıyan Yapay Zeka Uygulaması

YZ03: Türk Yapay Zekası Cognitus’un Python ile Kullanımı

Merhabalar yapay zeka pratik örnekler serimize Türk yapay zekası Cognitus ile devam ediyoruz. Etiya tarafından Yıldız Teknik Üniversitesi Teknopark‘ta geliştirilen Cognitus doğal dil işleme alanında sanıyorum Türkiye’den çıkan ve API’sini paylaşan ilk yapay zeka uygulaması. “YZ03: Türk Yapay Zekası Cognitus’un Python ile Kullanımı” yazısını okumaya devam et

YZ02: Clarifai API ile Adriana Lima’yı Tanıyan Yapay Zeka Uygulaması

YZ00: Yapay Zeka’ya Giriş

YZ01: Derin Öğrenme ile Resimdeki Objeyi Tanıma

YZ02: Clarifai API ile Adrina Lima’yı Tanıyan Yapay Zeka Uygulaması

Merhabalar! Bir önceki yazıda hatırlayacağınız üzere “Derin Öğrenme ile Resimdeki Objeyi Tanıma” ile ilgili pratik bir örnek yapmıştık. Bu yazıdan çıkarılacak en güzel sonuç; eğer elimizde yeterli veri varsa Convolutional Neual Network (CNN) ile resimlerdeki nesneleri tespit edebiliriz. Bu yazıda Clarifai adında bir siteden bahsedeceğim. Bu site sayesinde önceden eğitilmiş bir derin öğrenme ağını, kendi geliştirdiğiniz uygulamalarda kullanabiliyoruz. Bunu Clarifai’ın bize sunmuş olduğu API (Application Programming Interface) yani Uygulama Programlama Arayüzü ile gerçekleştirebiliriz. Bunu yapmak için ihtiyacımız olan tek şey Clarifai sitesinden bir ücretsiz hesap açıp API anahtarı (API key) almak ve daha sonra bu API anahtarı ile birkaç satır Python kodu ile uygulama geliştirmektir. Bu yazıda Clarifai API kullanarak bir resmin içeriğinin ne olduğu ya da ne ile ilişkili olduğunu anlayacak, resimde bulunan ünlünün kim olduğunu ve  insan yüzlerini tespit edeceğiz. Hadi başlayalım. “YZ02: Clarifai API ile Adriana Lima’yı Tanıyan Yapay Zeka Uygulaması” yazısını okumaya devam et

YZ01: Derin Öğrenme ile Resimdeki Objeyi Tanıma

YZ00: Yapay Zeka’ya Giriş

YZ01: Derin Öğrenme ile Resimdeki Objeyi Tanıma

Merhabalar. Bu yazıda görüntü işleme alanında sıklıkla kullanılan derin öğrenme (deep learning) algoritmalarından biri olan Konvolüsyon Nöral Ağı -bilinen adıyla Convolutional Neural Network (CNN)- ile bir resimde kedi mi köpek mi olduğunu anlayacak bir yapay zeka algoritmasını geliştirecek ve test edeceğiz. Bu ağdan yazının ilerleyen satırlarında CNN olarak bahsedeceğim. “YZ01: Derin Öğrenme ile Resimdeki Objeyi Tanıma” yazısını okumaya devam et

YZ00: Yapay Zeka’ya Giriş

Merhaba!

Yapay Bot’a hoşgeldiniz. Bu blogda; son zamanlarda iyice popülerleşen Yapay Zeka (Artificial Intelligence), ve Nesnelerin İnterneti (Internet of Things) hakkında yazılar paylaşacağım. Blogu açmaktaki amacım, hem bu konulara çalışırken aldığım notları paylaşmak hem de 7’den 70’e herkesin bu kavramları bilmesini, tanımasını ve en önemlisi de kolayca uygulamasını sağlamak. “YZ00: Yapay Zeka’ya Giriş” yazısını okumaya devam et