【问题标题】:Keras- Loss per sample within batchKeras-批次内每个样本的损失
【发布时间】:2016-10-07 06:13:01
【问题描述】:

如何在训练时获得样本损失而不是总损失?损失历史可提供总批次损失,但不提供单个样本的损失。

如果可能的话,我想要这样的东西:

on_batch_end(batch, logs, **sample_losses**)

这样的东西是否可用,如果没有,您能否提供一些提示如何更改代码以支持此功能?

【问题讨论】:

  • 欢迎来到 Stack Overflow!请查看我们的SO Question Checklist 以帮助您提出一个好问题,从而得到一个好的答案。

标签: keras


【解决方案1】:

据我所知,不可能通过回调获取此信息,因为一旦调用回调,就已经计算了损失(查看keras/engine/training.py)。要简单地检查损失,您可以覆盖损失函数,例如:

def myloss(ytrue, ypred):
    x = keras.objectives.mean_squared_error(ytrue, ypred)
    return theano.printing.Print('loss for each sample')(x)

model.compile(loss=myloss)

【讨论】:

  • 谢谢尼莫...你的天才....它就像一个魅力......training.py 可以更新以通过回调获取这些值
  • 如果它们有助于解决您的问题,请考虑接受答案(单击复选标记)。这会将问题标记为在概述中已回答,并为回答您提供的赞成票的人授予额外的分数。谢谢。
【解决方案2】:

实际上这可以使用回调来完成。这现在包含在有关回调的 keras 文档中。像这样定义你自己的回调

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.losses = []

    def on_batch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))

然后将此回调传递给您的模型。您应该将每批损失附加到历史对象中。

【讨论】:

  • 我正在寻找批次中的每个样本损失,而不是批次损失。
【解决方案3】:

我还没有在 Keras API 中找到任何可以返回单个样本损失的现有函数,同时仍然在小批量上进行计算。看来您必须破解 keras,或者直接访问 tensorflow 图。

【讨论】:

    【解决方案4】:

    将批量大小设置为 1 并在 model.evaluate 中使用回调或手动计算预测 (model.predict) 和基本事实之间的损失。

    【讨论】:

      猜你喜欢
      • 2020-12-03
      • 2021-12-02
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2022-07-14
      • 2018-03-07
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多