如何获得批次中每个样品的损失?看来Keras没有提供任何满足需求的功能。
答案 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收集每次损失。