如何在训练时获得样本损失而不是总损失?损耗历史记录提供了总批次损耗,但不提供单个样品的损耗。
如果可能的话,我想要这样的东西:
on_batch_end(batch, logs, **sample_losses**)
这样的东西是可用的,如果没有,你能提供一些提示如何改变代码来支持这个吗?
据我所知,不可能通过回调获得此信息,因为一旦调用回调,损失已经计算出来了(看看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)
实际上这可以使用回调来完成。这已经包含在关于回调的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'))
然后传递这个回调给你的模型。您应该将每批损失添加到历史记录对象中。
我也没有在Keras API中发现任何可以返回单个样本损失的现有函数,同时仍然在小批量上进行计算。看来你必须破解keras,或者直接访问tensorflow图。
设置批处理大小为1,并在模型中使用回调。评估或手动计算预测(model.predict)与真实值之间的损失