如何在keras中获得批次中每个样本的损失?

zhf*_*061 8 keras

如何获得批次中每个样本的损失?Keras似乎没有提供任何满足需求的功能。

小智 5

Keras 总是计算每个样本的损失。它必须这样做才能计算将用作反向传播基础的损耗值。除了作为每批次的平均值外,这些值通常不会向用户公开,但它们是由损失函数计算的,然后出于显示目的进行平均。

一个非常简单的示例模型:

import tensorflow as tf
import tensorflow.keras.backend as K
keras = tf.keras

model = keras.models.Sequential([
    keras.layers.Input(shape=(4,)),
    keras.layers.Dense(1)
])

def examine_loss(y_true, y_pred):
  result = keras.losses.mean_squared_error(y_true, y_pred)
  result = K.print_tensor(result, message='losses')
  return result

model.compile('adam', examine_loss)
model.summary()
Run Code Online (Sandbox Code Playgroud)

如果执行以下测试代码:

import numpy as np
X = np.random.rand(100, 4)

def test_fn(x):
  return x[0] * 0.2 + x[1] * 5.0 + x[2] * 0.3 + x[3] + 0.6

y = np.apply_along_axis(test_fn, 1, X)

model.fit(X[0:4], y[0:4])
Run Code Online (Sandbox Code Playgroud)

你应该看起来像下面这样:

losses [23.2873611 26.1659927 34.1300354 6.16115761]
Run Code Online (Sandbox Code Playgroud)

(数字会有所不同,因为它们取决于随机初始化)。

这可能会让您感兴趣或不感兴趣,这取决于您想对个人损失做什么。从最初的问题来看,这一点根本不清楚。


ano*_*767 5

我知道这个线程有点旧,但我找到了一个巧妙的解决方案,也许这对某人有帮助:

import tensorflow as tf

# Suppose you have an already trained model
model = ...

loss = SparseCategoricalCrossentropy(reduction=tf.compat.v1.losses.Reduction.NONE) # The loss function is just an example, the reduction is the important one
model.compile(optimizer=model.optimizer, loss=loss) # keep your original optimizer

# And then you'll get each loss for each instance within a batch
model.evaluate(X,y, batch_size=128) 

Run Code Online (Sandbox Code Playgroud)


小智 0

我认为 keras 没有提供此功能,因为批次内每个单独样本的损失永远不会被计算。我认为损失仅按批次的平均值计算。

一种非常无用(且耗时)的解决方法可能是迭代训练数据并在单个样本上进行训练。

如果事实证明我错了,请纠正我。