假设您有一个代表自动编码器(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是正确的方法,因为常规使用的crossentropy是以相同的方式计算的。但是,如果我使用版本1,那不是MSE。
我在这里找到了一个keras示例(https://keras.io/examples/variational_autoencoder/(,但不幸的是,我无法弄清楚Keras在批处理训练下如何在引擎盖下进行此操作。
我要么感谢提示如何通过keras在引擎盖下处理的提示(因此是张力量(,或者正确的版本是什么。
谢谢!
版本2,即每个样本二次错误的平均值,然后计算结果数的平均值,是在keras中完成的均值:
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
但是,请注意,在代码的另一部分中,将平均值超过样本是我在这里和这里广泛解释的。