python - 二维数据的 Keras 内置 MSE 损失返回二维矩阵,而不是标量损失

标签 python tensorflow keras autoencoder loss-function

一旦模型经过训练,我就会尝试使用 Keras 中的自动编码器 (AE) 评估单个 2D 测试样本的 MSE 损失,当我调用 Keras MSE 内置函数来获取单个样本时,我感到很惊讶。 loss 它返回二维张量。这意味着损失函数为每个样本计算每个像素的一个损失,而不是它应该计算的每个样本的一个损失(?)。明确地说,我希望 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(以及这个样本一个样本)。

在计算 MSE 之前手动展平似乎需要根据这个 SO answer 做些什么关于 Keras 的 MSE 损失。当我阅读此 keras.io 时,将 MSE 用于具有 2D 数据的 AE 模型对我来说似乎很好Mnist 去噪教程。

我的代码:

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

关于python - 二维数据的 Keras 内置 MSE 损失返回二维矩阵,而不是标量损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57559016/

相关文章:

python - 在tensorflow中利用高精度gpus

python - Keras LSTM 尝试创建模型架构时出现多个错误

tensorflow - 在 Tensorflow 2 中将梯度可视化为热图

python - LSTM 网络在几次迭代后开始生成垃圾

javascript - AngularJS 在成功 GET 请求后抛出错误

python - 将枚举成员序列化为 JSON

python - root.query_pointer()._data 导致 CPU 使用率高

python - 错误 : could not find a version that satisfies the requirement tensorflow

python - Sklearn StratifiedKFold : ValueError: Supported target types are: ('binary' , 'multiclass' )。取而代之的是 'multilabel-indicator'

python - os.rename() 失败,正在被另一个进程使用