使用批量训练为自动编码器计算 MSE 的正确方法

Correct way to calculate MSE for autoencoders with batch-training

假设您有一个表示自动编码器 (AE) 的网络。假设它有 90 inputs/outputs。我想用大小为 100 的批次对其进行批量训练。我将用 x 表示我的输入,用 y.

表示我的输出

现在,我想使用 MSE 来评估我的训练过程的性​​能。据我了解,我的网络的 input/output 维度大小为 (100, 90)。

MSE计算的第一部分是逐元素进行的,即

(x - y)²

所以我又得到了一个大小为 (100, 90) 的矩阵。为了更好地理解我的问题,我将任意绘制一个现在看起来如何的矩阵:

[[x1 x2 x3 ... x90],    # sample 1 of batch
 [x1 x2 x3 ... x90],    # sample 2 of batch
 .
 .
 [x1 x2 x3 ... x90]]    # sample 100 of batch

从现在开始,我偶然发现了计算误差的各种版本。所有版本的目标都是将矩阵简化为标量,然后可以对其进行优化。

版本 1:

先对各个样本的二次误差求和,然后计算所有样本的均值,例如:

v1 = 
[ SUM_of_qerrors_1,        # equals sum(x1 to x90)
  SUM_of_qerrors_2,
  ...
  SUM_of_qerrors_100 ]

result = mean(v1)

版本 2:

计算每个样本的二次误差的平均值,然后计算所有样本的平均值,例如:

v2 = 
[ MEAN_of_qerrors_1,        # equals mean(x1 to x90)
  MEAN_of_qerrors_2,
  ...
  MEAN_of_qerrors_100 ]

result = mean(v2)

我个人认为版本1是正确的做法,因为常用的交叉熵的计算方式是一样的。但是如果我使用版本 1,它就不是真正的 MSE。

我在这里找到了一个 keras 示例 (https://keras.io/examples/variational_autoencoder/),但不幸的是我无法弄清楚 keras 如何通过批处理训练在幕后做到这一点。

如果能提示 keras(以及 tensorflow)是如何在后台处理的,或者正确的版本是什么,我将不胜感激。

谢谢!

版本 2,即计算每个样本的二次误差的平均值,然后计算所得数字的平均值,是在 Keras:

中完成的版本
def mean_squared_error(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

但是,请注意,对样本取平均值是在代码的另一部分完成的,我已对其进行了广泛的解释 and