İyi soru.
Bu fenomenle birkaç kez karşılaştım. İşte gözlemlerim:
Gradyan patlaması
Sebep: Büyük gradyanlar öğrenme sürecini yoldan çıkarır.
Beklemeniz gerekenler: Çalışma zamanı günlüğüne baktığınızda, yineleme başına kayıp değerlerine bakmalısınız. Kaybın yinelemeden yinelemeye önemli ölçüde artmaya başladığını fark edeceksiniz , sonunda kayıp bir kayan nokta değişkeni ile temsil edilemeyecek kadar büyük olacak ve bu hale gelecektir nan.
Ne yapabilirsiniz:base_lr (çözücü.prototxt dosyasında) bir büyüklük sırasıyla (en azından) azaltın . Birkaç kayıp katmanınız varsa, gradyan patlamasından hangi katmanın sorumlu olduğunu görmek için günlüğü incelemeniz loss_weightve genel katman yerine o belirli katman için (in train_val.prototxt) değerini azaltmanız gerekir base_lr.
Kötü öğrenme oranı politikası ve parametreleri
Sebep: caffe geçerli bir öğrenme oranını hesaplayamaz ve alır 'inf'veya 'nan'onun yerine, bu geçersiz oran tüm güncellemeleri çarparak tüm parametreleri geçersiz kılar.
Beklemeniz gerekenler: Çalışma zamanı günlüğüne baktığınızda, öğrenme oranının kendisinin olduğunu görmelisiniz 'nan', örneğin:
... sgd_solver.cpp:106] Iteration 0, lr = -nan
Ne yapabilirsiniz:'solver.prototxt' Dosyanızdaki öğrenme oranını etkileyen tüm parametreleri düzeltin .
Örneğin, kullanırsanız lr_policy: "poly"ve max_iterparametre tanımlamayı unutursanız , sonuçta lr = nan...
Kafede öğrenme oranı hakkında daha fazla bilgi için bu konuya bakın .
Hatalı Kayıp işlevi
Sebep: Bazen kayıp katmanlarındaki kayıp hesaplamaları nans görünmesine neden olur . Örneğin, InfogainLossnormalize edilmemiş değerlere sahip Besleme katmanı, hatalarla özel kayıp katmanı kullanma vb.
Beklemeniz gerekenler: Çalışma zamanı günlüğüne baktığınızda muhtemelen olağandışı bir şey fark etmeyeceksiniz: kayıp yavaş yavaş azalıyor ve aniden bir nanbeliriyor.
Ne yapabilirsiniz: Hatayı yeniden üretip üretemeyeceğinizi görün, çıktıyı kayıp katmanına ekleyin ve hatayı ayıklayın.
Örneğin: Bir keresinde cezayı bir partide etiket oluşma sıklığına göre normalleştiren bir kayıp kullandım. Öyle oldu ki, eğitim etiketlerinden biri partide hiç görünmüyorsa - hesaplanan kayıp nans. Bu durumda, yeterince büyük partilerle çalışmak (setteki etiketlerin sayısına göre) bu hatayı önlemek için yeterliydi.
Hatalı giriş
Sebep:nan İçinde bir girdiniz var!
Beklemeniz gerekenler: öğrenme süreci bu hatalı girdiye "ulaştığında" - çıktı olur nan. Çalışma zamanı günlüğüne baktığınızda muhtemelen olağandışı bir şey fark etmeyeceksiniz: kayıp yavaş yavaş azalıyor ve birdenbire nanortaya çıkıyor.
Ne yapabilirsiniz: giriş veri kümelerinizi yeniden oluşturun (lmdb / leveldn / hdf5 ...) eğitim / doğrulama kümenizde kötü görüntü dosyalarının bulunmadığından emin olun. Hata ayıklama için, giriş katmanını okuyan, üzerinde sahte bir kayıp olan ve tüm girişleri çalıştıran basit bir ağ oluşturabilirsiniz: eğer bunlardan biri hatalıysa, bu sahte ağ da üretmelidir nan.
"Pooling"katmanda çekirdek boyutundan daha büyük adımlarla ilerlemek
Bazı nedenlerden dolayı, havuzlama için stride> seçilmesi s kernel_sizeile sonuçlanabilir nan. Örneğin:
layer {
name: "faulty_pooling"
type: "Pooling"
bottom: "x"
top: "y"
pooling_param {
pool: AVE
stride: 5
kernel: 3
}
}
nans ile sonuçlanır y.
Dengesizlikler "BatchNorm"
Bazı ayarlar "BatchNorm"katmanında nansayısal kararsızlıklardan dolayı çıktı verilebileceği bildirildi .
Bu sorun bvlc / caffe'de ortaya çıktı ve PR # 5136 bunu düzeltmeye çalışıyor.
Kısa bir süre önce, debug_infoişaretin ayarlanması debug_info: true, 'solver.prototxt'caffe print'in eğitim sırasında daha fazla hata ayıklama bilgisini (gradyan büyüklükleri ve aktivasyon değerleri dahil) günlüğe kaydetmesini sağlayacaktır: Bu bilgi , eğitim sürecindeki gradyan patlamalarını ve diğer sorunları tespit etmeye yardımcı olabilir .