Sinir ağını regresyon için eğitmek her zaman ortalamayı öngörür


9

Ben görev bir görüntüde bir kutu (x, y) konumunu tahmin etmektir regresyon için basit bir evrişimsel sinir ağı, örneğin:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Ağın çıktısında biri x, diğeri y için olmak üzere iki düğüm vardır. Ağın geri kalanı standart bir evrişimli sinir ağıdır. Kayıp, kutunun öngörülen konumu ile yer gerçeği konumu arasındaki standart ortalama kare hatasıdır. Bu görüntülerin 10000'i üzerinde eğitim alıyorum ve 2000'de onaylıyorum.

Yaşadığım sorun, önemli bir eğitimden sonra bile, kaybın gerçekten azalmamasıdır. Ağın çıkışını gözlemledikten sonra, ağın her iki çıkış düğümü için sıfıra yakın değerlere eğilim gösterdiğini fark ettim. Bu nedenle, kutunun konumunun tahmini her zaman görüntünün merkezidir. Tahminlerde bir miktar sapma var, ama her zaman sıfır civarında. Aşağıda kaybı gösterir:

resim açıklamasını buraya girin

Bunu bu grafikte gösterilenden daha fazla dönem için çalıştırdım ve kayıp hala azalmıyor. İlginçtir ki, kayıp aslında bir noktada artar.

Yani, ağın iyi bir uyum öğrenmek yerine sadece eğitim verilerinin ortalamasını tahmin ettiği görülüyor. Bunun neden olabileceğine dair bir fikrin var mı? Adam'ı başlangıç ​​öğrenme oranı 0,01 ve relus'u aktivasyon olarak optimize edici olarak kullanıyorum


Eğer benim kod (Keras) bazı ilgileniyorsanız, aşağıda:

# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))


# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)

Görüntüler gerçek örneklerinizin en iyi örneklerinde mi? Bu 5 ayrı örnek mi? Görüntülerde genellemeye yardımcı olacak hiçbir bilgi yok gibi görünüyor. Yani, beyaz karenin x, y konumunu bulmak için nöral bir ağa ihtiyacınız yok, sadece görüntüyü ayrıştırabilir ve beyaz bir piksel arayabilirsiniz. Bu model için vizyonunuz hakkında biraz daha bilgi verin. Bir sonraki konumu tahmin ettiğiniz geçici bir kalıp var mı?
photox

Merhaba ve evet, görüntüler 5 ayrı örnektir. Sizin için nasıl oluşturulduğundan emin değilim, ancak 5 ayrı kare resim olmalılar (yardımcı olması için düzeni biraz değiştirdim ...). Evet, bu görev için bir sinir ağına ihtiyacınız olmadığının farkındayım, ancak sinir ağı ile regresyonun nasıl yapılacağını öğrenmeme yardımcı olan sadece bir test deneyi. Genelleştirmeye yardımcı olacak hiçbir bilgi olmadan ne demek istediğini anlamıyorum .... Her eğitim çifti bir kare görüntüden ve karenin (x, y) konumunun iki boyutlu bir vektöründen oluşur. Thanks :)
Karnivaurus

1
1) İlk dönüşüm katmanındaki giriş şekliniz 3 (rbg) kanal kullanıyor, ancak verileriniz gri tonlamalı (1 kanal) 2) Pek çok dönüşüm katmanına ve filtreye ihtiyacınız yok, aslında tek bir katman olduğunu düşünüyorum ve bir avuç küçük çekirdek iyi olacak.
photox

Görüntülerin gerçekten hedefleri karşıladığından emin misiniz?
user31264

1
@Photox'ın dediği gibi, conv katmanlarına ihtiyacınız yok. Bunları eklemek, optimize edicinin iyi bir çözüm bulmasını zorlaştırır. Eğer 3 katlı katmanı kaldırırsanız "modelinizin" çalışacağından şüphelenirim.
Pieter

Yanıtlar:


8

Optimize edici (alt) optimal bir çözümle birleşemez. Neden? Sorununuz çok kolay ve / veya modeliniz çok karmaşık.

Çok kolay problem

@Photox'un daha önce de belirttiği gibi, bu problem sadece tek bir gizli katman ile çözülebilir. Hatta gizli bir katman olmadan yapılabileceğinden şüpheleniyorum. Çünkü bu problem doğrusal olarak ayrılabilir .

Bunu açıklayayım. Gizli katmanlar ve doğrusal bir aktivasyon fonksiyonu olmayan bir sinir ağı düşünün (buna doğrusal regresyon da diyebilirsiniz). Karenin x konumunu hesaplamak için her piksel x çıkışına bağlanır. İlk piksel sütunu ağırlık ile bağlanır . İkinci sütun ağırlık ile bağlanır . Bu , ağırlığına bağlı olan son sütuna (örn. Sütun ) kadar devam eder . Bazı pikseller sıfır olmadığından, çıkışın aktivasyonu karenin x koordinatına doğrusaldır. Böylece, doğrusal bir fonksiyon karenin yerini hesaplayabilir.1/width2/widthnn/width

Birkaç çözüm var:

  • Daha zor bir sorun seçin, örneğin resim sınıflandırması
  • Gürültü ekleyin, örneğin tuz ve karabiber veya beyaz gürültü
  • Sorunu daha da zorlaştırın, örneğin arka planda çok sayıda farklı renkli daire varken kırmızı bir karenin konumunu tahmin ederek

Çok karmaşık model

Modelinizde, optimize edicinin tatlı bir optimum bulmasına yardımcı olmazken çok fazla karmaşıklık katan birkaç parça vardır.

Örneğin, evrişimli katmanlar. İlk kat, boyutunda 32 evrişimli filtreye sahiptir . Bu filtrelerin ne öğrenmesini bekliyorsunuz? Görüntü sınıflandırmasında bu filtreler kenarları, köşeleri, degradeleri ve lekeleri tespit etmeyi öğrenir. Ancak bu durumda, mantıklı olan sadece birkaç filtre vardır. Soldan sağa ve tam tersi ve yukarıdan aşağıya ve tam tersi kenarı düşünebilirim. Bu durumda, rastgele gürültü ekleyen yaklaşık 28 filtre vardır. Bunları (veya yalnızca tüm katmanı) silmek, optimize edicinin çalışan bir optimum bulmasını çok daha kolay hale getirir.5×5

Başka bir örnek, birçok ekstra parametreye sahip Adam optimizer'idir. Adam optimizer bu parametrelerle iyi çalışabilir, ancak neden sadece SGDvarsayılan değerlere sahip basit bir optimizer ile başlamıyorsunuz ?

Böylece çeşitli optimizasyonlar yapabilirsiniz:

  • LinearRegressionscikit-learn'dan kullanın . Tamam, istediğin bu değil ama sadece bu modelin ne kadar karmaşık olduğunu göstermek istiyorum.
  • Döngü katmanlarını kaldırma
  • Gizli Densekatmanların boyutunu küçültme
  • Varsayılan SGDoptimize ediciyi kullanma
  • Gizli bir katman kullanıyorsanız, sigmoidetkinleştirmeyi denemelisiniz . Gizli katmanın düğümlerinin her birini, belirli bir konumda bir karenin olup olmadığını algılamak olarak düşünebilirsiniz.
  • Tüm bunlar işe yaramazsa, çok yüksek veya çok düşük olup olmadığını öğrenmek için öğrenme oranı ile biraz deneyin.

ps

Sanırım Adit Deshpande'nin bu blog yayınını beğeneceksin .


Bu çözümlerin optimize edicilerin davranışını değiştirip değiştirmediğini bana bildirin.
Pieter

Teşekkürler, bu çok faydalı. Önerilerinizi denemek için çalışıyorum. Ancak, ilk noktanı anlamıyorum. Neden sorun çok basitse, o zaman daha karmaşık bir soruna göre optimize etmek daha zordur. Belirli bir ağ için, daha basit bir sorunun optimizasyonu neden daha karmaşık bir problemden daha zor olur? Basit bir problemde, çok güçlü gradyanlar ve güçlü bir küresel optimum olacağını düşünürdüm. Ancak ilk noktanız, sorunun basitliğinin optimizasyonu zorlaştırdığını söylüyor, daha karmaşık bir sorunun optimizasyona yardımcı olacağını gösteriyor ...
Karnivaurus

Bunların hiçbirini bu sorunun nedeni olarak almıyorum. "Karmaşık" bir model, daha fazla sığabilme yeteneğine sahip olmalı ve bu nedenle eğitim verilerine uymak için mücadele etmemelidir. "Kolay" bir problemi çözmeyi zorlaştırmamalıyız ... "kolay" zaten göreceli bir terimdir ... belki de sinir ağı mimarisinin verilerindeki sinyali yakalayamadığını söylemek istersiniz, "daha basit" ama temelde farklı bir model olsa da.
JacKeown

> "Neden çok basitse, optimize etmek daha karmaşık bir problemden daha zor." Çünkü karmaşık bir model, kullanmadığı birçok modelleme kapasitesine sahiptir. Bu aşırı kapasite gürültü çıkarır ve gerçek sinyali bulmayı zorlaştırır.
Pieter

> "Bunlardan hiçbirini bu sorunun nedeni olarak satın almıyorum" - Cevaba geri dönersek, pratik bakış açısından yazılırlar. Karmaşık modeliniz düzgün bir şekilde birleşmiyorsa, hata ayıklamanın yollarından biri daha basit bir model kullanmaktır.
Pieter

0

Veri setimle aynı sorunla karşılaşıyorum. Benim durumumda, öngörücülerin çok küçük bir varyansla yüksek derecede konsantre olduğu ortaya çıktı. Tahmin değişkenlerinizin varyansını kontrol etmeli ve nasıl dağıtıldığını görmelisiniz.Tahmin etmeye çalıştığım değişkenin dağılımı

Ancak, çıktı değişkenindeki bazı dönüşümler ölçeğini değiştirmek veya değiştirmek için gerçekleştirilebilir. Bu, daha homojen tipte bir dağılım ile sonuçlanabilir. Örneğin, görüntü tanıma görevlerinde histogram eşitleme veya kontrast geliştirme bazen doğru karar verme lehine çalışır.


-1

Tipik bir aşırı takma problemi gibi görünüyor. Verileriniz daha iyi sonuç almak için yeterli bilgi sağlamıyor. Tren verilerinin tüm nüanslarını hatırlamak için trenle birlikte karmaşık NN'yi seçersiniz . Kayıp asla grafiğinizde olduğu gibi sıfır olamaz. BTW Doğrulamanızın bir hatası olduğu anlaşılıyor veya doğrulama kümesi de doğrulanmadığından doğrulama kümesi iyi değil.


5
Soru, ağın neredeyse her zaman sıfır çıkardığını söylüyor. Bu , aşırı sığdırma değil , ciddi bir yetersizlik durumu olacaktır . Ayrıca, öğrenme eğrisinde eğitim ve doğrulama hatası arasında bir boşluk yoktur, bu da aşırı
sığmanın

-1

Aslında çok benzer bir sorun üzerinde çalışıyordum. Temel olarak, beyaz bir arka plan üzerinde bir sürü nokta vardı ve bir arka plan üzerine yerleştirilen noktayı tanımak için bir NN eğitimi alıyordum. Çalıştığım yol sadece bir tam bağlı nöron tabakasını kullanmaktı (yani 1 katmanlı bir NN). Örneğin, 100x100 görüntü için, doğrudan 2 çıkış nöronuna (koordinatlar) bağlı 10.000 giriş nöronuna (piksel) sahip olurum. PyTorch'ta, piksel değerlerini bir tensöre dönüştürdüğümde, ortalamayı çıkararak ve standart sapmaya bölerek verilerimi otomatik olarak normalleştiriyordu. Normal makine öğrenimi sorunlarında bu iyidir, ancak bir görüntüdeki renkli piksel sayısında bir eşitsizlik olabilen (yani yalnızca birkaç beyaz pikselin olduğu bir görüntü) görüntü için geçerli değildir. Yani, Tüm piksel yoğunluğu değerlerini 255'e bölerek manuel olarak normalleştirdim (bu nedenle, şimdi tüm yoğunluk değerlerini normal bir dağılıma uydurmaya çalışan tipik normalleştirme tekniği olmadan 0-1 aralığındadır). Sonra, hala sorunlar yaşadım çünkü eğitim setindeki piksellerin ortalama koordinatını tahmin ediyordu. Bu yüzden benim çözümüm, neredeyse tüm ML eğitmenlerine ve eğiticilerine karşı öğrenme oranını çok yüksek ayarlamaktı. Çoğu insanın dediği gibi 1e-3, 1e-4, 1e-5 kullanmak yerine stokastik gradyanlı inişte 1 veya 0.1'lik bir öğrenme oranı kullanıyordum. Bu sorunlarımı düzeltti ve ağım sonunda eğitim setimi ezberlemeyi öğrendi. Bir test setini genelleştirmez, ama en azından biraz işe yarıyor, bu da sorunuzda önerdiği diğer herkesten daha iyi bir çözüm. şimdi tüm yoğunluk değerlerini normal bir dağılıma uydurmaya çalışan tipik normalleştirme tekniği olmadan 0-1 aralığındadır). Sonra, hala sorunlar yaşadım çünkü eğitim setindeki piksellerin ortalama koordinatını tahmin ediyordu. Bu yüzden benim çözümüm, neredeyse tüm ML eğitmenlerine ve eğiticilerine karşı öğrenme oranını çok yüksek ayarlamaktı. Çoğu insanın dediği gibi 1e-3, 1e-4, 1e-5 kullanmak yerine stokastik gradyanlı inişte 1 veya 0.1'lik bir öğrenme oranı kullanıyordum. Bu sorunlarımı düzeltti ve ağım sonunda eğitim setimi ezberlemeyi öğrendi. Bir test setini genelleştirmez, ama en azından biraz işe yarıyor, bu da sorunuzda önerdiği diğer herkesten daha iyi bir çözüm. şimdi tüm yoğunluk değerlerini normal bir dağılıma uydurmaya çalışan tipik normalleştirme tekniği olmadan 0-1 aralığındadır). Sonra, hala sorunlar yaşadım çünkü eğitim setindeki piksellerin ortalama koordinatını tahmin ediyordu. Bu yüzden benim çözümüm, neredeyse tüm ML eğitmenlerine ve eğiticilerine karşı öğrenme oranını çok yüksek ayarlamaktı. Çoğu insanın dediği gibi 1e-3, 1e-4, 1e-5 kullanmak yerine stokastik gradyanlı inişte 1 veya 0.1'lik bir öğrenme oranı kullanıyordum. Bu sorunlarımı düzeltti ve ağım sonunda eğitim setimi ezberlemeyi öğrendi. Bir test setini genelleştirmez, ama en azından biraz işe yarıyor, bu da sorunuzda önerdiği diğer herkesten daha iyi bir çözüm.

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.