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

时间:2019-07-18 04:17:53

标签: keras

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

5 个答案:

答案 0 :(得分:0)

我不认为keras提供此功能,因为从未计算批次中每个样品的损失。我认为损失仅是整个批次中的平均值。

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

如果发现我错了,请更正我。

答案 1 :(得分:0)

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()

如果执行以下测试代码:

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])

您应该看起来像以下内容:

losses [23.2873611 26.1659927 34.1300354 6.16115761]

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

这取决于您对单项损失的处理方式,是否会让您感兴趣。从最初的问题来看根本不清楚。

答案 2 :(得分:0)

如果您不只是想在训练过程中获得每个样本的损失,那么可以使用evaluate方法:

# assume images is already defined (e.g. as a numpy array)
#        images.shape = (n_images, n_rows, n_cols, n_channels
n_images = images.shape[0]
loss = n_images*[None]

for i in range(n_images):

    # note I'll use the same input for x & y parameters which is the case for an autoencoder
    loss[i] = model.evaluate(x=images[i:i+1,:,:,:],
                             y=images[i:i+1,:,:,:],
                             batch_size=None,
                             verbose=1,
                             steps=1
                             )

答案 3 :(得分:0)

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

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) 

答案 4 :(得分:0)

只需将批次大小设置为1。然后为model.evaluate编写自定义的回调,以便在on_test_batch_end收集每次损失。