Aktarım öğrenimi özellikli ilk Keras modeliniz

1. Genel Bakış

Bu laboratuvarda, Keras sınıflandırıcıyı nasıl oluşturacağınızı öğreneceksiniz. Çiçekleri tanımak için sinir ağı katmanlarının mükemmel kombinasyonunu bulmaya çalışmak yerine, önce güçlü bir önceden eğitilmiş modeli veri kümemize uyarlamak için transfer öğrenme adı verilen bir teknik kullanacağız.

Bu laboratuvar, yapay sinir ağları hakkında gerekli teorik açıklamaları içerir ve derin öğrenme hakkında bilgi edinen geliştiriciler için iyi bir başlangıç noktasıdır.

Bu laboratuvar, "TPU'da Keres" serisinin 2. bölümüdür. Bunları aşağıdaki sırayla veya bağımsız olarak yapabilirsiniz.

ca8cc21f6838eccc.png

Neler öğreneceksiniz?

  • Softmax katmanı ve çapraz entropi kaybıyla kendi Keras görüntü sınıflandırıcınızı oluşturmak için
  • Hile yapmak için 😈, kendi modellerinizi oluşturmak yerine aktarımla öğrenmeyi kullanın.

Geri bildirim

Bu kod laboratuvarında bir yanlışlık görürseniz lütfen bize bildirin. Geri bildirimlerinizi, GitHub sorunları [feedback link] sayfasında bulabilirsiniz.

2. Google Colaboratory hızlı başlangıç kılavuzu

Bu laboratuvarda Google Collaboratory kullanılır ve herhangi bir kurulum yapmanıza gerek yoktur. Colaboratory, eğitim amaçlı bir online not defteri platformudur. Ücretsiz CPU, GPU ve TPU eğitimi sunar.

688858c21e3beff2.png

Bu örnek not defterini açıp Colaboratory hakkında bilgi edinmek için birkaç hücreyi inceleyebilirsiniz.

c3df49e90e5a654f.png Welcome to Colab.ipynb

TPU arka ucu seçme

8832c6208c99687d.png

Colab menüsünde Çalışma zamanı > Çalışma zamanı türünü değiştir'i ve ardından TPU'yu seçin. Bu kod laboratuvarında, donanım hızlandırmalı eğitim için desteklenen güçlü bir TPU (Tensör İşleme Birimi) kullanacaksınız. Çalışma zamanına bağlantı, ilk çalıştırma sırasında otomatik olarak kurulur veya sağ üst köşedeki "Bağlan" düğmesini kullanabilirsiniz.

Not defteri yürütme

76d05caa8b4db6da.png

Bir hücreyi tıklayıp Üst Karakter+Enter tuşlarını kullanarak hücreleri tek tek yürütün. Ayrıca, Çalışma zamanı > Tümünü çalıştır seçeneğini kullanarak not defterinin tamamını da çalıştırabilirsiniz.

İçindekiler

429f106990037ec4.png

Tüm not defterlerinde bir içindekiler listesi bulunur. Soldaki siyah oku kullanarak açabilirsiniz.

Gizli hücreler

edc3dba45d26f12a.png

Bazı hücrelerde yalnızca başlık gösterilir. Bu, Colab'a özgü bir not defteri özelliğidir. Üzerlerini çift tıklayarak içindeki kodu görebilirsiniz, ancak bu durum genellikle pek de ilgi çekici değildir. Genellikle destek veya görselleştirme işlevleridir. İçerideki işlevlerin tanımlanması için bu hücreleri yine de çalıştırmanız gerekir.

Kimlik Doğrulama

cdd4b41413100543.png

Yetkili bir hesapla kimlik doğrulama yaptığınızda Colab'ın gizli Google Cloud Storage paketlerinize erişmesi mümkündür. Yukarıdaki kod snippet'i bir kimlik doğrulama sürecini tetikler.

3. [INFO] Nöral ağ sınıflandırıcı 101

Özet

Sonraki paragrafta kalın olarak yazılmış terimlerin tümünü biliyorsanız bir sonraki alıştırmaya geçebilirsiniz. Derin öğrenmeye yeni başlıyorsanız hoş geldiniz. Lütfen okumaya devam edin.

Keras, katman dizisi olarak oluşturulan modeller için Sequential API'yi sunar. Örneğin, üç yoğun katman kullanan bir resim sınıflandırıcı Keras'ta şu şekilde yazılabilir:

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
    tf.keras.layers.Dense(500, activation="relu"),
    tf.keras.layers.Dense(50, activation="relu"),
    tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])

# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
  optimizer='adam',
  loss= 'categorical_crossentropy',
  metrics=['accuracy']) # % of correct answers

# train the model
model.fit(dataset, ... )

688858c21e3beff2.png

Yoğun sinir ağı

Bu, görüntüleri sınıflandırmak için kullanılan en basit nöral ağdır. Katmanlara yerleştirilmiş "nöronlardan" oluşur. Birinci katman giriş verilerini işler ve çıkışlarını diğer katmanlara iletir. Bu katmana "yoğun" denmesinin nedeni, her bir nöronun bir önceki katmandaki tüm nöronlara bağlı olmasıdır.

c21bae6dade487bc.png

Bir resmi, tüm piksellerinin RGB değerlerini uzun bir vektörde birleştirerek ve bunu giriş olarak kullanarak böyle bir ağa besleyebilirsiniz. Görüntü tanıma için en iyi teknik olmasa da daha sonra bu özelliği iyileştireceğiz.

Nöronlar, aktivasyonlar, RELU

Bir "nöron", tüm girişlerinin ağırlıklı bir toplamını hesaplar, "önyargı" adı verilen bir değer ekler ve sonucu, "etkinleştirme işlevi" olarak adlandırılan bir yöntemle iletir. Ağırlıklar ve önyargılar başlangıçta bilinmez. Bunlar rastgele başlatılır ve nöral ağ birçok bilinen veri üzerinde eğitilerek "öğrenilir".

644f4213a4ee70e5.png

En popüler etkinleştirme işlevi, Doğrulanmış Doğrusal Birim için RELU olarak adlandırılır. Yukarıdaki grafikte de görebileceğiniz gibi bu çok basit bir işlevdir.

Softmax etkinleştirme

Çiçekleri 5 kategoriye (gül, lale, karahindiba, papatya, ayçiçeği) ayırdığımız için yukarıdaki ağ 5 nöron katmanıyla sona eriyor. Ara katmanlardaki nöronlar, klasik RELU etkinleştirme işlevi kullanılarak etkinleştirilir. Ancak son katmanda, bu çiçeğin gül, lale vb. olma olasılığını temsil eden 0 ile 1 arasında sayılar hesaplamak istiyoruz. Bunun için "softmax" adlı bir etkinleştirme işlevi kullanacağız.

Bir vektöre softmax uygulamak için her bir öğenin üstel değeri alınır ve ardından vektör normalleştirilir. Bu işlem genellikle L1 normu (mutlak değerlerin toplamı) kullanılarak yapılır. Böylece, değerler 1'e ulaşır ve olasılık olarak yorumlanabilir.

ef0d98c0952c262d.png d51252f75894479e.gif

Kreuz entropi kaybı

Sinir ağımız artık giriş görüntülerinden tahminler ürettiğine göre, bunların ne kadar iyi olduğunu, yani ağın bize bildirdiği bilgilerle doğru yanıtlar arasındaki mesafeyi (genellikle "etiketler" olarak adlandırılır) ölçmemiz gerekir. Veri kümesindeki tüm resimler için doğru etiketlere sahip olduğumuzu unutmayın.

Herhangi bir mesafe işe yarar, ancak sınıflandırma sorunları için "entropiler arası mesafe" en etkilidir. Buna hata veya "kayıp" işlevimiz diyeceğiz:

7bdf8753d20617fb.png

Gradyan inişi

Sinir ağını "eğitmek", çapraz entropi kayıp işlevini en aza indirmek için ağırlıkları ve önyargıları ayarlamak amacıyla eğitim resimlerini ve etiketlerini kullanmak anlamına gelir. İşleyiş şekline bakalım.

Çapraz entropi, eğitim resminin ağırlıkları, önyargıları, pikselleri ve bilinen sınıfının bir işlevidir.

Tüm ağırlıklara ve tüm sapmalara göre çapraz entropinin kısmi türevlerini hesaplarsak, belirli bir görüntü, etiket ve ağırlıkların ve yanlılığın mevcut değeri için hesaplanan bir "gradyan" elde ederiz. Milyonlarca ağırlığa ve sapmaya sahip olabileceğimizi, bu nedenle gradyanı hesaplamanın çok fazla iş yükü olacağını unutmayın. Neyse ki Tensorflow bunu bizim için yapıyor. Gradyanların matematiksel özelliği "yukarı" işaret etmeleridir. Çapraz entropinin düşük olduğu yere gitmek istediğimizden ters yönde ilerliyoruz. Ağırlıkları ve sapmaları gradyanın bir kısmına göre güncelleriz. Daha sonra, bir eğitim döngüsünde sonraki eğitim görüntüsü ve etiketi gruplarını kullanarak aynı şeyi tekrar tekrar yaparız. Bunun, çapraz entropinin minimum düzeyde olduğu bir yere yaklaşacağını umuyoruz, ancak bu minimum değerin benzersiz olduğunu hiçbir şey garanti etmemektedir.

gradient descent2.png

Mini toplanma ve ivme

Gradyanınızı yalnızca bir örnek resimde hesaplayabilir ve ağırlıkları ile önyargıları hemen güncelleyebilirsiniz. Ancak bunu 128 resimlik bir grupta yaptığınızda, farklı örnek resimlerin getirdiği kısıtlamaları daha iyi temsil eden bir gradyan elde edersiniz. Bu nedenle, çözüme daha hızlı yaklaşma olasılığı daha yüksektir. Mini grubun boyutu ayarlanabilir bir parametredir.

Bazen "stokastik gradyan azalma" olarak da adlandırılan bu tekniğin daha pratik bir avantajı vardır: Gruplarla çalışmak, daha büyük matrislerle çalışmak anlamına da gelir ve bu matrislerin GPU'larda ve TPU'larda optimizasyonu genellikle daha kolaydır.

Yine de yakınsama biraz karmaşık olabilir ve gradyan vektörü tamamen sıfır ise durabilir. Bu, minimum değeri bulduğumuz anlamına mı geliyor? Her zaman değil Bir renk geçişi bileşeni, minimum veya maksimum değerde sıfır olabilir. Milyonlarca öğe içeren bir gradyan vektöründe, bunların tümü sıfır ise her sıfırın minimuma ve hiçbirinin maksimum noktaya karşılık gelme olasılığı oldukça düşüktür. Çok boyutlu bir alanda eyer noktaları oldukça yaygındır ve bunlarda durmak istemeyiz.

52e824fe4716c4a0.png

Görsel: eyer noktası. Gradyan 0'dır ancak tüm yönlerde minimum değildir. (Resim ilişkilendirmesi Wikimedia: By Nicoguaro - Own work, CC BY 3.0)

Çözüm, optimizasyon algoritmasına biraz momentum eklemektir. Böylece algoritma, durma noktasını geçerken sorun yaşamaz.

Sözlük

toplu veya mini toplu: Eğitim, her zaman eğitim verisi ve etiket grupları üzerinde gerçekleştirilir. Bu, algoritmanın yakınlaşmasına yardımcı olur. "Toplu" boyutu, genellikle veri tenörlerinin ilk boyutudur. Örneğin, [100, 192, 192, 3] şeklindeki bir tensör, piksel başına üç değer (RGB) içeren 192x192 piksel boyutunda 100 resim içerir.

Çapraz entropi kaybı: Sınıflandırıcılarda sıklıkla kullanılan özel bir kayıp işlevidir.

Yoğun katman: Her nöronun önceki katmandaki tüm nöronlara bağlı olduğu bir nöron katmanı.

özellikler: Bir nöral ağın girişlerine bazen "özellikler" denir. İyi tahminler elde etmek için bir veri kümesinin hangi bölümlerinin (veya bölüm kombinasyonlarının) bir yapay zeka ağına besleneceğini belirleme sanatına "özellik mühendisliği" denir.

labels: Gözetimli sınıflandırma problemindeki "sınıflar" veya doğru yanıtlar için kullanılan başka bir ad

Öğrenme hızı: Ağırlıkların ve önyargıların eğitim döngüsünün her iterasyonunda güncellendiği gradyanın kesri.

logits: Aktivasyon işlevi uygulanmadan önce bir nöron katmanının çıktılarına "logit" adı verilir. Bu terim, eskiden en popüler aktivasyon işlevi olan "mantıksal işlev" (diğer adıyla "sigmoid işlevi") teriminden gelir. "Mantıksal işlevden önceki nöron çıkışları" ifadesi "mantıksallar" olarak kısaltıldı.

loss: nöral ağ çıkışlarını doğru yanıtlarla karşılaştıran hata işlevi

nöron: Girişlerinin ağırlıklı toplamını hesaplar, bir ağırlık ekler ve sonucu bir aktivasyon işlevi aracılığıyla iletir.

tek sıcak kodlama: 5 üzerinden 3. sınıf, 5 öğeden oluşan bir vektör olarak kodlanır. 3'üncü olan (1) hariç tüm sıfırlar kullanılır.

relu: Düzeltilmiş doğrusal birim. Nöronlar için popüler bir aktivasyon işlevidir.

sigmoid: Eskiden popüler olan ve özel durumlarda hâlâ faydalı olan başka bir etkinleştirme işlevidir.

softmax: Bir vektör üzerinde işlem yapan, en büyük bileşen ile diğer tüm bileşenler arasındaki farkı artıran ve ayrıca olasılık vektörü olarak yorumlanabilmesi için vektörün toplamını 1 olacak şekilde normalleştiren özel bir etkinleştirme işlevidir. Sınıflandırıcılarda son adım olarak kullanılır.

tensör: "Tensör", matris gibidir ancak isteğe bağlı sayıda boyuta sahiptir. 1 boyutlu bir tensör bir vektördür. 2 boyutlu bir tensör bir matristir. 3, 4, 5 veya daha fazla boyutlu tensörleriniz de olabilir.

4. Transfer Öğrenimi

Görüntü sınıflandırma sorunları için yoğun katmanlar muhtemelen yeterli olmayacaktır. Evrimsel katmanlar ve bunları çeşitli şekillerde düzenlemenin yolları hakkında bilgi edinmemiz gerekiyor.

Ancak kısa yoldan da gidebiliriz. İndirebileceğiniz tam eğitimli konvolüsyonlu nöral ağlar mevcuttur. Bunların son katmanı olan softmax sınıflandırma başlığını kesip kendi katmanınızla değiştirebilirsiniz. Eğitilen tüm ağırlıklar ve ağırlıklar olduğu gibi kalır, yalnızca eklediğiniz softmax katmanını yeniden eğitirsiniz. Bu tekniğe transfer öğrenimi denir ve sinir ağının önceden eğitildiği veri kümesi sizinkine "yeterince yakın" olduğu sürece şaşırtıcı bir şekilde işe yarar.

Uygulamalı

Lütfen aşağıdaki not defterini açın, hücreleri yürütün (Üst Karakter-ENTER) ve "İŞ GEREKLİ" etiketini gördüğünüz her yerde talimatları uygulayın.

c3df49e90e5a654f.png Keras Flowers transfer learning (playground).ipynb

Ek bilgiler

Transfer öğrenimi sayesinde hem en iyi araştırmacılar tarafından geliştirilen gelişmiş konvolüsyonel nöral ağ mimarilerinden hem de büyük bir görüntü veri kümesinde ön eğitimden yararlanabilirsiniz. Bu örnekte, çok sayıda bitki ve dış mekan sahneleri içeren, çiçeklere yeterince yakın olan bir görüntü veritabanı olan ImageNet'te eğitimli bir ağdan bilgi aktaracağız.

b8fc1efd2001f072.png

Görsel: Daha önce eğitilmiş karmaşık bir konvolüsyonel sinir ağını siyah kutu olarak kullanarak yalnızca sınıflandırma başlığını yeniden eğitme. Bu, aktarım öğrenmedir. Konvolüsyonel katmanlardan oluşan bu karmaşık düzenlemelerin nasıl işlediğini daha sonra göreceğiz. Şu an için bu başka birisiyle ilgili.

Keras'ta transfer öğrenme

Keras'ta, tf.keras.applications.* koleksiyonundan önceden eğitilmiş bir model oluşturabilirsiniz. Örneğin MobileNet V2, makul boyutta kalan çok iyi bir kıvrımlı mimaridir. include_top=False öğesini seçtiğinizde, son softmax katmanı olmadan önceden eğitilmiş modeli elde edersiniz. Böylece kendi modelinizi ekleyebilirsiniz:

pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False

model = tf.keras.Sequential([
    pretrained_model,
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(5, activation='softmax')
])

pretrained_model.trainable = False ayarına da dikkat edin. Önceden eğitilmiş modelin ağırlıklarını ve önyargılarını dondurur. Böylece yalnızca softmax katmanınızı eğitirsiniz. Bu işlem genellikle nispeten az ağırlık içerir ve çok büyük bir veri kümesi gerektirmeden hızlı bir şekilde yapılabilir. Ancak çok fazla veriniz varsa transfer öğrenme, pretrained_model.trainable = True ile daha da iyi sonuç verebilir. Daha sonra, önceden eğitilmiş ağırlıklar mükemmel başlangıç değerleri sağlar ve sorununuza daha iyi uyacak şekilde eğitim tarafından ayarlanabilir.

Son olarak, yoğun softmax katmanınızın önüne Flatten() katmanının eklendiğine dikkat edin. Yoğun katmanlar düz veri vektörleriyle çalışır ancak önceden eğitilmiş modelin döndürdüğü şeyin bu olup olmadığını bilmiyoruz. Bu nedenle düzeltmemiz gerekiyor. Bir sonraki bölümde kıvrımlı mimarileri ele alırken kıvrımlı katmanların döndürdüğü veri biçimini açıklayacağız.

Bu yaklaşımla %75'e yakın doğruluk elde edebilirsiniz.

Çözüm

Çözüm not defterini burada bulabilirsiniz. Takılırsanız kullanabilirsiniz.

c3df49e90e5a654f.png Keras Flowers transfer learning (solution).ipynb

Ele aldığımız konular

  • 🤔 Keras'ta sınıflandırıcı yazma
  • 🤓, softmax son katmanı ve çapraz entropi kaybıyla yapılandırılmış
  • 😈 Transfer öğrenme
  • 🤔 İlk modelinizi eğitme
  • 🧐 Eğitim sırasında veri kaybını ve doğruluğu takip etme

Lütfen bu kontrol listesini gözden geçirin.

5. Tebrikler!

Artık Keras modeli oluşturabilirsiniz. Devrimsel katmanların nasıl oluşturulacağını öğrenmek için lütfen bir sonraki laboratuvara geçin.

Uygulamada TPU'lar

TPU'lar ve GPU'lar Cloud AI Platform'da kullanılabilir:

Son olarak, geri bildirimlere değer veriyoruz. Bu laboratuvarda bir eksiklik görürseniz veya bir şeylerin iyileştirilmesi gerektiğini düşünüyorsanız lütfen bize bildirin. Geri bildirim, GitHub sorunları [geri bildirim bağlantısı] üzerinden gönderilebilir.

HR.png

Martin Görner ID small.jpg
Yazar: Martin Görner
Twitter: @martin_gorner

tensorflow logo.jpg
www.tensorflow.org