将损失乘以标量后,为什么在训练Keras模型时得到不同的结果?

时间:2018-07-11 04:25:10

标签: python tensorflow machine-learning keras artificial-intelligence

我已经展示了我的模型,但是我已经看到了全面的结果。举例来说,我现在正在训练一个模型,该模型使用笔直的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

1 个答案:

答案 0 :(得分:0)

我猜想这与Keras决定网络收敛的方式有关-它可能会将损失函数之间的差异与固定数值进行比较,例如0.01。如果不能将其提高0.01,则会停止。

如果将损失乘以100,则Keras仍将使用0.01来测试收敛性-因此它会执行更多的迭代并优化效果。