自动编码器批量训练中计算均方误差的正确方法

4
假设您有一个表示自编码器(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)如何处理它的提示,或者哪个是正确的版本,我将不胜感激。
谢谢!
1个回答

4

第二个版本,即计算每个样本的平方误差的平均值,然后计算结果数字的平均值,在Keras中执行:

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

但是请注意,对样本进行平均值计算是在代码的另一个部分执行的,我已经在这里这里详细解释过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接