Bir keras modelinin MSE'sini en üst düzeye çıkarın


11

Ayırıcı MSE ile küçültüldüğü ve jeneratörün maksimize edilmesi gereken üretken bir rakip ağım var. Çünkü her ikisi de karşı hedefi takip eden rakiplerdir.

generator = Sequential()
generator.add(Dense(units=50, activation='sigmoid', input_shape=(15,)))
generator.add(Dense(units=1, activation='sigmoid'))
generator.compile(loss='mse', optimizer='adam')

generator.train_on_batch(x_data, y_data)

Yüksek MSE değerinden kazanç sağlayan bir jeneratör modeli elde etmek için ne uyarlamam gerekir?


1
Neden bunu istiyorsun? Bu kötü bir sorun. MSE'yi en üst düzeye çıkarmak, tahmininizi temeldeki veri türünün sınırlarına getirmeniz gerektiği anlamına gelir. Ancak bunu gerçekten yapmak istiyorsanız, optimize edici için negatif bir öğrenme oranı sağlamak muhtemelen işi yapmalıdır. Veya MSE'nin tersini bir kayıp fonksiyonu olarak kullanın.
a_guest

1
Ayırıcı MSE ile küçültüldüğü ve jeneratörün maksimize edilmesi gereken üretken bir rakip ağım var. Çünkü her ikisi de karşı hedefi takip eden rakiplerdir.
Emma

Tamam, sorunuz oldukça yanıltıcıydı. Lütfen net olması için güncelleyin.
Geeocode

@ Geeocode yaptım, teşekkür ederim. Sizce Marco'dan negatif işaretli çözüm doğru mu?
Emma

Güncellememi dakikalar içinde görün
Geeocode

Yanıtlar:


5

GÜNCELLEME:

Orijinal MSE uygulaması aşağıdaki gibi görünür:

def mean_squared_error(y_true, y_pred):
    if not K.is_tensor(y_pred):
        y_pred = K.constant(y_pred)
    y_true = K.cast(y_true, y_pred.dtype)
    return K.mean(K.square(y_pred - y_true), axis=-1)

Bence doğru maksimizer kaybı fonksiyonu:

def mean_squared_error_max(y_true, y_pred):
    if not K.is_tensor(y_pred):
        y_pred = K.constant(y_pred)
    y_true = K.cast(y_true, y_pred.dtype)
    return K.mean(K.square(1 / (y_pred - y_true)), axis=-1)

Bu şekilde, MSE fonksiyonunda olduğu gibi, ancak ters etki ile her zaman pozitif bir kayıp değeri elde ederiz.

GÜNCELLEME 2: Başlangıçta ben sezgisel ilk düşünce yalnızca kaybı olacaktır boşa olduğunu yazdı DEĞİL (ilginç bir tartışma okuyabilir biz çünkü optimize yöntemleri baz kavramının beklediğim sonuç vermek burada ). Her iki yöntemi de belirli bir öğrenme görevinde başa iki kez kontrol ettikten sonra (Not: Bir all-out testi yapmadım), her iki yöntemin de -lossyaklaşım biraz daha hızlı bir şekilde birleşmesine rağmen, her iki yöntemin de kayıp maksimizasyonu vermesiydi . Burada açıklanan olası sorun nedeniyle her zaman en iyi çözümü mü yoksa herhangi bir çözümü mü sağladığından emin değilim . Birinin başka deneyimi varsa, lütfen bana bildirin.

Birisi -lossde denemek isterse :

def mean_squared_error(y_true, y_pred):
    if not K.is_tensor(y_pred):
        y_pred = K.constant(y_pred)
    y_true = K.cast(y_true, y_pred.dtype)
    return - K.mean(K.square(y_pred - y_true), axis=-1)


Ek detaylar:

OP şunu yazdı:

Ayırıcı MSE ile küçültüldüğü ve jeneratörün maksimize edilmesi gereken üretken bir rakip ağım var. Çünkü her ikisi de karşı hedefi takip eden rakiplerdir.

Ibragil tarafından sağlanan bağlantıdan:

Bu arada jeneratör, ayırıcıya aktardığı yeni, sentetik görüntüler yaratıyor. Sahte olmalarına rağmen, onların da orijinal kabul edileceği ümidiyle bunu yapar. Jeneratörün amacı elle yazılmış rakamlar üretilebilir: yakalanmadan yalan söylemek. Ayrımcının amacı jeneratörden gelen görüntüleri sahte olarak tanımlamaktır.


Yani bu kötü bir sorun:

In GAN'ın bizim nihai hedefimiz iki karşıt tarafları yetiştirmek ayırt edici ve jeneratör birbirlerine karşı olabildiğince iyi olarak yerine getirmektir. İki taban öğrenme algorythm farklı görevler ancak sahip oldukları anlamına gelir kaybı fonksiyonunu onlar optimal çözüm elde edebilirsiniz hangi ile aynıdır yani binary_crossentropymodellerin görevleri bu kayıp en aza indirmek için bu yüzden.

Bir ayrımcı modelin derleme yöntemi:

self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)

Bir jeneratör modelinin derleme yöntemi:

self.generator.compile(loss='binary_crossentropy', optimizer=optimizer)

İki koşucunun hedefi, bu görevde rakip olmalarına rağmen bitişe ulaşma zamanlarını en aza indirgemekle aynıdır.

Yani "karşıt hedef" karşıt görev anlamına gelmez yani kaybı en aza indirmek (yani koşucu örneğinde zamanı en aza indirmek).

Umut ediyorum bu yardım eder.


5

Soru benim için çok açık değil. MSE kriterlerini kullanırken minimize etmek yerine en üst düzeye çıkarmak istediğinizi varsayalım.

-MSE'yi hesaplayan kendi özel kayıp işlevinizi uygulayabilirsiniz; kaybın işaretini çevirmek ve böylece degrade iniş yönünde bir flip elde etmek.

def negative_mse(y,yhat): 
    return - K.mean(K.sum(K.square(y-yhat)))

model.compile(loss=negative_mse, optimizer='adam')

Başka bir seçenek sadece olumsuz bir öğrenme adımı sağlamaktır - ancak Keras'ın bunu yapmanıza izin verdiğinden emin değilim. Denemeye değer.


Fonksiyonunuzdaki negatif işareti unuttunuz mu?
Emma

Gerçekten de var. Cevabı yeni düzenledim.
Mano
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.