validation - Keras 预测给出与评估不同的错误,与指标不同的损失

标签 validation tensorflow keras loss metric

我有以下问题:

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

人们会假设我对 MAE 的手动计算完全不正确,但奇怪的是,如果我使用恒等模型(简单地输出您输入的内容)并使用它来评估预测值,则相同的错误值是作为我的手动计算返回。代码如下所示:

input = Input(shape=(X_train.shape[1], ))
encoded = Dense(50, activation='relu', activity_regularizer=regularizers.l1(10e-5))(input)
encoded = Dense(50, activation='relu', activity_regularizer=regularizers.l1(10e-5))(encoded)
encoded = Dense(50, activation='relu', activity_regularizer=regularizers.l1(10e-5))(encoded)
decoded = Dense(50, activation='relu', activity_regularizer=regularizers.l1(10e-5))(encoded)
decoded = Dense(50, activation='relu', activity_regularizer=regularizers.l1(10e-5))(decoded)
decoded = Dense(X_train.shape[1], activation='sigmoid')(decoded)
network = Model(input, decoded)

# sgd = SGD(lr=8, decay=1e-6)
# network.compile(loss='mean_squared_error', optimizer='adam')
network.compile(loss='mean_absolute_error', optimizer='adam', metrics=['mse'])

# Fitting the data
network.fit(X_train, X_train, epochs=2, batch_size=1, shuffle=True, validation_data=(X_valid, X_valid),
            callbacks=[EarlyStopping(monitor='val_loss', min_delta=0.00001, patience=20, verbose=0, mode='auto')])


# Results
recon_valid = network.predict(X_valid, batch_size=1)
score2 = network.evaluate(X_valid, X_valid, batch_size=1, verbose=0)
print('Network evaluate result: mae={}, mse={}'.format(*score2))

x = Input((X_train.shape[1],))
m = Model(x, x)
m.compile(loss='mean_absolute_error', optimizer='adam', metrics=['mse'])
score1 = m.evaluate(recon_valid, X_valid, batch_size=1, verbose=0)
print('Identity evaluate result: mae={}, mse={}'.format(*score1))

errors_test = np.absolute(X_valid - recon_valid)
print("Manual MAE: {}".format(np.average(errors_test)))
errors_test = np.square(X_valid - recon_valid)
print("Manual MSE: {}".format(np.average(errors_test)))

输出如下:

Train on 282 samples, validate on 94 samples
Epoch 1/2
2018-04-18 17:24:01.464947: I C:\tf_jenkins\workspace\rel-win\M\windows\PY\36\tensorflow\core\platform\cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
282/282 [==============================] - 0s - loss: 0.0861 - mean_squared_error: 0.0187 - val_loss: 0.0451 - val_mean_squared_error: 0.0025
Epoch 2/2
282/282 [==============================] - 0s - loss: 0.0440 - mean_squared_error: 0.0025 - val_loss: 0.0422 - val_mean_squared_error: 0.0024
Network evaluate result: mae=0.04216482736011769, mse=0.0024067993242382767
Identity evaluate result: mae=0.03506102238563781, mse=0.0024067993242382767
Manual MAE: 0.03506102412939072
Manual MSE: 0.002406799467280507

我知道我的手动计算是正确的,因为身份模型 (m) 返回相同的值。对于 MAE 值差异的唯一可能解释是,如果 network.evaluate(X_valid, X_valid) 以某种方式使用与 network.predict(X_valid) 返回的值不同的值,那么 MSE 也会不同。

这让我完全困惑,认为 Keras MAE 计算中可能存在错误。有没有人以前遇到过这个问题或有任何想法如何解决?我正在使用 Tensorflow 后端。 任何帮助将不胜感激!

编辑:我几乎可以肯定这是一个错误。如果我保留 loss='mae' 但同时添加 metrics=['mse', 'mae'],metrics 返回的 MAE 与我的手动计算和恒等模型相同。 MSE 也是如此:如果我设置 loss='mse',则 metric 返回的 MSE 与 loss 不同。

最佳答案

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

关于validation - Keras 预测给出与评估不同的错误,与指标不同的损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49903706/

相关文章:

php - SailsJS 中的水线似乎没有捕捉到唯一约束

tensorflow - Keras 模型保存错误 : TypeError: get_config() missing 1 required positional argument: 'self'

python - 无法加载具有自定义约束的 keras 模型

python - 使用自定义层加载 Keras 中保存的模型,预测结果不同?

c# - 仍然需要没有 Required 属性的整数属性

node.js - 使用 Express,我可以自动修剪 req.body 中所有传入的 POSTed 字段吗?

tensorflow - 为什么我要选择与我的指标不同的损失函数?

python - 为什么 tensorflow 在多次训练 Estimator 时说 Tensor 不是该图的元素?

python - 值错误 : None values not supported Keras Custom Loss Function in Tensorflow

ruby-on-rails - rails 验证 : :allow_nil and :inclusion both needed at the same time