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

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

现在,我想使用MSE来评估我的训练过程的表现。据我所知,我的网络的输入/输出维度为(100, 90)。

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

(x - y)²

所以我最终得到一个大小为(100, 90)的矩阵。为了更好地理解我的问题,我会随意画一个矩阵来展示现在的情况:

[[x1 x2 x3 ... x90],    # 批次的第1个样本
 [x1 x2 x3 ... x90],    # 批次的第2个样本
  .
  .
 [x1 x2 x3 ... x90]]    # 批次的第100个样本

从现在开始,我遇到了各种计算误差的方法。所有方法的目标是将矩阵简化为一个标量,以便进行优化。

版本1:

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

v1 = [ SUM_of_qerrors_1,        # 等于sum(x1到x90)
       SUM_of_qerrors_2,
       ...
       SUM_of_qerrors_100 ]
result = mean(v1)

版本2:

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

v2 = [ MEAN_of_qerrors_1,        # 等于mean(x1到x90)
       MEAN_of_qerrors_2,
       ...
       MEAN_of_qerrors_100 ]
result = mean(v2)

我个人认为版本1是正确的做法,因为常用的交叉熵是以相同的方式计算的。但如果我使用版本1,它实际上并不是MSE。

我在这里找到了一个Keras的例子,但遗憾的是我无法弄清楚Keras在批量训练下是如何处理的。

我将不胜感激,如果能得到关于Keras(因此也是TensorFlow)在底层如何处理的提示,或者哪个版本是正确的版本。

谢谢你!


回答:

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

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

然而,请注意,对样本的平均计算是在代码的另一部分完成的,我在这里这里对此进行了详细的解释。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注