Keras 内置 2D 数据上的 MSE 丢失返回 2D 矩阵,而不是标量损失



一旦模型经过训练,我正在尝试使用Keras中的自动编码器(AE(评估单个2D测试样本的MSE损失,我很惊讶当我调用Keras MSE内置函数来获取单个样本的损失时,它会返回2D张量。这意味着损失函数为每个样本计算每个像素的一个损失,而不是每个样本一个损失(?(。为了非常清楚,我希望 MSE 将计算在所有像素上的平方误差的平均值与每个 2D 样本相关联(正如我在这篇文章中读到的那样(。

由于在使用.predict().evaluate()训练我的 AE 后,我没有设法获得每个测试样本一个标量的标量 MSE 错误数组(也许我也错过了一些东西(,我继续尝试直接使用keras.losses.mean_squared_error()逐个样本。这让我返回了 2D 张量作为每个样本的损失(输入张量的大小为(N,M,1)(。当人们查看Keras对MSE损失的原始实现时,您会发现:

def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)

axis=-1解释了为什么在计算损失时,多个维度不会立即简化为标量。

因此,我想知道:

  1. 我的模型在训练期间到底使用了什么?难道是 如我预期的那样,每个样本的所有像素的平方误差平均值 ?这不是内置代码所建议的。
  2. 我是否绝对需要重新定义MSE损失以获得每个测试样品的单个MSE损失?要获得标量 I 然后必须展平样本和相关的 预测,然后重新应用内置 MSE(以及此示例(。

在计算 MSE 之前手动扁平化似乎是需要根据这个关于 Keras MSE 损失的 SO 答案完成的。当我阅读这本 keras.io Mnist 去噪教程时,将 MSE 用于具有 2D 数据的 AE 模型对我来说似乎很好。

我的代码:

import keras
AE_testOutputs = autoencoder.predict(samplesList)
samplesMSE = []
for testSampleIndex in range(samplesList.shape[0]):
AE_output = AE_testOutputs[testSampleIndex,:,:,:]
samplesMSE.append(keras.losses.mean_squared_error(samplesList[testSampleIndex,:,:,:],AE_output))

这将返回Tensor("Mean:0", shape=(15, 800), dtype=float64)对象的samplesMSE列表。

很抱歉,如果我错过了类似的问题,我在发布之前确实进行了积极的研究,我仍然担心有一个非常简单的解释/我一定在某处错过了一个内置功能。

虽然不是绝对必需的,但 Keras 损失函数通常定义为"每个样本",其中"样本"基本上是模型输出张量中的每个元素。然后,损失函数通过包装函数weighted_masked_objective,该包装函数增加了对掩码和样本加权的支持。默认情况下,总损失是样本损失的平均值。

如果要获取除第一个维度之外的每个维度的某个值的平均值,则可以简单地使用K.mean而不是获得的值。

相关内容

  • 没有找到相关文章

最新更新