代码之家  ›  专栏  ›  技术社区  ›  nbro

我如何仅为正则化损失编写自定义指标?

  •  0
  • nbro  · 技术社区  · 4 年前

    某些层存在正则化损失。我希望有一个“指标”,只跟踪正则化损失,这样我就可以在进度条中单独(从总损失中)看到正则化损失在训练过程中是如何演变的。此外,假设指标保存在历史对象中(由返回 fit ),我可以很容易地在训练结束时绘制并保存(到文件中)正则化损失。

    我如何仅为正则化损失编写自定义指标?

    我知道我可以有一个回调函数,它迭代模型的层并求和正则化损失(参见例如。 https://stackoverflow.com/a/48489090/3924118 ),但我希望有一个度量(而不是回调),因为度量将保存在history对象中。

    最终,我希望正则化损失出现在历史对象中,并显示在进度条中(与总损失分开),即使没有实现自定义指标,但我不知道是否有这样的选项 tf.keras 此外,如果我能有两个选择,那就太好了:1。查看所有层的所有正则化损失的总和和2。分别查看每一层的正则化损失。

    0 回复  |  直到 4 年前
        1
  •  1
  •   nbro    4 年前

    我想我找到了解决办法。您可以修改参数 logs 在回调中添加您想要的信息。然后,您的历史对象将自动包含此新信息。

    def get_cb(model):
        def on_epoch_end(epoch, logs):
            # Iterate the layers of your model to get the regularisation losses
            reg_losses = get_your_regularisation_losses(model)
            logs["reg_losses"] = reg_losses
    
        return tf.keras.callbacks.LambdaCallback(on_epoch_end=on_epoch_end)
    
    ...
    history = model.fit(..., callbacks=[get_cb(model)])
    do_something(history) # history contains "reg_losses"
    

    (请随时提供使用自定义指标的替代解决方案!)

        2
  •  1
  •   Bas Krahmer    4 年前

    要将其显示在进度条中,您可以执行以下操作 something like this :

    def get_reg_loss(reg_layers):
        def reg_loss_term(y_true, y_pred):
            return tf.add_n([r.losses[0] for r in reg_layers])
    
        return reg_loss_term
    
    model.compile(..., metrics=[..., get_reg_loss(reg_layers)])
    

    这将所有正则化损失项的总和作为度量添加到模型中。这种方法的缺点是,当您希望进度条显示单个层的损失项时,您必须为每个正则化层定义一个唯一命名的函数。