使用批量训练为自动编码器计算 MSE 的正确方法
Correct way to calculate MSE for autoencoders with batch-training
假设您有一个表示自动编码器 (AE) 的网络。假设它有 90 inputs/outputs。我想用大小为 100 的批次对其进行批量训练。我将用 x
表示我的输入,用 y
.
表示我的输出
现在,我想使用 MSE 来评估我的训练过程的性能。据我了解,我的网络的 input/output 维度大小为 (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)是如何在后台处理的,或者正确的版本是什么,我将不胜感激。
谢谢!
版本 2,即计算每个样本的二次误差的平均值,然后计算所得数字的平均值,是在 Keras:
中完成的版本
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
但是,请注意,对样本取平均值是在代码的另一部分完成的,我已对其进行了广泛的解释 and 。
假设您有一个表示自动编码器 (AE) 的网络。假设它有 90 inputs/outputs。我想用大小为 100 的批次对其进行批量训练。我将用 x
表示我的输入,用 y
.
现在,我想使用 MSE 来评估我的训练过程的性能。据我了解,我的网络的 input/output 维度大小为 (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)是如何在后台处理的,或者正确的版本是什么,我将不胜感激。
谢谢!
版本 2,即计算每个样本的二次误差的平均值,然后计算所得数字的平均值,是在 Keras:
中完成的版本def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
但是,请注意,对样本取平均值是在代码的另一部分完成的,我已对其进行了广泛的解释