【发布时间】:2019-08-19 14:41:58
【问题描述】:
一旦模型经过训练,我正在尝试使用 Keras 中的自动编码器 (AE) 评估单个 2D 测试样本的 MSE 损失,当我调用 Keras MSE 内置函数来获取单个样本时,我感到很惊讶损失它返回二维张量。这意味着损失函数为每个样本计算每个像素的一个损失,而不是每个样本的一个损失(?)。明确地说,我希望 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 解释了为什么在计算损失时不会立即将多个维度缩减为标量。
因此我想知道:
- 我的模型在训练期间到底使用了什么?是不是 正如我预期的那样,每个样本的所有像素的均方误差 ?这不是内置代码所建议的。
- 我是否绝对需要重新定义 MSE 损失以获得每个测试样本的单独 MSE 损失?获得标量 I 然后将不得不展平样本和相关的 预测,然后重新应用内置 MSE(以及此示例)。
在计算 MSE 之前手动展平似乎需要根据这个 SO answer 对 Keras 的 MSE 损失进行处理。当我阅读此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))
返回samplesMSE 的Tensor("Mean:0", shape=(15, 800), dtype=float64) 对象列表。
如果我错过了一个类似的问题,我很抱歉,我在发布之前做了积极的研究,我仍然害怕有一个非常简单的解释/我一定错过了某个地方的内置功能。
【问题讨论】:
标签: python tensorflow keras autoencoder loss-function