假设你有一个表示自编码器(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)