Sigmoid ve cost function overflow ve divide by zero hatası


#1

Merhaba sigmoid ve cost fonksiyonlarında data mı eğitirken bu hataları alıyorum.Muhtemelen gelen bir veya bir kaç değerin çok küçük olmasından kaynaklanıyor.Stack overflow ve diğer forumlardaki gözlemlerime göre tam olarak net bir çözüm sağlayamadım.Bu sorunu daha önceki problemlerde normalization yöntemiyle çözülmüş olduğunu gördüm ama spesifik örnek vermek gerekirse 3.haftanın ödevinde şu data seti mevcut

Unknown

RuntimeWarning: divide by zero encountered in log
logprobs = np.multiply(np.log(a2), Y) + np.multiply((1-Y), np.log(1-a2))
RuntimeWarning: invalid value encountered in multiply
logprobs = np.multiply(np.log(a2), Y) + np.multiply((1-Y), np.log(1-a2))
RuntimeWarning: overflow encountered in exp
s = 1/(1+np.exp(-z))

Daha önceden aynı hatayı sigmoid fonksiyonumda da almıştım.Eğitirken çözümde kullanılan cost fonksiyonunu aldım denemek için.Muhtemelen burada da bir normalleştirme işlemine gitmemiz gerekiyor ama bunu tam olarak nasıl yapıyoruz acaba.Şimdiden teşekkürler.


#2

Merhaba, hata değil de uyarı alıyorsunuz. Dolayısıyla yok sayabilirsiniz. Sizin de belirttiğiniz gibi küçük değer olmasından kaynaklanıyor muhtemelen. Değerin çok küçük olup olmadığı ile ilgili olarak aşağıdaki kontrolü sağlayabilirsiniz :

def sigmoid(value):
if -value > np.log(np.finfo(type(value)).max):
return 0.0
a = np.exp(-value)
return 1.0/ (1.0 + a)

İyi çalışmalar dilerim.


#4

Evet uyarı ama bu yüzden sonucu yanlış hesaplıyor maalesef.Öneriniz de çözüm sağlamadı maalesef teşekkürler cevabınız için.


#5

Öneri çözüm sağlamadı derken üç uyarıyı da almaya devam mı ediyorsunuz? Ödevi kendimde tekrar koşturup dönüş sağlamaya çalışacağım.


#6

Önerinizi uyguladığımda ona bağlı başka hatalarla karşılaşıyorum.Aslında benim tam anlamak istediğim kısım bu sigmoid ve cost fonksiyonlarını herkes aynı şekilde kullanmış hiç farklı bir kullanım görmedim mesela ama ben nerede yanlış yapıyorum onu anlamadım yani burada sorun fonksiyonda değil de datada o tarafa yönelik bir çözüm daha sağlıklı olur benim açımdan.Hani bu hatayı çözenler fonksiyona değil normalleştirmeye doğru yönelmişler , sonuçta fonksiyon evrensel.


#8

@Snn lütfen yeni sorunuzu yeni konu başlığı ile sorunuz.


#7

Birde burda data setini yüklerken bütün çözümlerde neden geri dönüş olarak input(X) ve output(Y) un tranzpozunu döndürmüşler yani neden (400,2) ye (400,1) değilde (2,400) ve (1,400) şeklinde datayı alıp devam etmişler.


#9

Merhaba @Snn , aynı problemi ben de yaşıyorum. Çözüm bulabildiniz mi?


#10

Probleminizin ne oldugunu yazarsaniz belki bir cozum alabilirsiniz. Yukaridaki soruda hatanin ne oldugu cok bariz ornegin. Logaritma fonksiyonuna 0 veya 0’dan kucuk sayilar besleniyor.


#11

Teşekkür ederim cevabınız için. Doğru, fakat ilgili Coursera kursunun data seti ve modeli herkes için aynı olmasına rağmen, aynı modelle bu hatayı almıyor bir çok kişi. Modeldeki random generatorlarda, çıktılar aynı olması adına seed fonksiyonu kullanılıyor. Dolayısıyla bu farklı sonuçların nereden kaynaklandığını bulmaya çalışıyorum, o yüzden soran arkadaş bir cevap bulabildi mi, merak ettim.


#12

Kod hatali. Bazen dogru calisiyor olmasi dogru oldugu anlamina gelmez. Baslangic noktasindan etkilenebilir, kullanilan optimizer’in versiyonundan fark edebilir, vs. Bu tur durumlarda eps(epsilon) eklemek standarttir. Coursera kodu olmasi dogru olmasini gerektirmez, kim hazirlarsa hazirlasin.


#13

Çözümü optimizasyondan geçiyor maalesef coursera daki gibi sıfırdan yazarak bu hatayı engellemek zor görünüyor.