【问题标题】:Why does the result from evaluate() differ from last epoch result?为什么评估()的结果与上一个时代的结果不同?
【发布时间】:2021-12-16 21:24:09
【问题描述】:

我有一个非常简单的神经网络,它可以在 250 个时期工作,在最后一个时期它显示 mae = 0.1397,但是,如果我尝试获得 model.evaluate((m * test_x + b), predict_y)),那么 mae 大约是 44009.296875

为什么差别这么大?

这是我的代码:

import tensorflow as tf
from tensorflow.keras import Input
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import plot_model

import numpy as np
import matplotlib.pyplot as plt

train_x = np.arange(2000)
m = 5
b = 4

train_y = m * train_x + b

# -----------------------------------------------------
# Create a Sequential Nerual Network
model = tf.keras.Sequential()
model.add(Input(shape=(1,), name="input_layer"))
model.add(Dense(10, activation="relu"))
model.add(Dense(1, activation=None, name="output_layer"))

# -----------------------------------------------------
# Compile the model
model.compile(loss=tf.keras.losses.mae,
              optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
              metrics=["mae"])

# -----------------------------------------------------
# Train the model
model.fit(train_x, train_y, epochs=250)

# -----------------------------------------------------
# Test the model

test_x = np.arange(2000, 2400)
predict_y = model.predict([test_x])
# ------------------------------------------------------
# Evaluation
print("Evaluate Testing : ", model.evaluate((m * test_x + b), predict_y))

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    您可以手动评估结果:

    np.sqrt(np.mean((m * test_x + b) - predict_y)) # manually computing mae
    
    >>> 0.35962627085281185
    

    这没有任何意义,为什么会有这么大的差异。至少我们可以假设,你的预测还不错。

    github 中也有类似的问题: https://github.com/keras-team/keras/issues/6977。 这里有一种官方的回答: https://keras.io/getting_started/faq/#why-is-my-training-loss-much-higher-than-my-testing-loss

    为什么我的训练损失远高于测试损失?

    Keras 模型有两种模式:训练和测试。正则化机制,例如 Dropout 和 L1/L2 权重正则化,在测试时被关闭。它们反映在训练时间损失中,但不反映在测试时间损失中。

    此外,Keras 显示的训练损失是当前时期内每批训练数据的损失平均值。因为您的模型会随着时间而变化,所以一个时期的第一批损失通常高于最后一批。这可以降低历元平均值。另一方面,一个时期的测试损失是使用该时期结束时的模型计算的,因此损失较低。

    【讨论】:

      【解决方案2】:

      我不太确定您是否正确使用了model.evaluate 方法。与model.fit 方法类似,在评估您的模型时,您应该提供xy 值。运行此代码 sn-p 时,我得到了非常相似的结果:

      import tensorflow as tf
      from tensorflow.keras import Input
      from tensorflow.keras.layers import Dense
      from tensorflow.keras.utils import plot_model
      
      import numpy as np
      import matplotlib.pyplot as plt
      
      train_x = np.arange(2000)
      m = 5
      b = 4
      train_y = m * train_x + b
      
      # -----------------------------------------------------
      # Create a Sequential Nerual Network
      model = tf.keras.Sequential()
      model.add(Input(shape=(1,), name="input_layer"))
      model.add(Dense(10, activation="relu"))
      model.add(Dense(1, activation=None, name="output_layer"))
      
      # -----------------------------------------------------
      # Compile the model
      model.compile(loss=tf.keras.losses.mae,
                    optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
                    metrics=["mae"])
      
      # -----------------------------------------------------
      # Train the model
      model.fit(train_x, train_y, epochs=5, batch_size=32)
      
      # -----------------------------------------------------
      # Test the model
      test_x = np.arange(2000)
      predict_y = model.predict([test_x])
      # ------------------------------------------------------
      # Evaluation
      print("Evaluate Testing : ", model.evaluate(test_x,  m * test_x + b, batch_size=32))
      
      Epoch 1/5
      63/63 [==============================] - 1s 3ms/step - loss: 4978.4922 - mae: 4978.4922
      Epoch 2/5
      63/63 [==============================] - 0s 3ms/step - loss: 4954.3252 - mae: 4954.3252
      Epoch 3/5
      63/63 [==============================] - 0s 3ms/step - loss: 4929.9980 - mae: 4929.9980
      Epoch 4/5
      63/63 [==============================] - 0s 3ms/step - loss: 4905.5146 - mae: 4905.5146
      Epoch 5/5
      63/63 [==============================] - 0s 3ms/step - loss: 4880.8120 - mae: 4880.8120
      63/63 [==============================] - 0s 2ms/step - loss: 4868.2192 - mae: 4868.2192
      Evaluate Testing :  [4868.21923828125, 4868.21923828125]
      

      由于整个过程的随机性,结果自然会有所不同。

      【讨论】:

      • 是的,你是对的,但为什么evaluate() 方法需要xy,而不是tobserved_ypredicted_y
      • 查看post:“model.evaluate 函数预测给定输入的输出,然后根据 y_true 和 y_pred 计算 model.compile 中指定的度量函数,并返回计算的度量值作为输出 [...] "
      猜你喜欢
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2021-04-02
      • 1970-01-01
      相关资源
      最近更新 更多