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

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s