【问题标题】:Keras train_step get epoch numberKeras train_step 获取纪元数
【发布时间】:2021-01-25 06:06:41
【问题描述】:

我构建了自己的 Keras 模型类,继承自 keras.Model。但是,我有一个修改过的训练步骤,我手动推导出前向传递并计算两个不同的损失,我将它们相加,这样我的总损失就是 total_loss = loss1 + factor*loss2。我观察到,如果我在训练期间减少该因素,我会得到更好的结果。我现在的问题是,这可能是一个好的解决方案。我可以以某种方式访问​​ train_step 方法中的纪元数,以便我可以从纪元数计算因子,还是有其他更好的方法?

非常感谢:)

编辑: 如果我在 train_step 方法中添加一个计数器,它不会在训练期间增加。但这仅发生在非急切模式下。如果我启用渴望模式,它就可以工作。关于如何使它在非急切模式下工作的任何想法?

【问题讨论】:

  • 这里有同样的问题:我需要发展一个类似 ProGAN 的网络,并且我正在使用 keras train_step。目前我找不到访问纪元号的正确方法。
  • 我最终通过回调(可以访问纪元号)解决了这个问题。回调可以更改模型中的变量。确保变量是 tf.Variable 并且设置为 trainable=False
  • 谢谢,我正在寻找这个解决方案,我正在研究回调。

标签: python tensorflow keras


【解决方案1】:

您可能会获得更好的结果,因为随着模型在损失表面上接近局部最小值,您正在减小步长。请注意下图中的减小步长如何帮助避免超出最小值。

实现这一点的常用方法是在列表中提前安排训练的学习率,其中您的模型根据 epoch 数访问当前因子,即因子[epoch]loss2。但是,没有什么可以阻止您直接根据纪元数计算因子,例如 factor = numpy.e*(-epoch)。

但是,您使用两个损失来创建总损失的方法不是我以前见过的,您的模型中可能还有其他地方可以直接调整学习率,而不是通过调整损失。

【讨论】:

  • 感谢您的回复。这些东西背后的理论是变分自动编码器。 keras.io/examples/generative/vae。尽管我的模型略有不同,但可以从中看出主要思想:总损失分解为 total_loss =reconstruction_loss + kl_loss。但是如果重建损失被加权并且权重随着纪元数的增加而减小,则模型表现更好。这与学习率没有太大关系。
猜你喜欢
  • 2018-01-17
  • 2018-10-16
  • 2019-02-13
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2015-02-06
  • 2020-07-21
  • 1970-01-01
相关资源
最近更新 更多