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

时间:2019-05-01 12:22:12

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

假设您有一个代表自动编码器(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 个答案:

答案 0 :(得分:1)

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

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

但是,请注意,对样本取平均值是在代码的另一部分中完成的,我已经对herehere进行了详细说明。