【问题标题】:Correct way to calculate MSE for autoencoders with batch-training使用批处理训练计算自动编码器的 MSE 的正确方法
【发布时间】:2019-09-20 00:24:59
【问题描述】:

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

现在,我想使用 MSE 来评估我的训练过程的表现。据我了解,我的网络的输入/输出尺寸为 (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)如何在后台处理此问题或正确的版本是什么,我将不胜感激。

谢谢!

【问题讨论】:

    标签: tensorflow machine-learning keras autoencoder loss-function


    【解决方案1】:

    版本 2,即计算每个样本的二次误差的平均值,然后计算结果数字的平均值,是在 Keras 中完成的:

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

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

    【讨论】:

      猜你喜欢
      • 2020-11-15
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 2021-05-10
      • 1970-01-01
      • 2021-03-22
      • 2023-03-22
      相关资源
      最近更新 更多