簡體   English   中英

將損失乘以標量后,為什么在訓練Keras模型時得到不同的結果?

[英]Why do I get different results when training a Keras model when I multiply the loss by a scalar?

我會展示我的模型,但是我已經看到了全面的結果。 舉例來說,我現在正在訓練一個模型,該模型使用筆直的mse,損失最低達到0.0160。 但是當我使用100 * mse時,損失現在跌至0.2以下,我曾預期該損失會在1.6附近觸底。 有人知道為什么訓練Keras模型可能會對標量乘以損失敏感嗎?

編輯:並且只是為了澄清,當這發生在我身上時,該模型的確會做得更好,所以它不僅僅是一個數字怪癖。

EDIT2:我被要求提供一些示例代碼,所以我會的。 我正在使用卷積變分自動編碼器作為生成模型。 這是我的自定義損失函數:

def vae_loss (input_image, decoder_output):
    mse_loss = mse(input_image, decoder_output)
    kl_loss = - 0.5 * (K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=[-1,-2,-3]))
    return mse_loss         # (A)
    #return 100 * mse_loss  # (B)

我意識到這並不使用kl_loss ,這只是作為實驗。 我正在用以下方式編譯模型:

vae.compile(optimizer='adadelta', loss=vae_loss)

並適合:

vae.fit_generator(random_crop(data[:500,:,:,:], 128, 128),
              validation_data=random_crop(data[500:,:,:,:], 128, 128),
              shuffle=True, steps_per_epoch=64, epochs=5, validation_steps=50)

使用A作為損失函數收斂到0.0160的損失。 如果使用B導致模型收斂到相同的解(並且我希望它能夠收斂,因為乘以標量不會改變局部極小值的位置),那么我希望它收斂到1.60的損失,是A 100倍。 但事實並非如此。 實際上,就網絡的損失和質量而言, B表現均明顯優於A

我猜想這與Keras決定網絡收斂的方式有關-它可能會將損失函數之間的差異與固定數值進行比較,例如0.01。 如果不能提高0.01,則停止。

如果將損失乘以100,則Keras仍將使用0.01來測試收斂性-因此它將執行更多的迭代並進行更好的優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM