Makale İncelemesi:CNN ile Çok Kategorili Sınıflandırma

Derin Öğrenmeyi Kullanarak Çok Kategorili Görüntülerin Sınıflandırılması : Evrişimli Bir Sinir Ağı Modeli

Bu yazıda, Ardhendu Bandhu, Sanjiban Sekhar Roy tarafından Hindistan’da 2017 senesinde ortaya konulmuş Classifying multi-category images using Deep Learning: A Convolutional Neural Network Model’ adlı makalenin incelemesi yapılmaktadır. TensorFlow ile evrişimsel sinir ağı kullanan bir görüntü sınıflandırma modeli sunulmaktadır. TensorFlow, makine öğrenimi ve derin sinir ağları için popüler bir açık kaynak kütüphanesidir. Sınıflandırma için çok kategorili bir görüntü veri kümesi dikkate alınmıştır. Geleneksel geri yayılım sinir ağı; bir giriş katmanı, gizli katman ve bir çıktıya sahiptir. Evrişimsel sinir ağında, bir evrişimsel tabaka ve bir maksimum havuzlama katmanı (pooling layer) vardır. Bu önerilen sınıflandırıcıyı, görüntü veri kümesinin karar sınırını hesaplamak için eğitiyoruz. Gerçek dünyadaki veriler çoğunlukla etiketlenmemiş ve yapılandırılmamış biçimdedir. Bu yapılandırılmamış veriler görüntü, ses ve metin verileri olabilir. Yararlı bilgiler sığ olan sinir ağlarından kolayca türetilemez, yani bunlar daha az sayıda gizli tabakaya sahip olanlardır. Çok sayıda gizli katmana sahip olan ve görüntülerden anlamlı bilgiler elde edebilen derin sinir ağı tabanlı CNN sınıflandırıcıyı önerilmektedir.

Anahtar kelimeler: Görüntü, Sınıflandırma, Evrişimsel Sinir Ağı, TensorFlow, Derin Sinir Ağı.

Öncelikle projede ortaya konulmuş adımları anlayabilmemiz için sınıflandırmanın ne olduğunu inceleyelim. Görüntü Sınıflandırması, çok sınıflı bir görüntü kümesinden görüntüleri sınıflandırmanın işlevini ifade eder. Bir görüntü veri kümesini birden çok sınıfa veya kategoriye sınıflandırmak için, veri kümesi ile sınıflar arasında iyi bir anlayış olmalıdır.

Bu makalede;

1. Görüntüleri sınıflandırmak için derin öğrenme tabanlı Evrişimsel Sinir Ağı (CNN) önerilmektedir.

2. Önerilen model, veri kümesini eğitmek ve doğrulamak için yaklaşık 300 dakika süren köpek ve kedilerin 20.000 görüntüsünü içeren veri kümesi içinde 10.000 kez yinelendikten sonra yüksek doğruluk elde eder.

Bu projede, bir evrişimsel tabaka, RELU fonksiyonu, bir pooling (havuzlama) tabakası ve fully connected (tam bağlı) bir tabakadan oluşan bir evrişimsel sinir ağı kullanılmaktadır. Evrişimsel sinir ağı, derin öğrenmeyi kullanarak görüntü tanıma söz konusu olduğunda otomatik bir seçimdir.

Convolutional Neural Network

Sınıflandırma amacıyla, evrişimsel ağı [INPUT-CONV-RELU-POOL-FC] olarak mimariye sahiptir.

INPUT- Görüntü olarak ham piksel değerleri.

CONV- İçeriği nöronların ilk kümesindeki çıktı.

RELU- Aktivasyon fonksiyonunu uygular.

POOL- Aşağı örnekleme işlemi yapar.

FC- Sınıf puanını hesaplar.

Bu yayında, resim karakterizasyonu için çok kademeli bir derin öğrenme sistemi planlanır ve uygulanır. Özellikle önerilen yapı;

1) Resim gruplama sorunu için ayrımcı ve öğretici olmayan yakındaki nöronları nasıl bulunacağı gösterilmektedir.

2) Bu alanlar göz önüne alındığında seviye sınıflandırıcıyı nasıl görüntüleyebileceğini gösterilmektedir.

YÖNTEMLER

Kaggle veri tabanından 20.000 tane köpek ve kedi görüntüsü içeren bir veri kümesi kullanılmıştır. Kaggle veri tabanında, mevcut toplam 25000 görüntü vardır. Görüntüler eğitim ve test setine bölünmektedir. Eğitim setine 12.000 görüntü ve test setine 8.000 görüntü girilmektedir. Eğitim seti ve test setinin bölünmüş veri kümesi, verilerin çapraz doğrulanmasına yardımcı olur ve hatalar üzerinde bir kontrol sağlar; çapraz doğrulama, önerilen sınıflandırıcının kedi veya köpek görüntülerini doğru bir şekilde sınıflandırıp sınıflandırmadığını kontrol eder.

Aşağıdaki deneysel kurulum, bilimsel bir Python geliştirme ortamı olan Spyder üzerinde yapılır.

  1. İlk olarak Scipy, Numpy ve Tensorflow gibi gerekli kullanılmalıdır.
  2. Bir başlangıç zamanı, eğitim yolu ve bir test yolu sabit olarak olmalıdır. Görüntü yüksekliği ve görüntü genişliği 64 piksel olarak sağlandı. Sonra 20.000 görüntü içeren görüntü veri kümesi yüklenir. Boyutların büyük sayılar olmasınedeniyle yeniden boyutlandırılır ve yinelenir. Bu süre yaklaşık olarak 5-10 dakika sürmektedir.
  3. Bu veriler TensorFlow ile beslenir. TensorFlowda, tüm veriler bir hesaplama grafiğindeki işlemler arasında geçirilir.Tensorlerin bu durumu kolayca yorumlayabilmesi için özellikler ve etiketler bir matris formunda olmalıdır.
  4. Tensorflow Tahmini: Model içindeki verileri çağırmak için, oturumu, ilgili verilerle tüm yer tutucuların adının yerleştirildiği ek bir argüman ile başlatırız. TensorFlowdaki veriler değişken şeklinde geçirildiğinden, bir grafik bir oturumda çalıştırılmadan önce başlatılması gerekir.Bir değişkenin değerini güncellemek için, daha sonra çalıştırabilecek bir güncelleme işlevi tanımlarız.
  5. Değişkenler başlatıldıktan sonra, durum değişkeninin başlangıç değerini yazdırırız ve güncelleme işlemini çalıştırırız. Bundan sonra aktivasyon fonksiyonunun dönüşü, aktivasyon fonksiyonunun seçimi ağın davranışı üzerinde büyük bir etkiye sahiptir. Belirli bir düğüm için etkinleştirme işlevi, bir girdi veya bir girdi kümesi sağlanan belirli düğümün çıktısıdır.
  6. Ardından, giriş özelliklerimizi eğitmek için ihtiyaç duyacağımız hiper parametreleri tanımlarız. Daha karmaşık sinir ağlarında daha çok hiper parametreyle karşılaşmaktayız.Hiper parametrelerimizden bazıları öğrenme oranı gibi olabilir.
     Başka bir hiper parametre, verilerimizi kaç kez eğittiğimiz yineleme sayısıdır. Bir sonraki hiper parametre, bir seferde sınıflandırma için gönderilecek görüntü kümesinin boyutunu seçen batch size boyutudur.
  7. Son olarak, tüm bunlardan sonra, TensorFlow oturumunu başlatırız, bu da TensorFlow’un çalışmasını sağlar, çünkü bir oturumu başlatmadan bir TensorFlow işe yaramaz. Bundan sonra modelimiz eğitim sürecine başlayacaktır.

SONUÇLAR

🖇 Derin mimari olarak evrişimsel bir sinir ağı kullandık ve bununla birlikte TensorFlow derin öğrenme kütüphanesini uyguladık. Aşağıdaki deneysel sonuçlar, bilimsel bir Python geliştirme ortamı olan Spyder üzerinde yapıldı. 20.000 görüntü kullanıldı ve batch size 100’e sabitlendi.

🖇 Modellerin doğruluğunun, eğitim verilerinden ziyade test verileri açısından incelenmesi esastır. TensorFlow kullanarakevrişimsel sinir ağını çalıştırmak için, Windows 10 makinesi kullanıldı, donanımın TensorFlow’un CPU sürümüne sahip olan bir 8 GB RAM ‘e sahip olduğu belirtilmiş.

📌 Yineleme sayısı arttıkça eğitim doğruluğu da artar, ancak eğitim süremiz de artar. Tablo 1, elde ettiğimiz doğrulukla sayı çizgisini gösterir.

Number of iterations vs Accuracy

Grafik, birkaç bin tekrarlamadan sonra neredeyse sabite ulaşmıştır. Farklı batch size değerleri farklı sonuçlara yol açabilir. Biz görüntüler için bir batch size değeri 100 olarak belirlenmiştir.

✨ Bu yazıda, önerilen yöntem ile görüntülerin sınıflandırılmasında yüksek doğruluk oranı elde etmiştir. CNN sinir ağı TensorFlow kullanılarak uygulandı. Sınıflandırıcının doğruluğu açısından iyi performans gösterdiği gözlendi. Bununlabirlikte, CPU tabanlı bir sistem kullanıldı. Bu yüzden deney ekstra eğitim süresi aldı, eğer GPU tabanlı bir sistem kullanılsaydı, eğitim süresi kısalırdı. CNN modeli, tıbbi görüntüleme ve diğer alanlarla ilgili karmaşık görüntü sınıflandırma probleminin çözümünde uygulanabilir.

REFERANSLAR

  1. https://www.researchgate.net/figure/Artificial-neural-network-architecture-ANN-i-h-1-h-2-h-n-o_fig1_321259051.
  2. Hinton, G. E., & Salakhutdinov, R. R. (2006). Reducing the dimensionality of data with neural networks. science, 313(5786), 504- 507.
  3. Yoshua Bengio, “Learning Deep Architectures for AI”, Dept. IRO, Universite de Montreal C.P. 6128, Montreal, Qc, H3C 3J7, Canada, Technical Report 1312.
  4. Yann LeCun, Yoshua Bengio & Geoffrey Hinton, “Deep learning “, NATURE |vol 521 | 28 may 2015
  5. Yicong Zhou and Yantao Wei, “Learning Hierarchical Spectral–Spatial Features for Hyperspectral Image Classification”,IEEE Transactions on cybernetics, Vol. 46, No.7, July 2016.
Featured Image

Yapay Zekaya Adım Adım Yolculuk

Makine öğrenimi (ML), deneyim yoluyla otomatik olarak gelişen bilgisayar algoritmalarının incelenmesidir [1]. Wikipedia’ ya göre ise makine öğrenimi, bilgisayarların, açıkça programlanmadan görevleri nasıl gerçekleştirebileceklerini keşfetmelerini içerir [2]. Yapay Zeka denilince çoğunuzun aklına ilk gelen şey kuşkusuz görselde gördüğünüz gibi robotlar gelmektedir. Bugün makine öğrenimi ve yapay zekanın temelleri seviyesinde ilgili kursları sizler için araştırdım ve en çok memnun kaldığım DataCamp ve Coursera kurslarını burada listeleyeceğim.

DataCamp Kursları

💠 Image Processing with Keras in Python:  Bu kurs boyunca CNN ağları nasıl inşa edileceği, eğitileceği ve değerlendirileceği öğretilecektir. Verilerden öğrenme yeteneklerinin nasıl geliştirileceğini ve eğitimin sonuçlarını nasıl yorumlanacağı öğretilecektir.
Kursa gitmek için tıklayın 🔗

💠 Preprocessing for Machine Learning in Python:  Verilerinizi, modeliniz için doğru biçimde olacak şekilde standartlaştırmayı, veri kümenizdeki bilgilerden en iyi şekilde yararlanmak için yeni özellikler oluşturmayı ve model uyumunuzu iyileştirmek için en iyi özellikleri seçmeyi öğreneceksiniz.
Kursa gitmek için tıklayın 🔗 

💠 Advanced Deep Learning with Keras: Hem sınıflandırma hem de regresyon yapan bir ağı eğiterek çok yönlü keras işlevsel API’sini kullanarak çeşitli problemleri nasıl çözeceğinizi gösterir.
Kursa gitmek için tıklayın 🔗

💠 Introduction to TensorFlow in Python: Bu derste, tensorflow 2.3’ü, öneri sistemleri, görüntü sınıflandırması ve Fintech’teki önemli ilerlemelere güç veren modellerle geliştirmek, eğitmek ve tahminler yapmak için kullanacaksınız. Hem 15 satırlık kodda derin öğrenme modelleri tasarlamanıza ve eğitmenize izin verecek üst düzey API’leri hem de hazır rutinlerin ötesine geçmenize izin verecek düşük seviyeli API’leri öğreneceksiniz.
Kursa gitmek için tıklayın 🔗

💠 Introduction to Deep Learning with PyTorch: PyTorch, aynı zamanda hem güçlü hem de kullanımı kolay olan önde gelen derin öğrenme çerçevelerinden biridir. Bu derste, MNIST veri kümesinden rakamları tahmin etmek için ilk sinir ağınızı oluşturmadan önce sinir ağlarının temel kavramlarını öğrenmek için Pytorch’ u kullanacaksınız. Daha sonra CNN hakkında bilgi edinecek ve daha doğru sonuçlar veren daha güçlü modeller oluşturmak için kullanacaksınız. Sonuçları değerlendirecek ve bunları geliştirmek için farklı teknikler kullanacaksınız.
Kursa gitmek için tıklayın 🔗

💠 Supervised Learning with scikit-learn: 

  • Classification
  • Regression
    • Fine-tuning your model
    • Preprocessing and pipelines

Kursa gitmek için tıklayın 🔗

💠 AI Fundamentals:

  • Introduction to AI
  • Supervised Learning
    • Unsupervised Learning
    • Deep Learning & Beyond

Kursa gitmek için tıklayın 🔗


Coursera Kursları

💠 Machine Learning: Classification, University of Washington: 

  • Hem ikili hem de çok sınıflı sınıflandırma problemlerinin çözümü
  • Boosting kullanarak herhangi bir modelin performansını artırımı
  • Stokastik gradyan yükselişi ile yöntem ölçeklendirme
  • Eksik verileri işleme teknikleri kullanımı
  • Hassas hatırlama metrikleri kullanılarak model değerlendirme

Kursa gitmek için tıklayın 🔗 

💠 AI For Everyone, deeplearning.ai:  

  • Gerçekçi AI ne olabilir ne olamaz?
  • Kendi kuruluşunuzdaki sorunlara yapay zeka uygulamak için fırsatlar nasıl belirlenir?
  • Makine öğrenimi ve veri bilimi projeleri oluşturmak nasıl bir şeydir?
  • Bir AI ekibi ile nasıl çalışır ve şirketinizde bir AI stratejisi nasıl oluşturulur?
  • Yapay zeka ile ilgili etik ve sosyal tartışmalarda nasıl gezinilir?

Kursa gitmek için tıklayın 🔗 

💠 AI for Medical Diagnosis, deeplearning.ai: 

  • Ders 1’de, akciğer ve beyin bozukluklarını teşhis etmek için konvolüsyonel sinir ağı görüntü sınıflandırması ve segmentasyon modelleri oluşturacaksınız.
  • Ders 2’de, hasta prognozunu belirlemek için istatistiksel yöntemler ve rastgele bir orman belirleyicisi kullanarak kalp hastalığı için risk modelleri ve sağkalım tahmincileri oluşturacaksınız.
  • Ders 3’te, bir tedavi etkisi belirleyicisi oluşturacak, model yorumlama tekniklerini uygulayacak ve radyoloji raporlarından bilgi almak için doğal dil işleme kullanacaksınız.

Kursa gitmek için tıklayın 🔗
Yapay zeka öğrenirken öncelikli adımlar olarak Yüksek Lisans dönemimde Yapay Sinir Ağları ve Örüntü Tanıma derslerini aldım. Bu alanlar ile ilgili projeler geliştirdim ve bu projeleri sunma fırsatım oldu. Böylelikle bildiklerimi aktarırken kendime daha çok şey kattığımı fark ettim. Bu yazıda özet olarak öğrenmeniz gereken DataCamp ve Coursera kurslarından bahsettim. Bunlardan önce Machine Learning Crash Course‘ u da bitirmenizi şiddetle tavsiye ediyorum.

REFERANSLAR

  1. Mitchell, Tom (1997). Machine Learning. New York: McGraw Hill. ISBN 0-07-042807-7. OCLC 36417892.
  2. From Wikipedia, The free encyclopedia, Machine learning, 19 November 2020.
  3. DataCamp, https://learn.datacamp.com.
  4. Coursera, https://www.coursera.org.

Makine Öğrenimi İçin Veri Etiketleme Araçları

Verilerin etiketlenmesi işlemi, gözetimli herhangi bir makine öğrenimi projelerinde çok önemli bir adımdır. Etiketleme, bir görüntüdeki alanları tanımlama ve bu bölgeler için hangi nesneye ait ise o nesnenin açıklamalarının oluşturulduğu işlemidir. Verilerin etiketlenmesi ile hem verilerimizi ML projelerine hazırlamış oluyoruz hem de onları daha okunabilir kılıyoruz. Çalıştığım projelerin çoğunda veri setindeki kümeleri oluştururken yeri geldi kendim etiketlemeler yaptım yeri geldi etiketlenmiş görüntüler ile eğitim işlemimi gerçekleştirdim. Bu yazıda sizler ile bu alanda tecrübelerimi paylaşarak en çok karşılaştığım veri etiketleme araçlarını tanıtacağım.
Labeling Image

📍COLABELER

Colabeler, konumlandırma ve sınıflandırma problemlerinde etiketleme yapmayı sağlayan programdır. Bilgisayarlı görü, doğal dil işleme, yapay zekâ ve ses tanıma alanlarında sıkça kullanılan bir etiketleme programıdır [2]. Aşağıda gördüğünüz görsel örnek bir görüntü etiketlenmesini göstermektedir. Burada gördüğünüz sınıflar genellikle araba (car) sınıfına denk gelmiştir. Sol tarafta gördüğünüz araç bölümünde nesneleri eğri, poligon veya dikdörtgen olarak sınıflandırmanız mümkündür. Bu seçim etiketlemek istediğiniz verinin sınırlarına göre değişebilmektedir.
 

Labeling Colabeler
Ardından ‘Label Info’ yazan bölümde kendiniz etiketlemek istediğiniz nesnelerin ismini yazıyorsunuz. Tüm etiketlemeleri bitirdikten sonra mavi tik olan butondan onaylayarak kaydediyorsunuz. Ve böylelikle bir sonraki görüntüye Next ile geçebiliyorsunuz. Burada dikkat etmemiz gereken nokta, kaydettiğimiz her görüntü bu mavi butonun soluna sıralanmaktadır. Bu şekilde kaydettiğiniz görüntüleri de kontrol etmeniz mümkündür. Colabeler’ın en çok sevdiğim yanlarından bir tanesi içerisinde yapay zeka algoritmalarını da kullanılabilir olmasıdır. 
📌 Daha önce çalıştığım bir projede Colabeler üzerinden etiketleme gerçekleştirdim ve inanılmaz kolay bir arayüze sahip bir yazılımdır.
📽 Colabeler’ ın yetkili web sitelerinde yer alan videoda etiketlemelerin nasıl yapılacağı açıklanmıştır.
Localization of Bone Age
Daha önce çalıştığım projenin örnek bir görüntüsünü yukarıda verdim. Bu proje, makine öğrenimi bağlamında yerelleştirme (localization) projesi olduğu için bu özelliklere bağlı kalınarak etiketleme yapılmıştır. Yerelleştirme, bir özelliğin bulunduğu görüntünün alt bölgesini izole etmek anlamına gelir. Örneğin, bu proje için kemik bölgelerinin tanımlanmaya çalışılması yalnızca görüntüdeki kemik bölgelerinin etrafında dikdörtgenler oluşturmak anlamına gelir [3]. Bu şekilde kemik görüntülerinde çıkarılması muhtemel sınıfları ROI bölgesi olarak etiketlemiş oldum. Ardından bu etiketleri Colabeler’ın sağladığı Export XML/JSON olarak elde ettim. Bu kısım birçok makine öğrenimi çalışanlarının hoşuna gidecektir, benim çok işime yaramıştı!

♻️ Etiketlerin Dışarıya Aktarılması

Exporting JSON Output
Bu aşamada ben JSON veriler kullanacağım için JSON çıktısı olarak kayıt etmiştim, siz verilerinizi farklı formatlarda kayıt edebilirsiniz. Aşağıda verdiğim görselde ise oluşturduğum sınıfların JSON çıktısındaki yerlerini görmektesiniz. Bu şekilde verileriniz etiketli bir şekilde hazırlanmış oldu.
JSON Format

📍ImageJ

ImageJ, Ulusal Sağlık Enstitüleri ve Optik Hesaplamalı Enstrümantasyon Laboratuvarı’nda (LOCI, Wisconsin Üniversitesi) geliştirilen Java tabanlı bir görüntü işleme programıdır. Imagej’in eklenti mimarisi ve yerleşik geliştirme ortamı, görüntü işlemeyi öğretmek için popüler bir platform haline getirmiştir [3].

Yukarıda yer verdiğim şekilde Wikipedia içerisinde ImageJ’den alınmış bir ekran görüntüsünü görmektesiniz. Görüldüğü gibi bu yazılım aşırı kompleks bir tarafı mevcut değildir. Birçok alanda meslek fark etmeksizin kullanılmakta olan bir araçtır.
📝 ImageJ’ in yetkili web sitelerinde yer alan kullanım kılavuzu olarak verilen dokümantasyonda etiketlemelerin nasıl yapılacağı ve yazılım aracının nasıl kullanılacağı açıklanmıştır.
📌 Makine öğrenimi projesinde etiketlemek zorunda kaldığım görüntüler için Fiji-ImageJ yazılım araçlarına da uğramışlığım vardır. Arayüzü diğer çalıştığım etiketleme programlarına göre çok daha eski kalmış durumda diye düşünüyorum. Yazılımsal açıdan yapmak istediğiniz işlemleri gerçekleştirebilirsiniz elbette, ancak bana göre bir yazılımın kullanıcıyı tasarımsal açıdan da doyurması gerekmektedir.
Image Toolbox Matlab
Yukarıda verdiğim görsel kişisel bilgisayarımda çalıştığım proje sırasında aldığım bir ekran görüntüsü idi. Matlab platformunda çalışırken verileri aktif edebilmek için öncellikle güncelleme yapmak gerekiyordu. Bu sebeple güncelleme yaptıktan sonra görüntüleri tanımlamaya devam ettim. ImageJ kullanıcıları için Matlab eklentisinin kurulması sırasında yüklenecek paket aşağıda verilmektedir.
ImageJ Matlab

📍Matlab Image Labeler

Image Labeler uygulaması, bir video veya görüntü dizisinde dikdörtgen ilgi alanı (ROI) etiketlerini, polyline ROI etiketlerini, piksel ROI etiketlerini ve sahne etiketlerini işaretlemenin kolay bir yolunu sunar. Örnek olması için bu uygulamayı kullanarak size göstererek başlamış olur [4]:

  • Bir resim koleksiyonundan bir resim çerçevesini el ile etiketleme
  • Bir Otomasyon algoritması kullanarak görüntü çerçeveleri arasında otomatik olarak etiketleme
  • Etiketli lokasyon gerçeği verilerini dışa aktarma

Image Toolbox Matlab
Yukarıda gördüğünüz görselde Matlab Image Labeler yazılımını kullanarak segmentasyon işlemi yapabiliyoruz. Daha doğrusu verileri ROI bölgelerine ayırarak etiketleme yapmamız mümkündür. Ayrıca, daha önce var olan algoritmaları kullanmanız mümkün olduğu gibi kendinize ait algoritmanızı da veriler üzerinde test edip çalıştırabiliyorsunuz.
Selection ROI
Matlab’ın yetkili dokümantasyonundan aldığım bu görselde sol menüde seçtiğiniz sınırlayıcı bölgelerin etiket isimleri girilmektedir. Nesnenin sınıfına göre bir etiket rengi atanmaktadır. Bu şekilde etiketlerimizi oluşturmamız da oldukça mümkün. Bir sonraki yazıda ise diğer etiketleme araçlarından bahsedeceğim. Görüşmek dileğiyle ✨

REFERANSLAR
  1. https://medium.com/@abelling/comparison-of-different-labelling-tools-for-computer-vision-f3afd678da76.
  2. http://www.colabeler.com.
  3. From Wikipedia, The Free Encyclopedia, ImageJ, https://en.wikipedia.org/wiki/ImageJ.
  4. MathWorks, Get Started with the Image Labeler, https://www.mathworks.com/help/vision/ug/get-started-with-the-image-labeler.html.
  5. https://chatbotslife.com/how-to-organize-data-labeling-for-machine-learning-approaches-and-tools-5ede48aeb8e8.
  6. https://blog.cloudera.com/learning-with-limited-labeled-data/.