Keras 内置二维数据的 MSE 损失 returns 二维矩阵,不是标量损失

Keras built-in MSE loss on 2D data returns 2D matrix, not scalar loss

一旦模型经过训练,我将尝试使用 Keras 中的自动编码器 (AE) 评估单个 2D 测试样本的 MSE 损失,令我惊讶的是,当我调用 Keras MSE 内置函数来获得个体样本损失 returns 二维张量。这意味着损失函数为每个样本计算每个像素的一个损失,而不是它应该计算的每个样本的一个损失(?)。非常清楚,我希望 MSE 将所有像素计算出的平方误差的平均值与每个 2D 样本相关联(正如我在 SO post 上读到的)。

因为在使用 .predict().evaluate() 训练我的 AE 后,我没有设法得到一组标量 MSE 错误,每个测试样本一个标量(也许我也错过了一些东西) ,我继续尝试直接使用 keras.losses.mean_squared_error(),逐个示例。这为我返回了 2D 张量作为每个样本的损失(输入张量的大小为 (N,M,1))。当查看 Keras' original implementation 的 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(逐个样本)。

根据 on Keras' MSE loss. Using MSE for an AE model with 2D data seemed fine to me as I read this keras.io Mnist 去噪教程

看来需要在计算 MSE 之前手动展平。

我的代码:

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

returns samplesMSE 个对象的 Tensor("Mean:0", shape=(15, 800), dtype=float64) 个列表。

如果我错过了类似的问题,我很抱歉,我在发布之前积极研究过,我仍然担心有一个非常简单的explanation/I一定是在某处遗漏了一个内置函数。

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

如果您想获得除第一个维度之外的每个维度的某个值的平均值,您可以简单地对您获得的值使用 K.mean