Efficientnet nedir ve nasıl Transfer Öğrenimi yapılır

Source: Deep Learning on Medium

Efficientnet nedir ve nasıl Transfer Öğrenimi yapılır

Google 2019’da yeni bir yapısal yaklaşıma sahip CNN ( Evrişimsel Sinir Ağları) hakkında ilgi çekici bir çalışma yayınladı.Bu çalışmanın sonucu Efficientnet,doğruluk ve işlem verimliliği konusunda sınırları yeniden çiziyor.

EfficientNet, sadece doğruluğu değil, aynı zamanda modellerin verimliliğini de geliştirmeye odaklanıyor.Çoğu modelden 5–10kat daha verimli iken % 6’ya varan doğruluk artışı da sergilemektedir.CNN’lerin gücünü arttırmak için genellikle daha fazla katman eklenir örn ResNet34, ResNet50,ResNet152 fakat performans doğru orantıda artmaz ve bir yerden sonra bu işlem mantıksız hale gelir.

Efficientnet modelleri B0-B7

Geliştiriciler modelin sadece derinliğini değil genişlik ve çözünürlük parametrelerinin de belli bir oranda arttırılması gerektiğini farketti. Bu ayrı ayrı ölçeklendirme tekniğine bileşik ölçeklendirme (compound scaling) denir.Derinlik,Genişlik,Çözünürlük nedir bunları inceleyelim.

Derinlik Parametresi:Ağların ne kadar derin olduğu anlamına gelir ki bu da içindeki katman sayısına eşittir. Daha derin ağlar daha zengin ve daha karmaşık özellikleri yakalayabilir ve başarı oranınızı arttırabilir fakat bu süreçte daha fazla işlem gücüne ihtiyaç duyarsınız ve Vanishing Gradient problemi yaşabilirsiniz.

Genişlik Parametresi:Genişliği bir katmanımızdaki nöron sayısı olarak düşünebiliriz.Daha geniş ağlar daha ince ayrıntılar yakalayabilir. Ayrıca, daha küçük modellerin eğitilmesi daha kolaydır.Bir süre sonra derinlik artışına benzer bir şekilde başarı oranınız doymaya başlar.

Çözünürlük parametresi:Modelimizi eğiteceğimiz resimlerin çözünürlüğü denebilir örneğin 224×224,300×300,600×600.Çözünürlüğü arttırmak resimdeki bilgi miktarını arttırsada aynı şekilde performans artışı doğrusal ilerlemez ve doyar.

a başlangıç modelimiz genişlik,derinlik,çözünürlük artışı gösterimi

Değişkenlerimizi belirledikten sonra en önemli kısıtımız (α * β² * γ²) ≈ 2 ,yani yapılan işlem sayısı(FLOPS) derinlikle doğrusal genişlik ve çözünürlük parametresinin 2. üstü ile değişmekte(yaklaşık olarak) aynı zamanda EfficientNetB5’in EfficientNetB4’e göre(Bn,Bn-1) 2kat FLOPS’a sahip olmasını belirleyen denklem. φ =1 kabul edip hiperparametre optimizasyonu yaptığımızda EfficientNet-B0 için değerlernimizin α = 1.2, β = 1.1, γ = 1.1 görülmekte.Derinlik parametresine bakıcak olursak başlangıç derinliğinin %20 arttığını görebiliriz.

derinlik parametremiz:(d)|genişlik parametremiz(w) |çözünürlük parametremiz(r)

Efficientnet kütüphanesini indirelim ve Tranfer Öğrenimi için hazırlayalım

pip install efficientnet

Gerekli kütüphaneleri importlayalım ve modelimizi oluşturalım. ImageNet dataları ile önceden eğitilmiş EfficientNetB3 versiyonunu yükledik,kendi verimiz ile eğiteceğimiz için include_top=False ile istediğimiz sınıf kadar nöron ekleyebilir ve input_shape(B3 optimum değer =300×300) kısmınıda değiştirebiliriz.

import efficientnet.keras as efn
from keras.models import Model
from keras.layers import *
model = efn.EfficientNetB3(include_top=False,input_shape=(300,300, 3))

Örneğin 2 sınıfımız(kedi,köpek) olduğunu varsayalım en son katmanımız dense olmalı ve sınıfımız kadar nöron içermeli “softmax” veya “sigmoid”(binary problemlerde kullanılır) aktivasyon fonksiyonları kullanılabilir.Regresyon problemi çözüyorsak en son katman 1 nöron içerir ve aktivasyonu “linear”dır.

x = GlobalAveragePooling2D()(model.output)
x = Dropout(0.5)(x)
x = Dense(2, activation='sigmoid')(x)
model= Model(model.inputs, x)

Önceden eğitilmiş modelimizin son 75 katmanını eğitilebilir yapıyorum.Sayıyı arttırdıkça eğitilebilir parametre sayısıda artıcaktır .

for layer in model.layers[:-75]:
layer.trainable = False
model.summary()
Eğitilebilir parametre:6068586 |Eğitime kapalı parametre:4718016

Modelimiz hazır compile ve sonrasında fit metodu ile eğitime başlayabiliriz.Elimizdeki veriye arttıkça eğitime açılacak katman sayısını arttırabiliriz.

-Kaynaklar-

  1. EfficientNet yayını: https://arxiv.org/abs/1905.11946

2.EfficientNet Keras :https://github.com/qubvel/efficientnet

3.https://ai.googleblog.com/2019/05/efficientnet-improving-accuracy-and.html