Loading...
Loading...
Loading...
👩🏫 Yapay Sinir Ağlarıyla İlgili Teorik Detaylar
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
👩💻 Yapay Sinir Ağları Kodlamasına Giriş
Loading...
Loading...
🚪 Tensorflow ve Keras ile bilgisayar görüşü problemlerini çözmeye giriş
Loading...
✨ Bilgisayar Görüşü problemlerinde kullanılan Sinir Ağlarının İyileştirilmesi
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
🔦 Evrişimli Sinir Ağları Kodları
Loading...
🥽 Derin Öğrenme Bağlamında Kullanılan Popüler Stratejiler
Loading...
Loading...
Loading...
🤡 Resim Artırma Tekniği Kavramları
Loading...
Loading...
Loading...
Loading...
Loading...
🕵️♀️ Popüler Obje Algılama Teknikleri
Loading...
Loading...
Loading...
Loading...
⛓ Dizi Modellerinin Temelleri
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Derin Öğrenme Hakkında Notlarım
🤝 Türkçe içeriğine katkıda bulunmak adına İngilizce olan DeepLearningNotes 🦋 projemin çevirisidir
🐛 Dil hataları veya düzgün çevrilmemiş cümleler bulduğunuzda Pull Request veya Issue açarak bana bildirmeniz hoş olur 😇
#
Başlık
0.
1.
2.
3.
4.
5.
6.
7.
8.
9.
#
Başlık
0.
1.
Öğrenme algoritmanızın iki ana bilgi kaynağı vardır; bir tanesi veri, diğeri de elle müdahele ederek yaptığımız dokunuşlar 🤔🚀
✨ Pull Request açarak içeriği iyileştirmeme ve artırmama yardımcı olun
👓 Bana bir mail atarak veya issue açarak önerilerinizi söyleyin
Bana mail atarak veya LinkedIn üzerinden ulaşarak benimle iletişime geçebilirsiniz, Asmaa 🦋
Aşağıda verilen veri seti için:
Bizim amacımız:
Kavram
Açıklama
m
Veri setindeki örnek sayısı
Veri setindeki i
'nci örnek
ŷ
Tahmin edilen çıktı
Kayıp Fonksiyonu Loss Function 𝓛(ŷ, y)
Tek bir örnek için hata hesaplama fonksiyonu
Cost Function Maliyet Fonksiyonu 𝙹(w, b)
Tüm eğitim setinin kayıp fonksiyonlarının ortalaması
Konveks Fonksiyon
Tek bir yerel değere sahip fonksiyon
Konveks Olmayan Fonksiyon
Çok sayıda farklı yerel değere sahip fonksiyon
Gradyan İnişi Gradient Descent
Maliyet Fonksiyonunun global değerini bulmak için kullanılan iteratif bir optimizasyon yöntemidir
Başka bir deyişle: Maliyet Fonksiyonu
w
veb
veri seti için ne kadar iyi olduklarını ölçer. Ona dayanarak, en iyiw
veb
değerleri,𝙹(w, b)
'ı mümkün olduğunca küçülten değerlerdir
Gradyan inişi, türevlenebilir bir fonksiyonun yerel minimumunu bulmak için birinci dereceden yinelemeli bir optimizasyon algoritmasıdır. Buradaki ana fikir, mevcut noktada fonksiyonun gradyanının (veya yaklaşık gradyanının) zıt yönünde tekrarlanan adımlar atmaktır, çünkü bu en dik iniş yönüdür. Diğer taraftan, gradyan yönünde adım atmak, bu fonksiyonun yerel bir maksimumuna yol açacaktır; bu prosedür de gradyan yükselişi olarak bilinir.
Genel Formül:
α
(alpha) Öğrenme Hızı'dir (Learning Rate)
Model ağırlıkları her güncellendiğinde karşılık gelen tahmini hata nedeniyle her Gradyan İnişi tekrarının adımının boyutunu belirleyen pozitif bir skalardır, bu nedenle bir sinir ağı modelinin bir problemi ne kadar hızlı veya yavaş öğrendiğini kontrol eder.
👩🏫 Yapay Sinir Ağlarıyla İlgili Teorik Detaylar
Yapay sinir ağı kavramlarını teorik detayları ile barındırır
Bir sinir ağı, insan beyni gibi kendini modelleyen bir makine öğrenmesi türüdür. Bu, bir algoritma ile bilgisayarın yeni veriler eklenerek öğrenmesini sağlayan yapay bir sinir ağı oluşturur.
Yapay sinir ağları derin öğrenme olarak adlandırılan şeyi gerçekleştirebilir. Beynin temel birimi nöron iken, yapay bir sinir ağının temel yapı taşı basit sinyal işlemeyi gerçekleştiren bir algılayıcıdır ve bunlar daha sonra büyük bir ağa bağlanır.
Birçok sinir ağı türü vardır, uygun türü seçmek, çözmeye çalıştığımız soruna bağlıdır, örneğin
Tür
Açıklama
Uygulama
👼 Standart NN
Bazı özellikleri giriyoruz ve çıktısını tahmin ediyoruz
Online Reklamcılık, Emlak
🎨 CNN
Özellik çıkarımı (feature extraction) için convolutions
ekleriz
Fotoğraf Etiketleme
🔃 RNN
Dizi sequence verileri için uygun
Makine Çevirisi, Konuşma Tanıma (speech recognition)
🤨 Özel NN / Hibrit
Karmaşık problemler için
Otonom Sürüş
🚧 Yapılandırılmış Veriler
Tablolar
Giriş alanlarımız ve çıktı alanımız var
🤹♂️ Yapılandırılmamış Veriler
Görüntüler, sesler ve metinler gibi
Modelimizi oluşturmak için özellik çıkarma algoritmaları kullanmamız gerekiyor
🤝 Projeye Katkıda Bulunma Rehberi ve Detayları
🕸 Düz Yapay Sinir Ağları, Evrişimli Yapay Sinir Ağları ve Tekrarlayan Yapay Sinir Ağlarının kavramları, teoriği ve uygulanması ile ilgili ayrıntılı notlar içermektedir
🌱 Proje, DeepLearningNotes💫 adı altında İngilizce olarak başlatılmıştır, daha sonra Türkçe'ye çevrilmiştir 🚀 ve şuanda paralel yürütülmekte
😢 Çevrilemeyen yerleri çevirme
🐛 Dil hatasını giderme
💖 Çeviri iyileştirme
✨ Yeni bilgi ekleme
🐞 Hatalı bilgiyi düzeltme
Çeviremediğim cümlerleri (çeviremedim 😢
) yazısıyla belirtiyorum
Her yazının sonunda, asıl projedeki karşılığına ait bir link bulunmakta, dil hatası veya anlaşılamayan bir cümle bulduğunuz zaman düzeltmek için GitHub üzerinden Pull Request açarsanız veya benle iletişime geçerseniz hoş olur ⭐ (Hatta çok hoş olur 🤗)
Hatalar basit (örn. 'yazım hatası', 'böyle olsa daha iyi anlaşılır' vs. gibi) olsa bile çekinmeden bildirmeniz çok hoş olur 🎉
Hatalı bilgi veya yeni bilgi eklemek istediğinizde bilgi kaynağını belirterek GitHub üzerinden Pull Request açarsanız veya benimle iletişime geçerseniz projeyi büyütmeme ve daha faydalı hale getirmeme yardımcı olursunuz (şimdiden teşekkür ederim 🎊)
Projedeki bütün çeviriler Proje Sözlüğüne 📕 göre yapılmıştır
🔎 Anlaşılamayan bir kavram bulduğunuz zaman sözlüğe bakıp İngilizce'sine bakabilirsiniz
📚 olanlar internette araştırarak bulduğum çevirilerdir
🦋 olanlar kişisel çevirilerdir (iyileştirilebilir 👩🔧)
❓ olanlar, daha çeviremediğim kavramlar (yardıma ihtiyaç var 🆘)
DeepLearningTürkiye sözlüğüne teşekkürler 🤗
💼 Derin Öğrenme bağlamında faydalı araçlar
Ağın grafiğini görselleştir
CNN'deki her bir katmanın giriş ve çıkışlarını izle
🚀 Sınıflarına göre resimleri indirin
💁♀️ Toplu bağlantıları tek tıklamayla indirin
👩💻 Google Chrome eklentisi
Aktivasyon Fonksiyonlarının temel amacı, bir A-NN'deki bir düğümün giriş sinyalini bir dönüşüm uygulayarak bir çıkış sinyaline dönüştürmektir. Bu çıkış sinyali şimdi yığındaki bir sonraki katmana girdi olarak kullanılır.
Fonksiyon
Açıklama
Lineer Aktivasyon Fonksiyonu
Verimsiz, regresyonda kullanılır
Sigmoid Fonksiyonu
İkili sınıflandırma problemlerinde çıktı katmanı için iyi
Tanh Fonksiyonu
Sigmoid fonksiyonundan daha iyidir
Relu Fonksiyonu ✨
Gizli katmanlar için varsayılan seçim
Leaky Relu Fonksiyonu
Relu'dan birazcık daha iyi, Relu daha popüler
Formül:
Grafik:
Regresyon problemlerindeki çıktı katmanında kullanılabilir.
Formül:
Grafik:
Neredeyse her zaman sigmoid fonksiyonundan üstündür
Formül:
Sigmoid fonksiyonunun kaydırılmış versiyonu 🤔
Grafik:
Aktivasyon fonksiyonları farklı katmanlar için farklı olabilir, örneğin, gizli katman için tanh fonksiyonunu, çıkış katmanı için sigmoid fonksiyonunu kullanabiliriz
Eğer z çok büyükse veya çok küçükse, bu fonksiyonun türevi (veya eğimi) çok küçük olur (0'a yakın olur) ve bu, gradient descent'i yavaşlatabilir. 🐢
Başka ve çok popüler bir seçenek
Formül:
Grafik:
Yani türev, z pozitif olduğunda 1 ve z negatif olduğunda 0'dır.
Dezavantaj: z negatif iken türev=0'dır 😐
Formül:
Grafik:
Veya: 😛
Z uzayının çoğu, aktivasyon fonksiyonunun türevi, 0'dan çok farklıdır.
NN tanh veya sigmoid kullanmaya göre çok daha hızlı öğrenecektir.
Peki, eğer lineer işlevi kullanırsak, NN sadece girişin lineer bir fonksiyonunu çıkarır, yani NN'nin kaç katmanı olursa olsun 🙄, yaptığı tek şey sadece lineer bir fonksiyonu hesaplamaktır 😕
❗ İki doğrusal fonksiyonun kompozisyonunun kendisinin doğrusal bir fonksiyon olduğunu unutma
Eğer çıkış 0 veya 1 ise (ikili sınıflandırma) ➡ sigmoid çıkış katmanı için uygundur
Diğer bütün birimler için ➡ Relu ✨
Aktivasyon fonksiyonu için Relu'nun varsayılan seçenek olduğunu söyleyebiliriz
Not:
Bu fonksiyonlardan hangisinin en iyi sonucu verdiğinden emin değil isen 😵, hepsini dene 🤕 ve farklı doğrulama setleri üzerinden değerlendir ve hangisinin daha iyi çalıştığını gör ve kullan 🤓😇
Yapay Sinir Ağlarının temel kavramları
Convention: Giriş katmanı sayılmadığından görüntüdeki NN 2 kat NN olarak adlandırılır 📢❗
Terim
Açıklama
🌚 Giriş Katmanı
NN'nin girişlerini içeren katmandır
🌜 Gizli Katman
Hesaplamalı işlemlerin yapıldığı katman
🌝 Çıkış Katmanı
NN'nin son katmanı ve tahmin edilen değer ŷ'nin üretilmesinden sorumludur
🧠 Nöron
Bir matematik fonksiyonu için bir yer tutucu, girdilere bir fonksiyon uygular ve çıktı sağlar
💥 Aktivasyon Fonksiyonu
Dönüşümler uygulayarak bir düğümün giriş sinyalini bir çıkış sinyaline dönüştüren bir fonksiyon
👶 Shallow NN
Az sayıda gizli katmana sahip NN (bir veya iki)
💪 Deep NN
Çok sayıda gizli katmanı olan NN
l katmanındaki nöron sayısı
Girişinin ağırlıklı toplamını hesaplar, bias ekler ve ardından bir aktivasyon fonksiyonu nedeniyle nöronun tetiklenip tetiklenmeyeceğine karar verir.
Aktivasyon fonksiyonları ile ilgili ayrıntılı notlarım: burada 👩🏫
Parametre
Boyut
Bu boyutların doğru olduğundan emin olmak, daha iyi ve hatasız 🐛 kodlar yazmamıza yardımcı olur.
Giriş:
Çıkış:
Giriş:
Çıkış :
Vektörize Edilmiş Denklemler:
😵🤕
......
Öğrenme hızı
İterasyon sayısı
Gizli katmanların sayısı
Gizli birimlerin sayısı
Aktivasyon Fonksiyonunun Seçimi
......
Hiper-parametrelerin parametreleri kontrol ettiğini söyleyebiliriz 🤔
Terim
Açıklama
👩🔧 Vektörleştirme
Python kodunu döngü kullanmadan hızlandırma yöntemi
⚙ Yayma (Broadcasting)
Dizileri genişleterek Python kodunu daha hızlı çalıştırmak için başka bir yöntem
🔢 Dizi Rankı
Bir dizinin sahip olduğu boyut sayısı
1️⃣ Rank-1 Dizisi
Tek bir boyuta sahip bir dizi
Bir skalar sıfır rank'a sahip sayılır ❗❕
Vektörleştirme, Python veya Matlab kodunu döngü kullanmadan hızlandırmak için kullanılır. Böyle bir fonksiyon kullanmak kodun çalışma süresini verimli bir şekilde en aza indirmeye yardımcı olabilir. Vektörlerin nokta çarpımı (dot product), vektörlerin dış çarpımı (outer products) ve Hadamard Çarpımı (element wise multiplication) gibi çeşitli işlemler vektörler üzerinden gerçekleştirilebilmektedir.
Daha hızlı (paralel işlemlere izin verir) 👨🔧
Daha basit ve daha okunabilir kod ✨
İki dizinin nokta çarpımını bulma:
Dizideki her elemanın karekökünü alma
np.sqrt(x)
Dizinin tüm elemanlarının toplamını almak
np.sum(x)
Dizideki her bir elemanın mutlak değerini alma
np.abs(x)
Dizideki her elemana trigonometrik fonksiyonlar uygulama
np.sin(x)
, np.cos(x)
, np.tan(x)
Dizideki her bir eleman üzerine logaritmik fonksiyonlar uygulama
np.log(x)
, np.log10(x)
, np.log2(x)
Aritmetik işlemleri dizilerdeki karşılık gelen elemanlara uygulama
np.add(x, y)
, np.subtract(x, y)
, np.divide(x, y)
, np.multiply(x, y)
Dizideki karşılık gelen elemanlara kuvvet işlemi uygulama
np.power(x, y)
Bir dizinin ortalamasını bulma
np.mean(x)
Bir dizinin medyanını bulma
np.median(x)
Bir dizinin varyansını bulma
np.var(x)
Bir dizinin standart sapmasını bulma
np.std(x)
Bir dizinin maximum ve minimum değerini bulma
np.max(x)
, np.min(x)
Bir dizinin maximum ve minimum değerinin indisini bulma
np.argmax(x)
, np.argmin(x)
Aritmetik işlemler sırasında numpy'nin farklı boyutlardaki dizileri nasıl ele aldığını açıklar. Bazı kısıtlamalara bağlı olarak, daha küçük dizi daha büyük dizi boyunca yayınlanır, böylece uyumlu şekillere sahip olurlar.
Uygulamalı olarak:
Elimizde (m,n)
boyutundaki A matrisi olsun. (1,n)
boyutundaki B matrisi ile toplamak / çıkarmak / çarpmak / bölmek istiyorsak, B matrisi m
kez kopyalanacak, daha sonra istenen işlem gerçekleşecek.
Aynı şekilde: Elimizde (m,n)
boyutundaki A matrisi olsun. (m,1)
boyutundaki B matrisi ile toplamak / çıkarmak / çarpmak / bölmek istiyorsak, B matrisi n
kez kopyalanacak, daha sonra istenen işlem gerçekleşecek.
Uzun lafın kısası: Farklı boyutlardaki diziler (veya matrisler) toplanamaz, çıkartılamaz veya genel olarak aritmetik olarak kullanılamaz. Dolayısıyla, boyutları genişletmek bunu mümkün kılmanın bir yoludur, böylece uyumlu şekillere sahip olurlar.
(1,n) boyutundaki vektörü (2,n) boyutundaki matrise ekleme
Rank-1 dizilerinin kullanılmaması tavsiye edilmektedir
Rank-1 Dizileri, bulunması ve düzeltilmesi zor olan hatalara neden olabilir, örneğin:
Rank-1 dizilerindeki dot işlemi:
Rank-2 dizilerindeki dot işlemi:
Özet: Kodlarımızı daha hatasız ve kolay hata ayıklamak için rank-1 dizilerini kullanmaktan kaçınmalıyız 🐛
Lojistik regresyona benzeterek anlayabiliriz: 😋
Lojistik regresyonun 0 ile 1,0 arasında bir ondalıklı sayı ürettiğini hatırla, Örneğin, bir e-posta sınıflandırıcısından 0,8'lik bir lojistik regresyon çıktısı, bir e-postanın% 80'i spam olma olasılığını ve% 20'sinin spam olmadığını gösterir. Yani, bir e-postanın spam olma ve spam olmama ihtimalinin toplamı 1.0'dir.
Softmax bu fikri ÇOKLU-SINIF dünyasına genişletiyor. Yani, Softmax, her sınıfa çok sınıflı bir problemde ondalık olasılıklar verir. Bu olasılıkların toplamı 1.0'e eşittir.
Onun diğer ismi Maximum Entropy (MaxEnt) Classifier
Softmax regresyonunun lojistik regresyonun genelleştirdiğini söyleyebiliriz.
Lojistik regresyon, C = 2 olan softmax'ın özel bir durumudur 🤔
C = sınıf sayısı = çıkış katmanının birim sayısı
Softmax, çıktı katmanından hemen önce bir sinir ağı katmanı vasıtasıyla uygulanır. Softmax katmanı, çıkış katmanı ile aynı sayıda düğüme sahip olmalıdır.
Softmax katmanının çıktısını alır ve 1 vs 0 vector (adlandırdığıma göre 🤭) vektörüne dönüştürür, o da bizim ŷ'iz olacak
Örenğin:
Ve bunun gibi 🐾
Y ve ŷ (C,m) boyutunda matrislerdir 👩🔧
Yani, (C, 1) boyutunda bir vektördür.
Daha işletilmemiş tensör leri oluştur
Tensör'lerin arasındaki işlemeleri yaz
Tensor'ları başlat (initialize)
Bir Session oluştur
Session'ı çalıştır. Bu, yukarıda yazdığın işlemleri yürütecektir.
Özetle, değişkenleri başlat, bir Session oluştur ve Session'ın içindeki işlemleri çalıştır 👩🏫
Aşağıdaki formülü hesaplamak için:
Kayıp fonksiyonu için bir değişken oluşturduğumuzda, loss'u basitçe diğer miktarların bir fonksiyonu olarak tanımladık, ancak değerini değerlendirmedik. Bunu değerlendirmek için initializer'ı kullanırız.
Aşağıdaki kod için
🤸♀️ Çıktı:
Beklendiği gibi, 20 görmeyeceğiz 🤓! Sonucun shape attribute'u olmayan ve "int32" türünde bir tensör olduğunu söyleyen bir tensörümüz var. Tek yaptığımız 'computation graph' koymaktı, ancak henüz bu hesaplamayı çalıştırmadık.
Yer tutucu placeholder, değerini ancak daha sonra belirleyebileceğiniz bir nesnedir. Bir yer tutucunun değerlerini belirtmek için, bir feed dictionary
kullanarak değerleri iletebiliriz.
Aşağıda, x için bir yer tutucu oluşturuldu. Bu, Session'ı çalıştırdığımızda daha sonra bir sayı girmemizi sağlar.
Sigmoid Fonksiyonun değerini TF ile hesaplamak
Maliyet Fonksiyonun değerini TF ile hesaplamak
Veri Hazırlama'nın bir parçasıdır
Elimizde, hepsi pozitif ya da negatif olan bir özellik varsa bu, bunları içeren katmandaki düğümler için öğrenmeyi zorlaştıracaktır. Sigmoid aktivasyon fonksiyonunu izleyenler gibi zikzak yapmak zorunda kalacaklar.
Verilerimizi sıfıra yakın bir ortalama olacak şekilde dönüştürürsek, hem pozitif değerlerin hem de negatif değerlerin olduğundan emin olacağız.
Formül:
Fayda: Bu, Maliyet Fonksiyonunun J optimizasyonunu hem daha hızlı hem de daha kolay yapar 😋
Katman sayısı, gizli birimlerin sayısı, öğrenme hızı, aktivasyon fonksiyonları...
İlk seferinde hepsini doğru seçmek çok zor, bu yüzden bunu iteratif bir süreç olarak ele almamız lazım.
Fikir ➡ Kod ➡ Deney ➡ Fikir 🔁
Yani burada mesele, bu döngüde nasıl verimli bir şekilde dolaşılacağıdır 🤔
İyi bir değerlendirme için veri setini aşağıdaki gibi bölmek iyidir:
Kısım
Açıklama
Eğitim Seti (Training Set)
Modeli eğitmek için kullanılır
Doğrulama Seti (Development (Validation) Set)
Model hiper-parametrelerini ayarlarken yansız (unbiased) bir değerlendirme yapmak için kullanılır
Test Seti
Son modelin yansız bir değerlendirmesini sağlamak için kullanılır
Modeli eğitmek için kullandığımız gerçek veri seti (NN durumunda ağırlık ve yanlılık).
Model bu verilerden görür ve öğrenir 👶
Model hiper-parametrelerini ayarlarken eğitim setine uygun bir modelin yansız bir değerlendirmesini sağlamak için kullanılan veri örneği. Doğrulama setindeki beceri, model konfigürasyonuna dahil edildiğinden değerlendirme daha yanlı hale gelir.
Model bu verileri görür, ancak bunlarda asla öğrenmez 👨🚀
Eğitim setine uygun son bir modelin yansız bir değerlendirmesini sağlamak için kullanılan veri örneği. Modeli değerlendirmek için kullanılan altın standardı sağlar 🌟.
Uygulama Notu: Test seti, gerçek dünyada kullanıldığında modelin karşılaşacağı çeşitli sınıfları kapsayan dikkatlice örneklenmiş verileri içermelidir 🚩🚩🚩❗❗❗
Sadece model tamamen eğitildiğinde kullanılır 👨🎓
Yanlılık, tahmin edilen değerlerin gerçek değerlerden ne kadar uzak olduğunu gösteren bir kavramdır. Ortalama öngörülen değerler gerçek değerlerden uzaksa yanlılık yüksektir.
Yüksek yanlılığa sahip olmak, modelin çok basit olduğunu ve verilerin karmaşıklığını yakalamadığını Eksik öğrendiğini (underfitting) ve bu nedenle verilere uygun olmadığını gösterir. 🤕
Varyans, belirli bir veri noktası için model tahmininin değişkenliği veya bize verilerimizin yayılmasını söyleyen bir değerdir.
Varyansı yüksek olan model, daha önce görmediği verilerde genelleme yapamamaktadır.
Yüksek varyansa sahip olmak algoritmanın eğitim verilerindeki rastgele gürültüyü modellediğini ve verileri aşırı öğrendiğini (overfitting) gösterir. 🤓
İstenilen performansı elde edemezsek modelimizi geliştirmek için şu soruları sormamız gerekir:
Aşağıdaki çözümlerin performansını doğrulama seti üzerinden kontrol ediyoruz
Yüksek yanlılık var mıdır? varsa, bu bir eğitim problemidir, yapılabilecekler:
Daha büyük bir ağ dene
Daha uzun eğit
Daha iyi optimizasyon algoritması dene
Başka bir NN mimarisini dene
Bunun yapısal bir sorun olduğunu söyleyebiliriz 🤔
Yüksek varyans var mıdır? varsa, doğrulama seti performans problemidir, yapılabilecekler:
Daha fazla veri kullan
Düzenlileştirme (Regularization) yap
L2, dropout, data augmentation
Belki veri ya da algoritmik bir problem olduğunu söyleyebiliriz. 🤔
Yüksek varyans veya yüksek yanlılık yok mu?
TADAAA işimiz bitti 🤗🎉🎊
Kısaca: Aşırı öğrenmeyi önleyen -ve varyansı- azaltan bir tekniktir
Aşırı öğrenme durumunda, modelimiz eğitim verilerindeki ayrıntıları ve gürültüyü çok iyi öğrenmeye çalışır, bu da sonuçta görülmeyen verilerde (test seti) düşük performansa neden olur.
Aşağıdaki grafik, bu durumu daha iyi açıklar:
Modelin daha iyi genelleşmesi için öğrenme algoritmasında ufak değişiklikler yapan bir tekniktir. Bu da modelin görülmeyen veriler üzerindeki performansını artırmaktadır.
En yaygın düzenlileştirme türüdür, aşağıdaki formüle göre uygulanır
Burada, lambda düzenlileştirme parametresidir. Daha iyi sonuçlar için değeri optimize edilmiş olan hiper-parametredir. L2 düzenlileştirmesi, ağırlıkları sıfıra (ancak tam olarak sıfıra değil) indirgemeye zorladığı için ağırlık azalması (Weight decay) olarak da bilinir.
Bazı sinirleri rastgele belirli bir oranda elimine ederek başka bir düzenlileştirme yöntemidir.
Basitçe: Her p olasılığına sahip düğüm için, geri yayılma sırasında giriş veya çıkış ağırlıklarını güncellemiyoruz (Yani onu düşürüyoruz 😅)
Daha iyi görselleştirme:
Eleme işleminden önce ve sonra bir NN
Genellikle bilgisayarlı görüşte kullanılır, ancak olumsuz yönü maliyet fonksiyonu J'nin artık iyi tanımlanmamasıdır.
Aşırı öğrenmeyi azaltmanın en basit yolu, eğitim verilerinin boyutunu artırmaktır, daha fazla veri elde etmek çok maliyetli olduğu için her zaman mümkün değildir, ancak bazen verilerimize dayanarak verilerimizi artırabiliriz, örneğin:
Resimler üzerinde dönüşüm yapmak veri setimizi büyütebilir
Eğitim setinin bir bölümünü doğrulama seti olarak tuttuğumuz bir tür çapraz doğrulama stratejisidir. Doğrulama setindeki performansın kötüye gittiğini gördüğümüzde, modelin eğitimini derhal durdururuz. Bu Erken Durma olarak bilinir.
Hızlı ve iyi optimizasyon algoritmalarına sahip olmak tüm işin verimliliğini hızlandırabilir ✨
Toplu gradyan inişinde, gradyan inişinin her yinelemesinde maliyet fonksiyonunun gradyanını hesaplamak için tüm veri kümesini kullanırız ve ardından ağırlıkları güncelleriz.
Tüm veri kümesini hesaplamada kullandığımızdan dolayı gradyanın yakınsaması yavaştır.
Stokastik Gradyan İnişi'nde, gradyanı hesaplamak ve ağırlıkları her bir yinelemeyle güncellemek için tek bir veri noktası veya örnek kullanıyoruz, tamamen rastgele bir veri setini alabilmemiz için önce veri kümesini karıştırmamız gerekir.
Rastgele örnek, global bir minimuma ulaşmaya yardımcı olur ve yerel bir minimumda takılıp kalmayı önler.
Büyük bir veri kümesi için öğrenme çok daha hızlı ve yakınsama çok hızlı 🚀
Tek bir eğitim örneği yerine, örneklerin küçük bölümünün kullanıldığı bir Stokastik Gradyan İnişinin bir varyasyonudur.
Yaygın olarak kullanılır, daha hızlı yakınsar ve daha stabildir
Bölüm büyüklüğü veri kümesine bağlı olarak değişebilir
1 ≤ batch-size ≤ m, batch-size bir hiper-parametredir ❗
Çok büyük batch-size
(m veya m'ye yakın):
Her yineleme için çok uzun
Çok küçük batch-size
(1 veya 1'e yakın)
Vektörleştirme hızını kaybetme
Ne çok büyük ne çok küçük batch-size
Vektörleştirme yapabiliriz
Her yineleme için iyi hız
En hızlı (en iyi) öğrenme 🤗✨
Batch-Size
Seçmek İçin KurallarKüçük bir veri kümesi için (m ≤ 2000) ➡ bölümlü gradyan inişi kullan
Tipik mini batch-size: 64, 128, 256, 512, 1024'e kadar
mini batch-size CPU / GPU belleğine sığdığından emin ol
mini batch-size 2 kuvveti olarak seçmek daha iyidir (daha hızlı) (bellek sorunları nedeniyle) 🧐
Hemen hemen her zaman, momentumlu gradyan inişi, standart gradyan inişi algoritmasından daha hızlı yakınsar. Standart gradyan inişi algoritmasında, algoritmayı yavaşlatan bir yönde daha büyük ve başka bir yönde daha küçük adımlar atmamızdır 🤕
Bu momentumun geliştirebileceği şeydir, salınımı bir yönde kısıtlar, böylece algoritmamız daha hızlı yakınsayabilir. Ayrıca, y yönünde atılan adımların sayısı sınırlı olduğu için daha yüksek bir öğrenme hızı belirleyebiliriz 🤗
Aşağıdaki resim durumu daha iyi anlatmaktadır: 🧐
Formül:
Daha iyi anlamak için:
Momentumlu gradyan inişinde, gradyan inişini hızlandırmaya çalışırken şunu söyleyebiliriz:
Türevler hızlandırıcıdır
v'ler hızdır
β sürtünmedir
RMSprop optimizer, momentumlu gradyan inişi algoritmasına benzer. RMSprop en iyileyicisi salınımları dikey yönde kısıtlar. Bu nedenle, öğrenme hızımızı artırabiliriz ve algoritmamız yatay doğrultuda daha hızlı yaklaşırken daha büyük adımlar atabilir.
RMSprop ve gradyan inişi arasındaki fark, gradyanlarım nasıl hesaplandığıdır, RMSProp gradyanları aşağıdaki formülle hesaplar:
Açılımı: ADAptive Moment estimation
Günümüzde yaygın olarak kullanılan algoritmadır, Adam, RMSprop ve Stokastik Gradyan İnişi'nin momentum ile bir kombinasyonu olarak görülebilir. RMSprop gibi öğrenme hızını ölçeklendirmek için kare gradyanları kullanır ve momentum ile SGD gibi gradyan yerine gradyanın hareketli ortalamasını kullanarak momentumdan yararlanır.
Özetle: Adam = RMSProp + GD with momentum + bias correction
😵😵😵
α: ayarlanması gerekiyor
β1: 0.9
β2: 0.999
Uzun Lafın Kısası 😅:
ε:
🚪 Tensorflow ve Keras ile bilgisayar görüşü problemlerini çözmeye giriş
MNIST'in açılımı: (Modified National Institute of Standards and Technology database)
🔎 Fashion-MNIST 60.000 örnek eğitim setinden ve 10.000 örnek test setinden oluşur
🎨 Türleri:
🔢 MNIST: el yazısı rakamlar için
👗 Fashion-MNIST: moda için (kıyafet)
📃 Özellikler:
🌚 Gri tonlama (siyah-beyaz)
28x28 px
10 farklı kategori
Terim
Açıklama
➰ Sequential
Bu sinir ağında bir katmanlar dizisi tanımlar
⛓ Flatten
Yassılaştır sadece o kareyi alır ve onu 1 boyutlu bir kümeye dönüştürür (giriş katmanı için kullanılır)
🔷 Dense
Bir nöron katmanı ekler
💥 Activation Function
Doğrusal olmayan özellikleri ağa tanıtan bir formül
✨ Relu
If X>0 return X, else return 0 kuralına sahip bir aktivasyon fonksiyonudur
🎨 Softmax
Bir dizi değer alan ve en büyüğünü seçen bir aktivasyon fonksiyonudur
Aktivasyon fonksiyonunun temel amacı, bir NN'deki bir düğümün giriş sinyalini bir çıkış sinyaline dönüştürmektir. Bu çıkış sinyali şimdi yığındaki bir sonraki katmana girdi olarak kullanılır 💥
MNIST'deki değerler 0-255 arasındadır ancak sinir ağları normalleştirilmiş verilerle daha iyi çalışır, bu nedenle her değeri 255'e bölebiliriz, böylece değerler 0,1 arasındadır.
Eğitim sürecini durdurmak için birden fazla kriter var, epoch sayısını ya da eşiğini ya da her ikisini birden belirleyebiliriz.
Epochs: iterasyon sayısı
Eşik: her iterasyon sonrasında accuracy veya loss için bir eşik değeri
Eşik değeri ve maksimum epoch sayısı
Her epoch sonunda, accuracy'yi Callbacks ile kontrol edebiliriz 💥
✨ Bilgisayar Görüşü problemlerinde kullanılan Sinir Ağlarının İyileştirilmesi
Bu klasör CNN'ler hakkında teorik detaylar içerir.
Terim
Açıklama
💫 Konvolüsyon
Görüntüye bir filtre uygulanarak görüntüdeki bazı özellikler vurgulanması
🌀 Sıkıştırma (Pooling)
Görüntüyü sıkıştırma yöntemi
🔷 2*2 max pooling
Her 4 komşu piksel için en büyüğü kurtulur
⭕ Dolgulama (Padding)
Convolution'dan önce görüntüye ek sınır(lar) ekleme
Bir CNN'nin eğitim hızı, hesaplama karmaşıklığından dolayı normal NN'den çok daha düşüktür 🐢
🚀 CNN'leri Tarayıcıya Uygulama İle İlgili Notlar
CNN tabanlı çalışmalarımızı Tarayıcıda uygulamak için Tensorflow.JS kullanmalıyız 🚀
🚙 Import Tensorflow.js
👷♀️ Modeli kur
👩🏫 Eğit
👩⚖️ Modeli kullan
Tensorflow.js'yi aşağıdaki şekilde import edebiliriz
😎 Python'da yaptığımız gibi:
🐣 Sequential objesi tanımla
👩🔧 Katmanları ekle
🚀 Modeli derle .compile()
👩🎓 Eğit (fit)
🐥 Modeli tahmin için kullan
([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], [6, 1])
[-1.0, 0.0, 1.0, 2.0, 3.0, 4.0]
: Veri seti değerleri (girişler)
[6, 1]
: Girişin boyutu
🐢 Eğitim uzun bir süreç olduğundan onu asenkron bir fonksiyonda yapmalıyız
👩💻 Yapay Sinir Ağları Kodlamasına Giriş
Her ilk uygulamada olduğu gibi, bize tüm metodoloji hakkında bir fikir veren süper basit bir şeyle başlamalıyız
Yüksek seviyeli bir Yapay Sinir Ağları API'si, Python ile yazılmış ve TensorFlow, CNTK veya Theano'nun üzerinde çalışabilir.
Terim
Açıkalama
Dense
Bir sinir ağında bir nöron katmanı
Loss Function
Tahminlerinin ne kadar yanlış olduğunu ölçmenin matematiksel bir yolu
Optimizer
Minimum kayıp fonksiyonunun değerine karşılık gelen parametre değerlerini bulmak için kullanan algoritma(lar)
Bir sinirden oluşan bir katman içerir.
Yapay sinir ağını kurduktan sonra, onu örnek verilerimizle besleyebiliriz 😋
Şimdi, eğitim sürecini başlatmalıyız 🚀
Her şey tamamlandı😎! Şimdi sinir ağımızı yeni verilerle test edebiliriz 🎉
Tam kaynak kodu burada 🐾
element wise çarpma yaptık, sonra sonuç matrisinin toplamını hesapladık; yani:
Ve diğer elemanlar için bu şekilde devam eder 🙃
Konvolüsyon işleminin bir uygulaması
Sonuç: yatay çizgiler ortaya çıkıyor
Sonuç: dikey çizgiler ortaya çıkıyor
Filtrenin elemanlarına sayı koyabileceğimiz pek çok yol var.
Örneğin, Sobel filtresi bu şekildedir:
Scharr filtresi de bu şekildedir:
Prewitt filtresi:
Yani buradaki kritik nokta orta satıra dikkat etmek.
Ve Roberts filtresi:
Bu sayıları ML yaklaşımı ile ayarlayabiliriz; Filtrenin bir ağırlık grubu olduğunu diyebiliriz, yani:
Bu sayede, elle elde etmek yerine otomatik olarak yatay, dikey, açılı veya herhangi bir kenar tipini öğrenebiliriz.
n*n
'lik bir resmimiz varsa ve f*f
'lik bir filtre uygulamak istersek, sonuç resmi n-f+1*n-f+1
boyutunda olacaktır
🌀 Çok fazla filtre uygularsak, görselimiz küçülür.
🤨 Köşelerdeki piksellere yeterince dokunulmadığından, görüntünün kenarlarından birçok bilgi göz ardı ediliyor
Resimlere işlemini uygulayabiliriz 💪
Terim
Açıklama
Konvülosyon(Convolution)
Görüntüye bir filtre uygulayarak görüntüdeki bazı özellikler vurgulanır.
Kavramları toplamak için P1 ve P2 'de açıklanan kavramların görselleştirilmesi
Özellikleri çıkarmak için filtre uygulama 🤗
Problem 😰: Görüntüler küçülüyor 😱
Görüntüler Çok Büyük, Performans Düşük 😔
Filtrelerin renk kanalı sayısına eşit derinliğe sahip olması gerekir
n
tane filtre uygulamak istiyorumÇıktının derinliği n
ye eşit olacaktır
backpropagation kullanarak loss fonksiyonlarını optimize etmek için gradient'leri hesaplayan fonksiyon
\sigma^'(x)=\sigma(x)(1-\sigma(x))
X'in her satır vektörünü normuna göre bölme.
Algoritmanın iki veya daha fazla sınıfı sınıflandırması gerektiğinde kullanılan normalleştirme fonksiyonu
Kayıp, modelin performansını değerlendirmek için kullanılır. Kayıp ne kadar büyükse, tahminlerin (ŷ) gerçek değerlerden (y) o kadar farklı olmasıdır. Derin öğrenmede, modeli eğitmek ve maliyeti en aza indirmek için Gradient Descent gibi optimizasyon algoritmaları kullanıyoruz.
Kayıp, modelin performansını değerlendirmek için kullanılır. Kayıp ne kadar büyükse, tahminlerin (ŷ) gerçek değerlerden (y) o kadar farklı olmasıdır. Derin öğrenmede, modeli eğitmek ve maliyeti en aza indirmek için Gradient Descent gibi optimizasyon algoritmaları kullanıyoruz.
Parametreleri öğrenmek için "ileri" ve "geri" yayılma adımlarını yapmak.
Amaç, maliyet fonksiyonunu J'yi en aza indirerek ω ve b'yi öğrenmektir.
α öğrenme hızıdır learning rate
2 katmanlı ağın fonksiyonları
Giriş katmanı, 1 gizli katman ve çıkış katmanı
W
'leri ve b
'leri başlatma konusunda, W
'ler Simetriği kırma adına rastgele değerlerle başlatmalıyız, b
'yi ise sıfır olarak başlatabiliriz.
Her katman giriş verilerini alır, aktivasyon fonksiyonuna göre işler ve sonraki katmana geçirir
Çıkış katmanı nedeniyle ayarlanan tüm eğitimin loss fonksiyonlarının ortalaması
Ağırlıkların uygun şekilde ayarlanması daha düşük hata oranlarını garanti eder ve modellemeyi genellemesini artırarak güvenilir kılar.
Gradient descent'i tamamlamak için öğrenme hızına bağlı olarak parametrelerin güncellenmesi
LeNet-5 çok basit bir ağdır - Modern standartlara göre -. Sadece 7 katmanı vardır
bunların arasında 3 konvolüsyon katmanı vardır (C1, C3 and C5)
2 sub-sampling (sıkıştırma) katmanları (S2 and S4)
1 tam bağlanmış katman (F6)
Çıkış katmanı
LeNet-5' çok benziyor
Katman başına daha fazla filtresi vardır
tanh yerine ReLU kullanıyor
Momentumlu Gradyan İnişi
Düzenlileştirme yerine sönümleme (dropout) kullanıyor
Eğitilmesi aşırı yavaş (138 milyon parametresi var 🙄)
Resme n+2 x n+2
olacak şekilde görüntüye bir veya daha fazla kenar ekleyerek ve konvolüsyondan sonra görüntünün orijinal boyutu olan n x n
resimle sonuçlanır.
p
= eklenen sınır sayısı
For convention: 0 ile doldurulur
Daha iyi anlaşılması için iki kavramımız olduğunu varsayalım:
Dolgulama yok demektir, yani:
n x n
* f x f
➡ n-f+1 x n-f+1
Çıktı boyutunun, girdi boyutuyla aynı olmasını sağlayacak kadar dolgulanır
Yani biz istiyoruz ki 🧐:
n+2p-f+1
= n
Bundan dolayı:
p
= (f-1)/2
Kabul: f tek sayı olarak seçilir 👩🚀
Konvolüsyonların başka bir yaklaşımı, bölgelere belirli bir s
(adım sayısı) değerine göre filtre uygulayarak çıktıyı hesaplıyoruz.
Bir n x n
'lik görüntü ve f x f
'lik filtre için, p
dolgulama miktarı ve s
adım boyutu miktarı ile; çıkış görüntünün boyutu aşağıdaki formülle hesaplanabilir
RGB görüntüsü üzerine konvolüsyon işlemini uygulamak için; örneğin, 10x10 piksel RGB görüntüsünde, teknik olarak görüntünün boyutu 10x10x3'tür, bu nedenle örneğin 3x3x3'lük veya fxfx3'lük filtre uygulayabiliriz 🤳
Filtreler özel bir renk kanalına uygulanabilir 🎨
👩🏫 Genellikle insanlar bir NN'deki katman sayısını bildirdiğinde, yalnızca ağırlıkları ve parametreleri olan katman sayısını söylerler
Kabul:
CONV1
+POOL1
=LAYER1
Ayarlanacak parametreleri düşürdüklerinden dolayı daha iyi performans 💫
Bir sinir ağı eğitiminin her iterasyon sırasında, tüm ağırlıklar, mevcut ağırlığa göre hata fonksiyonunun kısmi türeviyle orantılı bir güncelleme alır. Eğer gradyan çok küçükse, ağırlıklar etkili bir şekilde değişmeyecek ve sinir ağını ileri eğitimden tamamen durdurabilir 🙄😪. Bu olaya Kaybolan Eğim (vanishing gradients) denir 🙁
Basitçe 😅: Çok yavaş gradiyan inişi nedeniyle verilerin derin sinir ağının katmanları arasında kaybolduğunu söyleyebiliriz
ResNet'in ana fikri, aşağıdaki gibi bir veya daha fazla katmanı atlayan identity shortcut connection sunmaktır.
Bloklardan birinin identitiy fonksiyonunu öğrenmesi kolay
Performansa zarar vermeden daha derine gidebilir
Düz NN'lerde, Kaybolan ve Patlayan Gradyanlar problemleri nedeniyle, ağın performansı derinleştikçe azalmaktadır.
Sıkıştırma ve çeşitli evrişim uygulayarak girişlerin boyutunu azaltabiliriz, bu filtreler girişin görüntüsünün yüksekliğini ve genişliğini azaltabilir; peki renk kuralları ne oluyor? 🌈, başka bir deyişle derinliği ne oluyor?
Bir CNN çıktısının derinliğinin girişte uyguladığımız filtre sayısına eşit olduğunu biliyoruz;
Yukarıdaki örnekte 2 filtre uyguladık, böylece çıkış derinliği 2
CNN'lerimizi geliştirmek için bu bilgiyi nasıl kullanabiliriz? 🙄
Diyelim ki 28x28x192
boyutlu girişimiz var, 1x1x192
boyutunda 32
filtre ve konvolüsyon uygularsak çıkışımız 28x28x32
✨
Ağ
İlk Kullanım
LeNet-5
Elle yazılmış basamak sınıflandırması
AlexNet
ImageNet Dataset
VGG-16
ImageNet Dataset
Terim
Açıklama
🔷 Dolgulama (Padding)
Konvolüsyondan önce görüntüye ek kenar(lar) ekleme
🌠 Adımlı Konvolüsyon
s
adım atarak konvolüsyon uygulama
🏐 Hacim üzerine konvolüsyon
Konvolüsyonları n boyutlu girişe uygulama (örneğin RGB görüntüsü)
Katman
Açıklama
💫 Convolution CONV
Özellikleri çıkarmak için filtreler
🌀 Pooling POOL
Gösterme boyutunu düşürme ve hesaplamaları hızlandırma tekniği
⭕ Fully Connected FC
Standart tek sinir ağı katmanı (tek boyutlu)
Yaklaşım
Açıklama
Artıklı Ağlar
Derin NN'lerde kaybolan eğim sorununu önlemek için bir yaklaşım
Bire bir konvolüsyon
Renk Kanallarında filtre uygulanması
🔦 Evrişimli Sinir Ağları Kodları
Bu klasör giderek kodlar ve notlar ile doldurulacak
🌐 Tensorflow.js tabanlı rakam sınıflandırıcsı
Rock Paper Scissors, Taş/Kağıt/Makas pozlarında farklı ellerin 2.892 görüntüsünü içeren bir veri setidir.
Taş Kağıt Makas, çeşitli ellerden, farklı ırklardan, yaşlardan ve cinsiyetlerden, Taş / Kağıt veya Makas'a pozlanmış ve etiketlenmiş görüntüler içerir.
🔎 Bu verilerin tümü beyaz bir arka plana karşı pozlandırılmıştır. Her görüntü 24bit renkte ve 300×300 pikseldir
Bizim CNN'imiz hakkında bu şekilde bilgi alabiliriz;
Çıkış da aşağıdaki şekilde olacaktır:
👩💻 Notbook'taki kod için:
Burada 🐾
🔎 Görüntülerin orijinal boyutları 28x28 piksel
1️⃣ 1. katman: Filtre, kenarlardaki piksellere uygulanamaz
Birinci katmanın çıkışı 26x26 px boyutundadır
2️⃣ 2. katman: 2x2 max pooling
uyguladıktan sonra, boyutlar 2'ye bölünecek
Bu katmanın çıkışı 13x13 px boyutundadır
3️⃣ 3. katman: Filtre, kenarlardaki piksellere uygulanamaz
Bu katmanın çıkışı 11x11 px boyutundadır
4️⃣ 4. katman: 2x2 max pooling
uyguladıktan sonra, boyutlar 2'ye bölünecek
Bu katmanın çıkışı 5x5 px boyutundadır
5️⃣ 5. katman: Önceki katmanın çıkışı düzleşecektir (flattened olacaktır)
Bu katman 5x5x64=1600
birime sahiptir
6️⃣ 6. katman: 128 birim içerecek şekilde ayarladık
7️⃣ 7. katman: 10 kategorimiz olduğu için 10 birimden oluşmaktadır.
😵 😵
Her katmanın çıktısının görselleştirilmesi burada mevcuttur 🔎
🥽 Derin Öğrenme Bağlamında Kullanılan Popüler Stratejiler
Terim
Açıklama
🚙 Aktarma Öğrenmesi (Transfer Learning)
Bir görevden öğrenmek ve öğrenilenleri başka farklı görevler için kullanmak 🛰🚙
➰ Çoklu Görev Öğrenmesi (Multi-Task Learning)
Bir NN'nin aynı anda birkaç şey yapmasını sağlamaya başlıyoruz ve sonra bu görevlerin her biri diğer tüm görevlere yardımcı oluyor 🚀
🏴 End to End Deep Learning
aynı NN ile büyük görevi alt küçük görevlere bölmek ✂
Uygulama
Açıklama
🧒👧 Yüz Doğrulama
Verilen görüntünün ve ID'nin aynı kişiye ait olup olmadığını bilmek
👸 Yüz Tanıma
Giriş yüzü görüntüsüne ID atama
🌠 Sinirsel Stil Aktarımı
Belirli bir görüntünün stilini öğrenerek bir görüntüyü diğerine dönüştürme
Terim
Soru
Giriş
Çıkış
Problem Türü
🧒👧 Yüz Doğrulama
Bu aranan kişi mi? 🕵️♂️
Face image / ID
True / False
1:1
👸 Yüz Tanıma
Bu kişi kimdir? 🧐
Face image
K
yüzünüz DB'deki ID'si
1:K
Bir örnekten (veritabanında sahip olduğumuz) kişiyi tekrar tanımayı öğrenmek
Giriş resmini al
DB'deki yüzlere ait olup olmadığını kontrol et
(Söyelemesi kolay 🤭)
Giriş görüntüsü ile veritabanındaki görüntü arasındaki benzerliği hesaplamamız gerekir, bu nedenle:
⭕ Öyle bir fonksiyon kullan ki;
similarity(img_in, img_db) = some_val
👷♀️ Eşik değeri belirle
🕵️♀️ Eşik değerini kontrol et ve çıkışı belirle
Yüz Doğrulama bağlamında kullanılan bir CNN, iki görüntüyü girdi olarak alır, konvolüsyonlar uyguladıktan sonra her görüntüden bir özellik vektörü hesaplar, aralarındaki farkı hesaplar ve daha sonra çıkışı verir.
Başka bir deyişle: verilen resmi kodluyor
Mimarisi:
Ağı bir çapa (anchor) (baz) resim A alarak ve hem pozitif bir P hem de negatif bir N örneği ile karşılaştırarak eğitebiliriz. Böylece:
🚧 Çapa resmi ile pozitif resim arasındaki benzeşmezlik (dissimilarity) düşük olmalıdır
🚧 Çapa resmi ile negatif resim arasındaki benzeşmezlik (dissimilarity) yüksek olmalıdır
Yani:
Kayıp denklemine başka bir hiper-parametre olan kenar payı margin adlı değişken eklenir. Kenar payı, benzeşmezliğin ne kadar olması gerektiğini, yani eğer margin = 0.2 ve d(a, p) = 0.5 ise, d (a, n) en az 0.7'ye eşit olmalıdır. Kenar payı, iki görüntüyü daha iyi ayırt etmemize yardımcı oluyor 🤸♀️
Bu nedenle, bu kayıp fonksiyonunu kullanarak:
👩🏫 Gradyanları hesaplayabiliriz ve gradyanların yardımıyla,
👩🔧 Siamese ağının ağırlıklarını ve yanlılıklarını güncelleyebiliriz.
Ağı eğitmek için de:
👩🏫 Çapa görüntüsü alıyoruz ve pozitif ve negatif görüntüleri rastgele örnekleriz ve kayıp fonksiyonunu hesaplarız
🤹♂️ Gradyanları güncelliyoruz
Bir içerik görüntüsü C (content) ve stil görüntüsü S (style) vererek bir G görüntüsü oluşturma
Bu nedenle G'yi üretmek için NN'miz S'nin özelliklerini öğrenmeli ve C'ye uygun filtreler uygulamalı.
Genellikle istenen performansı elde etmek için NN'nin parametrelerini -ağırlıklarını ve yanlılıkların- optimize ediyoruz, burada Sinirsel Stil Aktarımı'nda rastgele piksel değerlerinden oluşan boş bir görüntüden başlıyoruz ve görüntünün piksel değerlerini değiştirerek bir maliyet maliyet fonksiyonunu optimize ediyoruz 🧐
Başka bir deyişle, biz:
⭕ Rastgele piksellerden oluşan bir resimle başlıyoruz
👩🏫 Bir maliyet J fonksiyonunu tanımlıyoruz
👩🔧 Maliyet fonksiyonunu azaltmak için iteratif bir şekilde pikselleri güncelliyoruz
Uzun lafın kısası: NN'leri eğitirken ağırlıkları ve bias'ları güncelleriz, ancak stil aktarımında ağırlıkları ve bias'ları sabit tutarız ve bunun yerine imajımızı güncelleriz 🙌
J'yi aşağıdaki şekilde tanımlayabiliriz:
Açıklama:
G ie C arasındaki benzerliği ifade eder
G ile S arasındaki benzerliği ifade eder
α ve β hiper-parametrelerdir
Kısaca: Bir görevden öğrenmek ve öğrenilenleri başka farklı görevler için kullanmak 🛰🚙
🕵️♀️ Öğrenme Aktarması, bir görev için eğitilmiş bir modelin, ilgili ikinci bir görevde yeniden kullanıldığı bir makine öğrenme tekniğidir.
🌟 Ek olarak, ikinci görevi modellerken hızlı ilerleme veya gelişmiş performans sağlayan bir optimizasyon yöntemidir..
🤸♀️ Öğrenme Aktarması, yalnızca ilk görevden öğrenilen model özellikleri genel ise, derin öğrenmede işe yarar.
Uzun lafın kısası: Bir sinir ağını sıfırdan eğitmek yerine, bir başkasının zaten haftalarca büyük bir veri setinde eğittiği açık kaynaklı bir model indirebiliriz ve bu parametreleri modelimizi elimizdeki biraz daha küçük veri setiyle eğitmek için başlangıç noktası olarak kullanabiliriz. ✨
Bir sinir ağındaki katmanlar bazen benzer ağırlıklara sahip olabilir ve birbirlerini aşırı öğrenme neden olacak şekilde etkileyebilirler. Büyük karmaşık bir model ile bu bir risktir. Yani eğer Dense katmanlarını hayal ettiğimizde, biraz buna benzeyebilir.
Komşularla benzer ağırlıkları olan bazı nöronları kaldırabiliriz, böylece over fitting kaldırılır..
🤸♀️ Dropout işleminden önce ve sonra bir NN
✨ Sönümleme (dropout) işleminden önce ve sonra accuracy durumu
Kendisinden aktardığımız problem (kaynak) için çok fazla veriye sahip olduğumuzda ve aktardığımız problem (hedef) için genellikle nispeten daha az veri olduğunda pratiktir 🕵️
Daha doğrusu:
görev A
ve görev B
için, A'dan B'ye aktarmak aşağıdaki durumlarda makul olabilir:
🚩 Görev A ve görev B aynı çıkışa x sahipler ise
⭐ görev A
için görev B
'ye göre daha çok veriye sahip isek
🔎 görev A
'nın Düşük seviye özellikleri task B
'yi öğrenmek için faydalı ise
Kısaca: Bir NN'nin aynı anda birkaç şey yapmasını sağlamaya başlıyoruz ve sonra bu görevlerin her biri diğer tüm görevlere yardımcı oluyor 🚀
Başka bir deyişle: Diyelim ki 4 nesne sınıfını tespit etmek için bir algılayıcı kurmak istiyoruz, Her sınıf için 4 NN oluşturmak yerine, dört sınıfı tespit etmek için bir NN oluşturabiliriz 🤔 (Çıkış katmanı 4 birimlidir)
🤳 Ortak alt seviye özelliklere sahip olmanın faydalarından yararlanabilecek görevlerle ilgili eğitim yapma durumunda
⛱ Her görev için sahip olduğumuz veri miktarı oldukça benzer (bazen) ⛱
🤗 Tüm görevlerde başarılı olmak için yeterince büyük bir NN eğitebilir (her görev için ayrı bir ağ kurmak yerine)
👓 Çoklu görev öğrenmesi, öğrenme aktarmasına göre daha az kullanılır
Özetle, Çok sayıda işlem aşaması gerektiren bazı veri işleme sistemleri veya öğrenme sistemleri olduğundan,
End to end learning tüm bu çoklu aşamaları alabilir ve sadece tek bir NN ile değiştirebilir
👩🔧 Uzun lafın kısası: aynı NN ile büyük görevi alt küçük görevlere bölmek
🦸♀️ Verinin gücünü gösterir
✨ İşleiyişin tasarımına daha az elle müdahele edilir
💔 Büyük miktarda veriye ihtiyaç olabilir
🔎 Excludes potentially useful hand designed components
Çeviremedim 😢
Anahtar soru: x ile y arasında eşlemek için gereken karmaşıklığın bir fonksiyonunu öğrenmek için yeterli veriye sahip misin?
👷♀️ Makine Öğrenimi Projelerini Yapılandırma Talimatları
Makine öğrenim sistemlerinin kurulmasındaki zorluklardan biri, deneyebileceğimiz pek çok şeyin olması 🙄. Örneğin, ayarlayabildiğimiz çok fazla hiperparametre mevcut. İstenen etkiyi elde etmek için hangi parametrenin ayarlanacağını bilme sanatına orthogonalisation denir.
Bir ML projesini değerlendirirken nelere dikkat etmeliyiz? Onu nasıl optimize ederiz? Nasıl hızlandırırız? Birçok parametre olduğundan ayarlanması gereken hiperperemtre nasıl seçilir? seçilen hiperparametre nasıl ayarlanır? 🤔🤕
Bu soruları cevaplamadan önce süreci bir bütün olarak inceleyelim 🧐
Modelde olması gereken:
Training seti maliyet fonksiyonuna göre iyi çalışmalı (Human level performance ❌❌)
⬇
Dev seti maliyet fonksiyonuna göre iyi çalışmalı
⬇
Test seti maliyet fonksiyonuna göre iyi çalışmalı
⬇
Gerçek hayatta iyi çalışmalı ✨
Neyin yanlış olduğunu bulmak, uygun bir çözüm seçmemize ve daha sonra projeyi etkilemeden bu kısmı düzeltmemize yardımcı olabilir. 👩🔧
👷♀️ Makine Öğrenimi Projelerini Yapılandırma Talimatları
Makine öğrenim sistemlerinin kurulmasındaki zorluklardan biri, deneyebileceğimiz pek çok şeyin olması 🙄. Örneğin, ayarlayabildiğimiz çok fazla hiperparametre mevcut. İstenen etkiyi elde etmek için hangi parametrenin ayarlanacağını bilme sanatına orthogonalisation denir.
Bir ML projesini değerlendirirken nelere dikkat etmeliyiz? Onu nasıl optimize ederiz? Nasıl hızlandırırız? Birçok parametre olduğundan ayarlanması gereken hiperperemtre nasıl seçilir? seçilen hiperparametre nasıl ayarlanır? 🤔🤕
Bu soruları cevaplamadan önce süreci bir bütün olarak inceleyelim 🧐
Modelde olması gereken:
Training seti maliyet fonksiyonuna göre iyi çalışmalı (Human level performance ❌❌)
⬇
Dev seti maliyet fonksiyonuna göre iyi çalışmalı
⬇
Test seti maliyet fonksiyonuna göre iyi çalışmalı
⬇
Gerçek hayatta iyi çalışmalı ✨
Neyin yanlış olduğunu bulmak, uygun bir çözüm seçmemize ve daha sonra projeyi etkilemeden bu kısmı düzeltmemize yardımcı olabilir. 👩🔧
Terim
Açıklama
👩🎓 Bayes Error
Herhangi bir sınıflandırıcı için olası en düşük hata oranı (Optimum hata 🤔)
👩🏫 Human Level Error
Bir insan tarafından elde edilebilecek hata oranı
👮♀️ Avoidable Bias
Bayes hatası ile insan seviyesi hatası arasındaki fark
Peki, bu aşamada bir kriterimiz var, senin modelin insanlardan daha mı kötü yapıyor (Çünkü insanlar birçok işte oldukça iyilerdir 👩🎓)? Evet ise, aşağıdakileri denyebilirsin:
👩🏫 İnsanlardan etiketli veriler al
👀 Manuel hata analizinden fikir edinmeye çalış; (Bir insan neden bunu doğru yapabiliyor 🙄)
🔎 bias / variance 'ı daha iyi anlaliz et 🔍
🤔 Not: İnsanların bir görevde ne kadar iyi yapabileceklerini bilmek, bias'ı ve varyansı azaltmaya ne kadar çalışmamız gerektiğini daha iyi anlamamıza yardımcı olabilir
İşlemler daha az net 😥
Uygun teknikler buraya eklenecektir
Aşağıdaki iki durumun olduğunu varsayalım:
Durum1
Durum2
Human Error
1%
7.5%
Training Error
8%
8%
Dev Error
10%
10%
Training ve dev hataları aynı olsa bile, daha iyi performans için farklı taktikler uygulayacağız
Durum1'de, Yüksek Bias
vardır, o yüzden yanlılık azaltma tekniklerine odaklanmamız lazım 🤔, başka bir deyişle, training ve insan hatası arasındaki farkı azaltmamız gerekmektedir, ona da the avoidable error denir.
Daha iyi algoritma, daha iyi NN yapısı, ......
Durum2'de, Yüksek Varyans
vardır, o yüzden varyans azaltma tekniklerine odaklanmamız lazım 🙄, başka bir deyişle training ve dev hatalarının arasındaki farkı azaltmamız lazım
regularization ekleme, daha çok veri elde etme, ......
Bu analiz sürecine Error analysis denir 🕵️
Bilgisayar görüşü problemlerinde,
human-level-error ≈ bayes-error
çünkü insanlar görüş prblemlerinde çok iyiler
Online reklamcılık
Ürün önerme
Logistics
Kredi onayları
.....
Yeni bir projemiz olduğunda, bir ilk model üretmek ve ardından en iyi modeli elde edene kadar iteratif bir şekilde ilerlemek önerilir, Bu, teorik olarak zamanı modeli oluşturma harcamaktan ve en iyi hipermetreyi düşünmekten daha pratiktir. -bu da neredeyse imkansız 🙄-
O yüzden sadece aşırı düşünme! (Hem ML problemlerinde hem de hayat problemlerinde 🤗🙆)
Precesion'a P ve recall'a R bakarken (örneğin) en iyi modeli doğru şekilde seçemeyebiliriz
Bu yüzden P ve R arasında bir ilişki kurabilecek yeni bir değerlendirme ölçütü oluşturmalıyız.
Şimdi yeni ölçümümüz sayesinde en iyi modeli seçebiliriz 🐣
Örneğin: (popüler bir değerlendirme ölçütü olarak) F1 Score:
Özetle: En iyi seçimi yapabilmek için modellerimiz ve değerlerimiz sayesinde kendi değerlendirme ölçümlerimizi oluşturabiliriz 👩🏫
Daha iyi bir değerlendirme için, ölçümlerimizi şu şekilde sınıflandırmamız gerekir:
Değerlendirme Ölçütü Türü
Açıklama
✨ Optimizing Metric
En iyi değerde olması gereken bir ölçüm
🤗 Satisficing Metric (tatmin edici)
Sadece yeterince iyi olması gereken bir ölçüm
Teknik olarak, Eğer N
ölçümümüz varsa, 1
ölçüyü optimize etmeye çalışırız ve N-1
ölçüyü yeterince iyi hale getirmeliyiz 🙄
🙌 Açıklama: belirlediğimiz bir eşik değerine göre tatmin edici ölçütlerini ayarlıyoruz
Dev ve test setlerini aynı dağıtımdan distribution seçmemiz gerekiyor, bu yüzden verileri önce rastgele karıştırmamız sonra bölmemiz gerekir.
Sonuç olarak, hem test hem de dev setlerinin tüm kategorilerden veriler içerir ✨
Gelecekte almayı umduğumuz verileri yansıtmak için -aynı dağıtımdan(distribution)- bir dev ve test seti seçmeliyiz
Eğer küçük bir veri setimiz varsa (m < 10,000)
60% training, 20% dev, 20% test iyi olacaktır
Eğer kocaman veri setimiz varsa (örneğin 1M)
99% trainig, %1 dev, 1% test makul olabilir
Ve böylece, bu iki durumu göz önünde bulundurarak doğru oranı seçebiliriz 👮
Öneri: Eğer dev/test setleri değerlendirme ölçütüyle iyi çalışıyorsa ve gerçek hayat uygulamasında iyi çalışmıyorsa dev/test setlerini ve/veya değerlendirme ölçütü değiştirilmelidir 🏳
🤡 Resim Artırma Tekniği Kavramları
💥 Aşırı öğrenmeden kaçınmak için kullanılan bir teknik olan Resim Artırma Temelleri
⭐ Küçük bir veri setine sahip isek, veri setini eğitim için tüm senaryoları açacak ve resim artırmanın çeşitli teknikleriyle çalıştırabilecek temel görüntüleri değiştirmeden manipüle edebiliyoruz.
Not: Resim artırma Hem eğitim hem de test seti için gereklidir 😅
👩🏫 Konsept çok basittir:
Verilerimiz sınırlıysa, gelecekteki olası öngörüleri karşılayacak verilere sahip olma ihtimalimiz de sınırlıdır ve mantıksal olarak ne kadar az veriye sahipsek, modelimizin henüz görmediği veriler için doğru tahminler alma şansımız o kadar azdır.
🙄 Eğer kedileri tespit etmek için bir model eğitiyorsak ve modelimiz bir kedinin uzanırken nasıl göründüğünü hiç görmemişse, gelecekte de tanımayabilir.
Büyütme, döndürme gibi dönüşümler kullanarak eğitim yaparken, görüntülerimizi anında değiştirir.
Bu nedenle, 'ayakta' olan bir kediyi 90 derece döndürerek uzanmış bir kedinin görüntüsünü 'taklit edebilir'.
Bu şekilde, elimizdeki ver seti ucuz ✨ bir şekilde büyütmüş oluyoruz.
🔎 Not: Orijinal veriyi olduğu gibi değiştirmemek adına Image Augmentation'ı bellekte yapmak yerine çalışma zamanında runtime'da yapılması tercih edilir 🤔
Görüntüyü eksene göre yansıtmak
Bir görüntüyü alıp rastgele kesimler almak
Renk kanallarına değerler ekleme ve çıkarma
Açı dönüşümü görüntünün açısını kaydırır
Aşağıdaki kod parçası Image Augmentation yapmak için kullanılır
Parametre
Açıklama
rescale
Görüntüleri yeniden ölçeklendirme, NN'ler normalleştirilmiş verilerle daha iyi çalışır, bu yüzden görüntüleri yeniden ölçeklendirirsek değerler 0,1 arasında olur
rotation_range
Derece cinsinden bir değer (0-180), içinde resimlerin rasgele döndürülmesi için bir aralık
Height and width shifting
Görüntüleri dikey veya yatay olarak rasgele kaydırır
shear_range
Rastgele açı dönüşümü uygular
zoom_range
Fotoğrafları rasgele yakınlaştırır
horizontal_flip
Rgörüntülerin yarısını yatay olarak rasgele çevirir
fill_mode
Yeni oluşturulan pikselleri doldurmak için kullanılan, bir döndürmeden veya genişlik / yükseklik kaymasından sonra görünebilecek bir stratejidir
Full kod örneği burada 🐾 👈
⛓ Dizi Modellerinin Temelleri
Diziler, her örneğin bir veri serisi olarak görülebildiği veri yapılarıdır, örneğin 🧐:
Etiketlenmiş giriş verileri X ve Çıkış Y olduğundan bütün bu görevler gözetimli öğrneme olarak tanımlanabilir👩🏫
Sequence-to-Sequence görevlerindeki giriş ve çıkış dizilerinin boyutları farklı olabilir ❗
Makine öğrenmesi algoritmaları genellikle metin girişinin sabit uzunlukta bir vektör olarak temsil edilmesini gerektirir 🙄
Bu nedenle, dizileri modellemek için aşağıdakileri yapabilen özel bir öğrenme yaklaşımına ihtiyacımız var:
✔ Değişen uzunluklara sahip dizilere uygun
✔ Dizi sırasını koruyabilen
✔ Girdi verilerini çok kısa kesmek yerine uzun vadeli bağımlılıkları takip eden
✔ Parametreleri dizi boyunca paylaşabilen (Dizi boyunca eskiyi silip tekrar öğrenmeyen)
🕵️♀️ Popüler Obje Algılama Teknikleri
R-CNN (Regional Based Convolutional Neural Networks)
Fast R-CNN (Regional Based Convolutional Neural Networks)
Faster R-CNN (Regional Based Convolutional Neural Networks)
RFCN (Region Based Fully Connected Convolutional Neural Networks)
YOLO (You Only Look Once)
YOLO V1
YOLO V2
YOLO V3
SSD (Single Shot Detection)
LeNet
AlexNet
MobileNet
ResNet
VGG
💥 End to end yaklaşımıyla eğitilmiş tek bir sinir ağı içerir
Bir görüntüyü girdi olarak alır ve bounding boxes ve her box için sınıf etiketlerini (label) direkt tahmin eder
😕 Bu teknik daha düşük tahmin doğruluğu sunar (örneğin, daha fazla yerelleştirme (localization) hatası) Bölge tabanlı modellere göre
➗ YOLO giriş görüntüsünü bir S × S grid'e böler. Her hücre yalnızca bir objeyi tahmin eder
👷♀️ Uzun lafın kısası: Sistem giriş görüntüsünü S × S grid'e böler. Bir objenin merkezi bir hücreye düşerse, bu hücre bu objeyi algılar.
🚀 Hız
🤸♀️ Gerçek zamanlı (real time) uygulamalar için uygundur
😕 Küçük boyutlu nesnelerde düşük performans
Kesin olmayan obje konumları verebilir
TODO: Compare versions of YOLO
💥 Tek bir derin sinir ağını kullanarak görüntüdeki objeleri tahmin eder.
🤓 Ağ, feature map'lara uygulanan küçük convolutional filtreleri kullanarak her bir obje kategorisinin varlığı için puanlar oluşturur.
✌ Bu yaklaşım, belirli objelerin varlığı için bounding boxes ve scores üreten bir feed-forward CNN kullanır.
❗ Bu modelde, her feature map hücresi bir dizi varsayılan bounding boxe'a bağlanır
Feature extraction için belirli bir convolution'dan geçtikten sonra, mxn boyutunda bir feature layer elde ediyoruz (Konumların sayısı) ve p kanala sahip , aşağıdaki 8×8 ve 4×4 gib
Ve bu m×n×p özellik katmanına 3 × 3 convolution uygulanır
Her konum için, k tane bounding boxes elde ediyoruz. Bu kutular farklı boyutlara ve en boy oranlarına sahiptir.
Olay, belki dikey bir dikdörtgen insan sığdırabilirken yatay bir dikdörtgen araba için sığdırabilir.
Kutuların her biri için, orijinal varsayılan kutu şekline göre c sınıfı skorları ve 4 ofsetleri hesaplayacağız.
SSD obje algılama algoritması 2 bölümden oluşur:
Feature map'leri çıkarma
convolution filtrelerini tespit edilen objelere uygulama.
YOLO'ya göre daha iyi doğruluk
Bölge tabanlı algoritmalara göre daha iyi hız
Adım Adım Özel Nesne Algılayıcısı Eğitimi
✨ Tensorflow Object Detection API, güçlü AI bilgimiz veya güçlü TensorFlow bilgimiz olmasa bile önceden eğitilmiş modellere bağlı olarak özel nesne algılayıcısı oluşturmamızı sağlayan güçlü bir araçtır.
🗃️ Veri seti olarak, OpenImages veri kümesinin nasıl kullanılacağını ve verilerinin TensorFlow dostu formata nasıl dönüştürüleceğini göstereceğim.
👩💻 Ortamı Hazırlama
🖼️ Resim Toplama
🤹♀️ Resim Organizasyonu
🤖 Model Seçimi
👩🔧 Model Konfigürasyonu
👶 Eğitim
👮♀️ Değerlendirme
👒 Modeli Dışa Aktarma
📱 Tflite'ye dönüştürme
💻 CMD'yi açıp aşağıdaki komutu çalıştırın:
Aşağıdaki temellere dayanır:
Çok sayıda bölge seçmek
Ve sonra bunları selective search yaparak 2000’e düşürmek
Her bölgeye 'bölge adayı' region proposal denir
Her bölgeden convolutional özellikleri çıkarmak
Sonunda herhangi bir obje bulunup bulunmadığını kontrol etme
Farklı bölgeleri tanımlamak için bir algoritma, Temelde bir objeyi oluşturan dört bölge vardır: varying scales, colors, textures, and enclosure. Selective search Seçici arama, görüntüdeki bu kalıpları tanımlar ve buna göre çeşitli bölgeler önerir
🙄 Başka bir deyişle: Benzer ölgelerin hiyerarşik gruplamasını sağlamaya ve ona göre farklı bölgeler önermeye dayanan bir algoritmadır
Eğitilmesi çok uzun sürer.
Gerçek zamanlı -real time- uygulamaları için kullanılmaz.
Selective search algoritması fix bir algoritmadır. O yüzden, o aşamada öğrenme gerçekleşmiyor.
Bu, kötü bölge adayı oluşturulmasına neden olabilir.
R-CNN'ler çok yavaştır 🐢 sebepler:
Selective search'e dayalı olarak her bir görüntü için 2.000 bölge çıkarmak
Her görüntü bölgesi için CNN kullanarak özellikleri çıkarmak.
Eğer N resmimiz varsa, CNN özelliklerinin sayısı N*2000 olacaktır. 😢
Görüntü başına 2.000 kez CNN çalıştırmak yerine, görüntü başına yalnızca bir kez çalıştırabilir ve ilgi alanlarını (Region Of Interest ROI) elde edebiliriz (bazı objeler içeren bölgeler).
Yani, aşağıdaki mantığa dayanır:
Tüm görüntüyü CNN'ye besliyoruz
CNN bir feature map oluşturur
Oluşturulan feature map'i kullanarak ROI'i çıkardık (Region of interests)
2000 bölgenin sorunu çözüldü 🎉
Selective search'i hala kullanıyoruz 🙄
Sonra, bölgeleri sabit bir boyuta yeniden boyutlandırıyoruz (ROI pooling katmanını kullanarak)
Son olarak, bölgeleri fully connected katmana besleriz (sınıflandırılmak üzere)
Bölge adayları Fast R-CNN algoritmasında hala darboğazlar oluşturuyor ve performansı etkiliyor.
Faster R-CNN, Selective search sorununu Region Proposal Network (RPN) ile değiştirerek giderir 🤗
Yani, aşağıdaki mantığa dayanır:
Tüm görüntüyü CNN'ye besliyoruz
CNN bir feature map oluşturur
Feature map üzerine RPN uygularız
RPN, nesne adaylarını, aday puanları objectness ile birlikte döndürür.
Selective search sorunu giderildi 🎉
Sonra, bölgeleri sabit bir boyuta yeniden boyutlandırıyoruz (ROI pooling katmanını kullanarak)
Son olarak, bölgeleri fully connected katmana besleriz (sınıflandırılmak üzere)
RPN, CNN'den feature map alır
Map üzerine 3*3'lük pencere kullanır
k tane anchor boxes üretir
Kutular farklı şekil ve boyutlardadır
Anchor boxes, görüntü boyunca yerleştirilmiş ve farklı şekil ve boyutlarda sabit boyutta kutularıdır. Her anchor box için, RPN iki şeyi tahmin eder:
Anchor'un bir nesne olma olasılığını
(objenin hangi sınıfa ait olduğunu dikkate almaz)
Anchor'ları objeyi daha iyi sığdıracak şekilde ayarlamak için bounding box
Bu yazı çeviri aşamasındadır, yazının aslına bakabilirsiniz 👀
💁♀️ Önceden eğitilmiş modellere bağlı modeller oluşturmak, çok güçlü makineler kullanarak haftalarca eğitilmiş modelleri kullandığımız için bize çok fazla zaman ve iş gücü kazandırır, bu strateji olarak adlandırılır.
🥦 'yı indirin
Görev
Giriş X
Çıkış Y
Tür
💬 Konuşma tanıma
Dalga dizisi
Metin dizisi
Sequence-to-Sequence
🎶 Müzik Üretme
Hiç / Tam sayı
Dalga dizisi
One-to_Sequence
💌 Duygu Sınıflandırması
Metin dizisi
Tamsayı Değerlendirmesi (1➡5)
Sequence-to-One
🔠 Makine Çevirisi
Metin dizisi
Metin dizisi
Sequence-to-Sequence
📹 Video Etkinlik Tanıma
Video Çerçeveleri
Etiket
Sequence-to-One
Terim
Açıklama
Classification
Giriş görüntüsündeki bir objenin etiketini (sınıfını) belirtme
Classification and Localization
Giriş görüntüsündeki bir nesnenin etiketini ve koordinatlarını belirtme
Object Detection
Giriş görüntüsündeki birden fazla nesnenin etiketlerini ve koordinatlarını belirtme
Classification
Clf. and Localization
Detection
Obje sayısı
1
1
birden fazla
Girdi
resim
resim
resim
Çıktı
etiket
etiket + koordinatlar
etiket(ler) + koordinatlar
💻 Platform
🏷️ Versiyon
Python
3.7
TensorFlow
1.15
🚙 CPU
🚀 GPU
Brain of computer
Brawn of computer
Very few complex cores
hundreds of simpler cores with parallel architecture
single-thread performance optimization
thousands of concurrent hardware threads
Can do a bit of everything, but not great at much
Good for math heavy processes
Algoritma
Özet
Sınırlandırma
🔷 R-CNN
Görüntülerden selective search kullanarak 2000 bölge çıkartır
Yüksek hesaplama süresi
💫 Fast R-CNN
Görüntü feature maps çıkarmak için bir kez CNN'e geçirilir ve sonra bölgeler selective search ile çıkarılır
Selective search yavaştır
➰ Faster R-CNN
Selective search yöntemini RPN ile değiştirir
yavaş (?)
Önceki çıkışların sonraki katmanlara giriş olarak kullanılmasına izin veren bir sinir ağı sınıfıdır
Eğitim sırasında öğrendikleri şeyleri hatırlarlar ✨
Temel bir RNN hücresi. 'yi (Şimdiki girdi) ve 'yi (geçmişten gelen bilgileri içeren önceki gizli durum) girdi olarak alır, bir sonraki RNN hücresine verilen ve aynı zamanda 'yi tahmin etmek için kullanılan 'yi çıktı olarak verir
'yi hesaplamak için:
'yi hesaplamak için:
Kayıp fonksiyonu aşağıdaki şekilde tanımlanır
1️⃣ ➡ 1️⃣ One-to-One (Klasik ANN)
1️⃣ ➡ 🔢 One-to-Many (Müzik Üretme)
🔢 ➡ 1️⃣ Many-to-One (Anlamsal Analiz)
🔢 ➡ 🔢 Many-to-Many (Konuşma tanıma)
🔢 ➡ 🔢 Many-to-Many (Makine Çevirisi)
Birçok uygulamada, tüm giriş sırasına bağlı olabilecek bir tahmini çıkarmak isteyebiliriz
Bidirectional RNN'ler dizinin başlangıcından başlayarak zaman içinde ileri hareket eden bir RNN'i, dizinin sonundan başlayarak zaman boyunca geri hareket eden bir RNN ile birleştirirler.
Çift Yönlü Tekrarlayan Yapay Sinir Ağları aslında iki bağımsız RNN bir araya getiriyorlar.
Giriş dizisi bir ağ için normal zaman sırasıyla, diğeri için ters zaman sırasıyla aktarılır.
İki ağın çıkışları genellikle her zaman adımında birleştirilir.
🎉 Bu yapı, ağların, her adımda dizi hakkında hem geri hem de ileri bilgiye sahip olmalarını sağlar.
Tahmin yapmadan önce tüm veri dizisine ihtiyacımız vardır.
e.g: gerçek zamanlı konuşma tanıma için uygun değildir
Çoğu RNN hesaplamaları, üç parametre bloğuna ve ilişkili dönüşümlere ayrıştırılabilir.: 1. Girişten gizli duruma, ➡ 2. Önceki gizli durumdan sonraki gizli duruma, ➡ 3. Gizli durumdan çıktıya, ➡
Derin tekrarlayan ağlarla sonuçlanan yukarıdaki dönüşümlerin her biri için birden çok katman kullanabiliriz 😋
10.000 zaman adımı büyüklüğünde bir dizi verisini işleyen bir RNN, optimize edilmesi çok zor olan 10.000 derin katmana sahiptir 🙄
Derin Sinir Ağlarında da, daha derin ağlar vanishing gradient problem sorununa giriyor 🥽
Bu da, uzun dizi boyutuna sahip RNN'lerde de olur 🐛
RNN'deki Vanishing Gradients problemi üzerine Yazımı okuyabilirsin 🤸♀️
10.000 zaman adımı büyüklüğünde bir dizi verisini işleyen bir RNN, optimize edilmesi çok zor olan 10.000 derin katmana sahiptir 🙄
Derin Sinir Ağlarında da, daha derin ağlar vanishing gradient problem sorununa giriyor 🥽
Bu da, uzun dizi boyutuna sahip RNN'lerde de olur 🐛
GRU Gated Recurrent Unit
LSTM Long Short-Term Memory
GRU'lar standart tekrarlayan sinir ağlarının gelişmiş versiyonlarıdır ✨, GRU güncelleme kapısı ve sıfırlama kapısını kullanır
Temel olarak, bunlar çıktıya hangi bilgilerin aktarılması gerektiğine karar veren iki vektördür
Onlarla ilgili özel olan şey, bilgiyi uzun zaman önce tutmak için eğitilebilecekleridir
Zamanla kaybolmadan veya tahminle ilgili bilgileri çıkarmadan
Kapı
Açıklama
🔁 Güncelleme Kapısı
Modele, geçmiş bilgilerin ne kadarının (önceki zaman adımlarından) geleceğe aktarılması gerektiğini belirlemede yardımcı olur
0️⃣ Sıfırlama Kapısı
Modele, geçmiş bilgilerin ne kadarının unutacağına karar vermede yardımcı olur
Bu kapı göz önüne alındığında, vanishing gradient problemi ortadan kalkar çünkü model kendi başına geçmiş bilgilerin ne kadarını geleceğe taşıdığını öğreniyor.
Kısaca: Şimdi ne kadar geçmiş önemli olmalı? 🙄
Geçmiş bilgilerinin ne kadarının unutulacağına karar vermek için model tarafından kullanıldığından, bu kapı güncelleme kapısıyla karşılaştırıldığında tam tersi bir işlevselliğe sahiptir.
Kısaca: Önceki bilgi düşürülecek mi? 🙄
Geçmişten ilgili bilgileri saklamak için sıfırlama kapısını kullanacak bellek içeriği.
Mevcut birim için bilgi tutan ve onu daha sonra ağa iletecek bir vektör.
vanishing gradient problemini gidermek için bir çözümdür
Model her seferinde yeni girişi kaybetmekte kalmıyor, ilgili bilgileri saklıyor ve ağın bir sonraki zaman adımlarına aktarıyor
Bir metinde kelimeler okuduğumuzu varsayalım ve örneğin tekil mi yoksa çoğul mu olduğu gibi gramer yapılarını takip etmek için bir LSTM kullanmak istiyoruz.
Eğer konu tekil bir kelimeden çoğul kelimeye geçerse, tekil / çoğul durumun önceden depolanmış hafıza değerinden kurtulmanın bir yolunu bulmalıyız.
LSTM'de, sıfırlama (forget) kapısı bunu yapmamıza izin veriyor
Burada, $W_f$ sıfırlama kapısı davranışını yöneten ağırlıklardır. 'yi birleştiriyoruz ve ile çarpıyoruz. Yukarıdaki denklem, 0 ile 1 arasında değerleri olan bir vektörüyle sonuçlanır
Bu sıfırlama kapısı vektörü, önceki hücre durumu olan ile element-wise çarpılır
Eğer 'nın değerlerinden biri 0 ise (veya 0'a yakınsa), LSTM'nin bu bilgi parçasını 'nin karşılık gelen bileşeninden çıkarması gerektiği anlamına gelir (örneğin: tekil nesne).
Değerlerden biri 1 ise, bilgiyi olduğu gibi korunacaktır.
Odaklandığımız nesnenin tekil olduğunu unuttuğumuzda, yeni nesnenin artık çoğul olduğunu yansıtacak şekilde güncellemenin bir yolunu bulmalıyız. Güncelleme kapısının formülü aşağıdaki gibidir:
Sıfırlama kapısında olduğuna benzer şekilde, burada yine 0 ile 1 arasındaki değerlerden oluşan bir vektördür. Bu, 'i hesaplamak için, ile element-wise çarpılacaktır.
Yeni nesneyi güncellemek için önceki hücre durumumuza ekleyebileceğimiz yeni bir sayı vektörü oluşturmamız gerekiyor. Kullandığımız denklem aşağıdaki gibidir:
Son olarak, yeni hücre durumu:
Hangi çıktıları kullanacağımıza karar vermek için aşağıdaki iki formülü kullanıyoruz:
Birinci denklemde, sigmoid fonksiyonunu kullanarak neyin çıktısı alınacağına karar verirken, ikinci denklemde önceki durumu tanh fonksiyonu ile çarpıyoruz.
GRU, LSTM'den daha yeni, LSTM daha güçlü, ancak GRU'nun uygulanması daha kolay 🚧
Doğal Dil İşleme Hakkında Karışık Bilgiler
Makine çeviri modeli, daha önce yerleştirilmiş bir kodlayıcı (encoder) ağına sahip olması dışında, bir dil modeline benzer.
Bazen, koşullu dil modeli (conditional language model) olarak adlandırılır.
Bir kitabın paragrafını Fransızca'dan İngilizce'ye çevirmek istesek, paragrafın tamamını okuyup sonra kitabı kapatıp çeviri yapmıyoruz 😅
Tercüme sürecinde, Fransızca paragrafın yazdığımız İngilizce kısımlarına karşılık gelen kısımlarını okuyup/yeniden okuyup odaklanıyoruz 🤔
Dikkat mekanizması, Neural Makine Çeviri modeline her adımda dikkat etmesi gerekenleri söyler 👩🏫
Sesi (x-girişi) metne (y-çıkış) dönüştürme
Hava basıncını ölçerek 🙄
Sequence-to-Sequence model
TODO: Add details
Projenin Temel Aldığı Kavram Sözlüğü
Kaynak
İngilizce
Türkçe
📚
Activation Function
Aktivasyon Fonksiyonu
📚
Artificial Neural Network
Yapay Sinir Ağı
📚
Backpropagation
Geri Yayılma
🦋
Batch Gradient Descent
Bölümlü Gradyan İnişi
📚
Bias
yanlılık
📚
Biased / Unbiased
Yanlılıklı / Yanlılıksız
🦋
Binary Classification
İkili Sınıflandırma
🦋
Broadcasting
Yayma
📚
Computer Vision
Bilgisayar Görüşü
📚
Convex Function
Konveks Fonksiyon
📚
Convolution
Konvolüsyon
📚
Convolutional Neural Network
Evrişimli Sinir Ağı
📚
Cost Function
Maliyet Fonksiyonu
📚
Data Augmentation
Veri Artırma
📚
Data Set
Veri Seti
📚
Dot Product
Nokta Çarpım
🦋
Dropout
Eleme Düzenlileştirmesi
📚
element wise multiplication
Hadamard Çarpımı
🦋
Fully Connected
Tam bağlanmış
📚
Gradient Descent
Gradyan İnişi
🦋
Gradient Descent with Momentum
Momentumlu Gradyan İnişi
📚
Hidden Layer
Gizli Katman
📚
Learning Rate
Öğrenme Hızı
📚
Loss Function
Kayıp Fonksiyonu
🦋
Mini Batch Gradient Descent
Mini Bölümlü Gradyan İnişi
🦋
Non-Convex Function
Konveks Olmayan Fonksiyon
📚
Notation
Notasyon
📚
Optimizer
Eniyileyici
📚
Outer Product
Dış Çarpım
📚
Overfitting
Aşırı Öğrenme
🦋
Padding
Dolgulama
📚
Regularization
Düzenlileştirme
🦋
Same Convolution
Dolgulamalı Konvolüsyon
🦋
Stochastic Gradient Descent
Stokastik Gradyan İnişi
🦋
Strided Convolution
Adımlı Konvolüsyon
📚
Tensor
Tensör
📚
Test Set
Test Seti
📚
Threshold
Eşik
📚
Training Set
Eğitim Seti
📚
Under-fitting
Eksik Öğrenme
🦋
Valid Convolution
Normal Konvolüsyon
🦋
Validation Set
Doğrulama Seti
🦋
Vectorization
Vektörleştirme
Tavsiye ettiğim faydalı PDF'lerin listesi
PDF'ler arttıkça kategorize edilecektir 👩🔧
Metin işleme bağlamında (örneğin: Doğal Dil İşleme NLP)
Sembo
Açıklama
Giriş dizisindeki t
'inci kelime
Çıkış dizisindeki t
'inci kelime
i
'inci giriş dizisindeki t
'inci kelime
i
'inci çıkış dizisindeki t
'inci kelime
i
'inci giriş dizisinin uzunluğu
i
'inci çıkış dizisinin uzunluğu
Kelimeleri temsil etmenin bir yolu, böylece onları kolayca kullanabiliriz
Diyelim ki 10 kelimeden oluşan (🤭) bir sözlüğümüz var ve sözlükteki kelimeler:
Car, Pen, Girl, Berry, Apple, Likes, The, And, Boy, Book.
Ve Bizim : The Girl Likes Apple And Berry
Böylece bu diziyi aşağıdaki gibi temsil edebiliriz 👀
Dizileri bu şekilde temsil ederek verileri sinir ağlarına aktarabiliriz ✨
Eğer sözlüğümüz 10.000 kelimeden oluşuyorsa, her vektör 10.000 boyutlu olacaktır 🤕
Bu gösterim anlamsal özellikleri yakalayamaz 💔
Bu dosya yanlış bilgi içerebilir 🙄‼ Lütfen bir hata bulduğunuzda düzeltmem için Pull Request açın 🌟
One Hot Encoding
Featurized Representation (Word Embedding)
Word2Vec
Skip Gram Model
GloVe (Global Vectors for Word Representation)
Kelimeleri temsil etmenin bir yolu, böylece onları kolayca kullanabilriz
Diyelim ki 10 kelimeden oluşan (🤭) bir sözlüğümüz var ve sözlüğkteki kelimeler:
Car, Pen, Girl, Berry, Apple, Likes, The, And, Boy, Book.
Ve Bizim : The Girl Likes Apple And Berry
Böylece bu diziyi aşağıdaki gibi temsil edebiliriz 👀
Dizileri bu şekilde temsil ederek verileri sinir ağlarına aktarabiliriz ✨
Eğer sözlüğümüz 10.000 kelimeden oluşuyorsa, her vektör 10.000 boyutlu olacaktır 🤕
Bu gösterim anlamsal özellikleri yakalayamaz 💔
Kelimeleri cinsiyet, yaş, kraliyet, yemek, maliyet, büyüklük vb. gibi özelliklerle ilişkilendirerek temsil etmek
Her özellik [-1, 1] arasında bir aralık olarak temsil edilir
Böylece her kelime bu özelliklerin bir vektörü olarak gösterilebilir
Her vektörün boyutu, seçtiğimiz özelliklerin sayısına bağlıdır
For a given word w, the embedding matrix E is a matrix that maps its 1-hot representation to its embedding as follows:
Çeviremedim 😢
Benzer anlama sahip olan kelimelerin benzer bir gösterimi vardır.
Bu model anlamsal (semantic) özellikleri yakalayabilir ✨
Vektörler one-hot gösterimindeki vektörlerden daha küçüktür.
TODO: Subtracting vectors of oppsite words
Word2vec, Verilen bir kelimenin diğer kelimelerle çevrili olma olasılığını tahmin ederek kelime embedding'lerini öğrenme stratejisidir.
Bu, daha sonra aldığımız pencere boyutuna bağlı olan bağlam (context) ve hedef (target) kelime çiftleri yaparak yapılır.
Pencere boyutu: Bağlam sözcüğünün soluna ve sağına bakan bir parametredir
pencere boyutu = 2 ile bağlam-hedef çiftleri oluşturma 🙌
Skip-gram word2vec modeli verilen herhangi bir t hedef kelimesinin c gibi bir bağlam kelimesi ile gerçekleşme olasılığını değerlendirerek kelime embedding'lerini öğrenen denetimli bir öğrenme görevidir. P(t|c) olasılığı da aşağıdaki şekilde hesaplanır:
Not: Softmax bölümünün paydasındaki tüm kelime sözlüğünü toplamak, bu modeli hesaplama açısından maliyetli kılar
Kelime gösterimi için Global vektörler tanımının kısaltılmış hali olan GloVe, eşzamanlı bir X matrisi kullanan ki burada her bir , bir hedefin bir j bağlamında gerçekleştiği sayısını belirten bir kelime gömme tekniğidir. Maliyet fonksiyonu J aşağıdaki gibidir:
f, ⟹ = 0 olacak şekilde bir ağırlıklandırma fonksiyonudur.
Bu modelde e ve θ'nın oynadığı simetri göz önüne alındığında, 'nin kelime embedding'i şöyle ifade edilir:
Eğer bu ilk denemen ise, yapılmış ve gerçekten en iyi şekilde çalışan önceden eğitilmiş bir modeli indirmeyi denemelisin.
Yeterli veriye sahipsen, mevcut algoritmalardan birini uygulamaya çalışabilirsin.
Kelime embedding'lerinin eğitilmesi çok maliyetli bir işlem olduğu için, çoğu ML'ciler önceden eğitilmiş embedding'ler kullanırlar.
👀 Kısa sürede fazla bilgi veren görsel materyaller
Materyaller arttıkça farklı dosyalara (veya kategorilere) ayrılacaktır 👮