我已经展示了我的模型,但是我已经看到了全面的结果。举例来说,我现在正在训练一个模型,该模型使用笔直的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
。
答案 0 :(得分:0)
我猜想这与Keras决定网络收敛的方式有关-它可能会将损失函数之间的差异与固定数值进行比较,例如0.01。如果不能将其提高0.01,则会停止。
如果将损失乘以100,则Keras仍将使用0.01来测试收敛性-因此它会执行更多的迭代并优化效果。