Validation Keras预测给出的误差不同于评估,损失不同于度量

Validation Keras预测给出的误差不同于评估,损失不同于度量,validation,tensorflow,keras,loss,metric,Validation,Tensorflow,Keras,Loss,Metric,我有以下问题: 我在Keras有一个自动编码器,并对它进行了几个时代的训练。培训概述显示验证MAE为0.0422,MSE为0.0024。 但是,如果我随后调用network.predict并手动计算验证错误,则得到0.035和0.0024 有人会认为我手动计算的MAE完全不正确,但奇怪的是,如果我使用一个身份模型(只输出您输入的内容)并使用它来评估预测值,那么返回的错误值与手动计算相同。代码如下所示: input=input(shape=(X_train.shape[1],) 编码=密集(50,

我有以下问题:

我在Keras有一个自动编码器,并对它进行了几个时代的训练。培训概述显示验证MAE为0.0422,MSE为0.0024。 但是,如果我随后调用network.predict并手动计算验证错误,则得到0.035和0.0024

有人会认为我手动计算的MAE完全不正确,但奇怪的是,如果我使用一个身份模型(只输出您输入的内容)并使用它来评估预测值,那么返回的错误值与手动计算相同。代码如下所示:

input=input(shape=(X_train.shape[1],)
编码=密集(50,激活='relu',活动\正则化器=正则化器。l1(10e-5))(输入)
编码=密集(50,激活='relu',活动\正则化子=正则化子。l1(10e-5))(编码)
编码=密集(50,激活='relu',活动\正则化子=正则化子。l1(10e-5))(编码)
解码=密集(50,激活='relu',活动\正则化器=正则化器。l1(10e-5))(编码)
解码=密集(50,激活='relu',活动\正则化器=正则化器。l1(10e-5))(解码)
解码=密集(X_列形状[1],激活='sigmoid')(解码)
网络=模型(输入,解码)
#sgd=sgd(lr=8,衰变=1e-6)
#compile(loss='mean\u squared\u error',optimizer='adam')
compile(loss='mean\u absolute\u error',optimizer='adam',metrics=['mse'])
#拟合数据
网络拟合(X_序列,X_序列,历代数=2,批量大小=1,随机数=True,验证数据=(X_有效,X_有效),
回调=[EarlyStopping(monitor='val_loss',min_delta=0.00001,patience=20,verbose=0,mode='auto'))
#结果
侦察有效=网络。预测(X有效,批量大小=1)
score2=网络。评估(X_有效,X_有效,批量大小=1,详细度=0)
打印('网络评估结果:mae={},mse={}'。格式(*score2))
x=输入((x_列形状[1],))
m=模型(x,x)
m、 编译(loss='mean\u absolute\u error',optimizer='adam',metrics=['mse'])
分数1=m.evaluate(确认有效,X有效,批量大小=1,详细度=0)
print('Identity evaluate result:mae={},mse={}'。格式(*score1))
错误测试=np.绝对(X有效-重新确认有效)
打印(“手动MAE:{}”。格式(np.平均值(错误测试)))
误差检验=np平方(X有效-重新确认有效)
打印(“手动MSE:{}”。格式(np.平均值(错误测试)))
其输出如下:

训练282个样本,验证94个样本
纪元1/2
2018-04-18 17:24:01.464947:IC:\tf\u jenkins\workspace\rel win\M\windows\PY\36\tensorflow\core\platform\cpu\u feature\u guard.cc:137]您的cpu支持该tensorflow二进制文件未编译为使用的指令:AVX AVX2
282/282[=======================================]-0s-损失:0.0861-均方误差:0.0187-瓦尔损失:0.0451-瓦尔均方误差:0.0025
纪元2/2
282/282[====================================]-0s-损失:0.0440-均方误差:0.0025-瓦尔损失:0.0422-瓦尔均方误差:0.0024
网络评估结果:mae=0.042164827236011769,mse=0.0024067993242382767
身份评估结果:mae=0.03506102238563781,mse=0.0024067993242382767
手动MAE:0.03506102412939072
手动MSE:0.002406799467280507
我知道我的手动计算是正确的,因为标识模型(m)返回相同的值。MAE值差异的唯一可能解释是,如果network.evaluate(X_有效,X_有效)以某种方式使用了与network.predict(X_有效)返回的值不同的值,那么MSE也会不同

这让我完全困惑,认为Keras-MAE的计算可能有缺陷。以前有没有人遇到过这个问题,或者知道如何解决这个问题?我正在使用Tensorflow后端。 任何帮助都将不胜感激


编辑:我几乎可以肯定这是一个bug。如果我保持loss='mae',但同时添加metrics=['mse','mae'],那么由metrics返回的mae与我的手动计算和身份模型相同。MSE也是如此:如果我设置loss='MSE',则度量返回的MSE与损失不同。

结果表明,由于正则化,损失应该与度量不同。使用正则化,损失更高(在我的例子中),因为当节点没有指定的活动时,正则化会增加损失。度量没有考虑到这一点,因此返回不同的值,这等于手动计算错误时得到的值。

由于不同的原因,培训和验证期间的度量不同:

  • 数据集是不同的
  • 在训练过程中,每一步的权重都在变化,因此指标也在变化
  • 培训期间的指标是当前批次数据或最后批次指标的运行平均值。对于评估,度量是针对整个数据集的