CNN regresyon mimarileri?


32

Girişin bir görüntü olduğu ve etiketin 80 ile 350 arasında sürekli bir değer olduğu bir regresyon problemi üzerinde çalışıyorum. Bir reaksiyon gerçekleştikten sonra görüntüler bazı kimyasallara sahip. Ortaya çıkan renk, geride kalan başka bir kimyasal maddenin konsantrasyonunu gösterir ve modelin çıktısı budur - o kimyasal maddenin konsantrasyonu. Görüntüler döndürülebilir, çevrilebilir, yansıtılabilir ve beklenen çıktı yine aynı olmalıdır. Bu tür analizler gerçek laboratuvarlarda yapılır (çok özel makineler tıpkı bu modeli yapmak için eğittiğim gibi renk analizini kullanarak kimyasalların konsantrasyonunu verir).

Şimdiye kadar sadece kabaca VGG'ye dayanan modeller denedim (çok sayıda conv-conv-conv-pool blokları dizisi). Daha yeni mimarileri (Inception, ResNets, vb.) Denemeden önce, görüntüleri kullanarak regresyon için daha sık kullanılan başka mimariler olup olmadığını araştırmayı düşündüm.

Veri kümesi şöyle görünür:

görüntü tanımını buraya girin

Veri seti, 64x64'e yeniden boyutlandırdığım yaklaşık 5.000 250x250 örnek içerir, böylece eğitim daha kolaydır. Gelecek vaad eden bir mimari bulduğumda daha büyük çözünürlükte görüntüler deneyeceğim.

Şimdiye kadar, en iyi modellerim, kullanım durumumda kabul edilebilir olmaktan çok uzak olan, yaklaşık 0.3 olan hem eğitim hem de validasyon setlerinde ortalama bir karesel hataya sahipti.

Şimdiye kadarki en iyi modelim şuna benziyor:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

Soru

Bir görüntü girişinden regresyon çıktısı için uygun bir mimari nedir?

Düzenle

Açıklamamı iptal ettim ve doğruluktan bahsettim.

Düzenle 2

Sorumu yeniden yapılandırdım, umarım neyin peşinde olduğum açıktır.


4
Doğruluk, doğrudan regresyon problemlerine uygulanabilecek bir ölçü değildir. Doğruluğunun% 30 olduğunu söylerken ne demek istiyorsun? Doğruluk gerçekten sadece sınıflandırma görevleri için geçerlidir, gerileme değil.
Nükleer Wang,

1
Ne demek "zamanın% 30'unu doğru tahmin etmek" ? Gerçekten regresyon mu yapıyorsun?
Firebug

1
Neden bu soruna regresyon diyorsunuz? Etiketlere sınıflandırmaya çalışmıyor musunuz? etiketler kardinal mi?
Aksakal,

2
Vgg ile aynı şeyi istemiyorum. Ben vgg benzeri bir şey yapıyorum, bir dizi convs, ardından en fazla havuzlamayı takip ediyor, ardından tamamen bağlı. Resimlerle çalışmak için genel bir yaklaşım gibi görünüyor. Ama sonra tekrar, asıl sorumun asıl amacı bu. Tüm bu yorumlar gibi görünüyor, içgüdüsel olmasına rağmen, ilk olarak ne istediğimi tamamen özlüyorum.
rodrigo-silveira 16: 46'da

1
Ayrıca, sorunun daha iyi bir tanımını verirseniz daha iyi yardım sağlayabiliriz. 1) Görüntüler nelerdir? Çözünürlükleri nedir? resimleriniz arasında ne ilişki var ? Ben keyfi bir açıyla ederek dairesel görüntüyü döndürmek eğer bu ilişki rotasyon değişmeyen, yani midir , ben bekliyoruz değişikliğine? 2) VGG-net mimarisini geliştirmek için 5000 görüntünün bir sefalet olduğunu biliyor musunuz? Mimarinizin parametre sayısını hesapladınız mı? Daha fazla resim çekmenin bir yolu var mı? y[80,350]θy
Yapamazsan

Yanıtlar:


42

Öncelikle genel bir öneri: aşina olmadığınız bir konuyla ilgili deney yapmaya başlamadan önce bir literatür taraması yapın. Kendine çok zaman kazandıracaksın.

Bu durumda, mevcut evraklara baktığımda fark etmiş olabilirsiniz

  1. CNN'ler regresyon için birçok kez kullanılmıştır: bu bir klasiktir ancak eskidir (evet, DL'de 3 yaşında). Daha modern bir makale, bu görev için AlexNet'i kullanmazdı. Bu daha yeni, ama çok daha karmaşık bir sorun için (3D döndürme) ve zaten buna aşina değilim.
  2. CNN'lerle regresyon önemsiz bir problem değildir. Yine ilk makaleye bakıldığında, temelde sonsuz veri üretebilecekleri bir sorun olduğunu göreceksiniz. Amaç, 2B görüntüleri düzeltmek için gereken dönüş açısını tahmin etmektir. Bu, temel olarak egzersiz setimi alıp her görüntüyü keyfi açılarla döndürerek büyütebildiğim anlamına gelir ve geçerli, daha büyük bir egzersiz seti elde edeceğim. Bu nedenle, problem Derin Öğrenme problemleri giderken oldukça basit görünüyor. Bu arada, kullandıkları diğer veri artırma püf noktalarına dikkat edin:

    Çeviriler (görüntü genişliğinin% 5'ine kadar), [−0.2, 0.2] aralığında parlaklık ayarı, γ ∈ [−0.5, 0.1] ile gamma ayarı ve [0 aralığında standart sapma ile Gauss piksel piksel gürültüsü kullanıyoruz. , 0.02].

    Sorununuzu, fotoğraflarınız için pozisyonda, parlaklıkta ve gama gürültüsünde, laboratuarda dikkatlice çekilmiş durumdaki farklılıkları dikkate almanın mantıklı olup olmadığını söyleyecek kadar iyi bilmiyorum. Ancak, her zaman deneyebilir ve sınama kümesi kaybınızı iyileştirmiyorsa kaldırabilirsiniz. Aslında, gerçekten bir doğrulama kümesi kullanmak gerekir veya Ayarlarınızı tanımladıktan kadar test seti kaybı temsilcisi olmak istiyorsanız, deneyler bu tür çapraz doğrulama kat ve test seti bakma genelleme hatası.k

    Her neyse, ideal koşullarda bile, saf yaklaşım bu kadar işe yaramadı (bölüm 4.2 ). Bunlar, çıktı tamponu (SoftMax katman) soyulmuş, sinüs tahmin edebilen iki birime sahip bir tabaka ile ikame ve kosinüs dönme açısının. Gerçek açı daha sonra olarak hesaplanır . Sinir ağı, ImageNet'te de önceden tanımlandı (buna transfer öğrenme denir).yxα=atan2(y,x)). Elbette ImageNet'teki eğitim farklı bir görevdi (sınıflandırma), ancak sinir ağını sıfırdan eğitmek, yayınlamamaya karar verdikleri korkunç sonuçlar vermiş olmalı. Böylece, iyi bir omlet yapmak için tüm malzemelere sahiptiniz: potansiyel olarak sonsuz antreman verileri, önceden belirlenmiş bir ağ ve basit bir regresyon problemi (-1 ile 1 arasında iki rakamı tahmin et). Yine de, bu yaklaşımla elde edebileceklerinin en iyisi 21 ° hataydı. Bunun bir RMSE hatası, bir MAD hatası veya ne olduğu açık değil, ancak yine de büyük değil: Yapabileceğiniz maksimum hata 180 ° olduğundan, ortalama hata, olası maksimum hatanın 11'idir. Seri olarak iki ağ kullanarak biraz daha iyi yaptılar: ilki sınıflandırma yapacaktı (açının açılıp açılmadığını tahmin etmek).>11%[180°,90°],[90°,0°],[0°,90°] veya sınıf), sonra görüntü, ilk ağ tarafından tahmin edilen miktarla döndürülür aralığında son ilave rotasyonu öngörecek olan başka bir sinir ağına (bu kez regresyon için) beslenecektir .[90°,180°][45°,45°]

    Çok daha basit (döndürülmüş bir MNIST) probleminde, daha iyi bir şey elde edebilirsiniz , ancak yine de mümkün olan maksimum hatanın olan bir RMSE hatasının altına gitmiyorsunuz .2.6%

Peki, bundan ne öğrenebiliriz? Her şeyden önce, bu 5000 görüntü, göreviniz için küçük bir veri kümesidir. İlk makale, regresyon görevini öğrenmek istedikleri görüntüye benzeyen görüntüler üzerine bir ağ kullandı: yalnızca mimarinin tasarlandığı görevden farklı bir görev öğrenmeniz yeterli (sınıflandırma), ancak eğitim setiniz Bu ağların genellikle eğitildiği eğitim setleri gibi hiçbir şeye bakma (CIFAR-10/100 veya ImageNet). Bu yüzden muhtemelen transfer öğrenmeden hiçbir fayda alamayacaksınız. MATLAB örneğinde 5000 imge vardı, fakat siyah beyazlardı ve anlamsal olarak hepsi birbirine çok benziyordu (bu sizin durumunuz için de olabilirdi).

O zaman 0,3'ten daha gerçekçi ne kadar iyidir? Her şeyden önce 0.3 ortalama zararla ne demek istediğinizi anlamanız gerekir. RMSE hatasının 0.3 olduğunu mu demek istiyorsun?

1Ni=1N(h(xi)yi)2

burada , antrenman setinizin büyüklüğüdür (yani, ), , görüntüsü için ve , kimyasalın ilgili konsantrasyonudur? beri tahminlerini 80 ile 350 arasında varsayarsak (veya onları bu aralığa sığdırmak için bir logit kullanırsınız), den daha az hatayla karşılaşırsınız. Cidden, ne bekliyorsunuz? Bana büyük bir hata gibi görünmüyor.NN<5000h(xi)xiyiyi[80,350]0.12%

Ayrıca, ağınızdaki parametrelerin sayısını hesaplamaya çalışın: Acelem var ve saçma sapan hatalar yapıyorum, bu nedenle summarykullandığınız çerçeveden bazı fonksiyonlarla hesaplamalarımı iki kez kontrol edin . Ancak, kabaca var diyebilirim

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(not, toplu iş norm katmanlarının parametrelerini atladığımı unutmayın, ancak katman için sadece 4 parametredir, bu yüzden bir fark yaratmazlar). Yarım milyon parametreniz ve 5000 örneğiniz var ... ne bekliyorsunuz? Elbette, parametre sayısı sinir ağının kapasitesi için iyi bir gösterge değil (tanımlanamayan bir model), ama yine de ... Bundan daha iyisini yapabileceğini sanmıyorum ama bir deneyebilirsin bazı şeyler:

  • tüm girişleri normalleştirin (örneğin, her pikselin RGB yoğunluğunu -1 ile 1 arasında yeniden ölçeklendirin veya standardizasyon kullanın) ve tüm çıktıları. Bu özellikle yakınsama sorunlarınız varsa yardımcı olacaktır.
  • gri tonlamaya gitme: bu, giriş kanallarınızı 3'ten 1'e düşürür. Tüm resimleriniz (yüksek derecede eğitimsiz gözlerime) nispeten benzer renklere sahip görünüyor. Eğer bunu tahmin geçmek için yeterli olduğunu rengi olduğundan emin misiniz , ve daha koyu veya daha parlak alanların varlığı? Belki de eminiz (uzman değilim): bu durumda bu öneriyi atlayın.y
  • veri büyütme: Çevirme, isteğe bağlı bir açıyla döndürme veya resimlerinizi yansıtma aynı çıktıya yol açması gerektiğini söylediğiniz için, veri kümenizin boyutunu çok artırabilirsiniz . Daha büyük bir veri kümesiyle, eğitim setindeki hatanın artacağını unutmayın: Burada aradığımız şey, eğitim seti kaybı ile test seti kaybı arasındaki daha küçük bir boşluktur. Ayrıca, eğer eğitim seti kaybı çok artarsa, bu iyi bir haber olabilir: bu, daha büyük bir eğitim seti için daha fazla bir ağ kurmayı fazla takma riski olmadan eğitebileceğiniz anlamına gelebilir. Daha fazla katman eklemeyi deneyin ve şimdi daha küçük bir eğitim seti ve test seti kaybı alıp almadığınızı görün . Son olarak, başvurunuz bağlamında mantıklı geliyorsa , yukarıda alıntı yaptığım diğer veri artırma püf noktalarını de deneyebilirsiniz .
  • sınıflandırma-sonra-regresyon hilesini kullanın: ilk ağ yalnızca , vb. gibi 10 birinde olup olmadığını belirler . Sonra ikinci bir ağ düzeltmesini hesaplar : merkezleme ve normalleştirme burada da yardımcı olabilir. Denemeden söyleyemem.y[80,97],[97,124][0,27]
  • vintage yerine modern bir mimari (Inception veya ResNet) kullanmayı deneyin. ResNet aslında VGG-net'ten daha az parametreye sahiptir. Tabii ki, burada küçük ResNets kullanmak istersiniz - ResNet-101'in 5000 görüntü veri setinde yardımcı olabileceğini sanmıyorum. Yine de veri setini genişletebilirsiniz.
  • Çıktınız rotasyon için değişmez olduğu için, başka bir harika fikir , çıktısı (sınıflandırıcılar olarak kullanıldığında) ayrık rotasyonlar için değişmez olan ya da yönlendirilebilir CNN'lerin değişmez olduğu grup eşdeğer CNN'leri kullanmak olacaktır.çıkışı sürekli dönmeler için değişmez. Değişmezlik özelliği, daha az veri büyütme ile iyi sonuçlar elde etmenize izin verir veya ideal olarak hiç yok (rotasyonları ilgilendiren şeyler için: tabii ki hala diğer da türlerine ihtiyacınız var). Grup eşdeğer CNN'leri uygulama açısından yönlendirilebilir CNN'lerden daha olgundur, bu yüzden önce grup CNN'lerini deneyeceğim. Sınıflandırma bölümü için G-CNN'yi kullanarak sınıflandırma-sonra-regresyonu deneyebilir veya saf regresyon yaklaşımını deneyebilirsiniz. Üst tabakayı buna göre değiştirmeyi unutmayın.
  • parti büyüklüğü ile deneme (evet, evet, hiperparametrelerin hacklenmesinin hoş olmadığını biliyorum, ancak bu sınırlı bir zaman dilimi içinde bulabileceğiniz en iyisidir ve bedava :-)
  • Son olarak, özellikle küçük veri setleri ile doğru tahminler yapmak için geliştirilmiş mimariler var. Birçoğu dilate konvolüsyonlar kullandı : ünlü bir örnek, karma ölçekli yoğun konvolüsyonel sinir ağıdır . Ancak uygulama önemsiz değil.

3
Detaylı cevap için teşekkür ederim. Zaten önemli veri büyütme işlemi yapıyordum. Başlangıç ​​modelinin birkaç varyantını denedim (varyasyon, filtre sayısının tüm model boyunca eşit olarak ölçeklendirildiği anlamına gelir). İnanılmaz gelişmeler gördüm. Hala gitmek için bir yol var. Bir kaç öneriyi deneyeceğim. Tekrar teşekkürler.
rodrigo-silveira

@ rodrigo-silveira Bir şey değil, nasıl olduğunu bilmeme izin ver. Belki de sonuç çıkınca sohbette konuşabiliriz.
DeltaIV

1
Harika cevap, daha fazlasını hak ediyor ^
Gilly

1
Çok iyi bestelenmiş!
Karthik Thiagarajan

1
Eğer yapabilseydim, bunun için 10 bin puan veririm. Şaşırtıcı cevap
Boppity Bop
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.