【发布时间】:2018-07-11 04:25:10
【问题描述】:
我会展示我的模型,但我已经全面看到了这个结果。举个例子,我现在正在训练一个模型,使用直接 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、100 的损失次A。但事实并非如此。事实上,B 在损失和网络的定性产品方面都明显优于A。
【问题讨论】:
-
能否添加更多细节,比如训练时的详细信息?
-
这不是关于特定项目的问题(尽管我在当前的工作中看到了它),而更像是一个一般性的问题。这与将损失乘以标量也会乘以梯度这一事实有关吗?
-
如果您添加代码示例会更好。至少训练和乘法部分。
-
我明白了,@Mufeed,我已经包含了相关的代码 sn-ps。
-
@DroidGadgets 我已经包含了相关代码sn-ps。
标签: python tensorflow machine-learning keras artificial-intelligence