我有一個非常簡單的神經網路,它作業在250個時代,在過去的時代它顯示了mae = 0.1397,但是如果我試圖讓model.evaluate((m * test_x b), predict_y))那么美約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))
uj5u.com熱心網友回復:
我不太確定您是否model.evaluate正確使用了該方法。與該model.fit方法類似,在評估模型時,您應該提供x和y值。運行此代碼片段時,我得到了非常相似的結果:
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]
由于整個程序的隨機性,結果自然會略有不同。
uj5u.com熱心網友回復:
您可以手動評估結果:
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 顯示的訓練損失是當前時期內每批訓練資料的平均損失。由于您的模型隨著時間的推移而發生變化,因此一個 epoch 的第一批的損失通常高于最后一批的損失。這可以降低時代平均水平。另一方面,一個 epoch 的測驗損失是使用模型計算的,因為它在 epoch 結束時,導致較低的損失。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/346298.html
上一篇:這兩個模型定義彼此不同嗎?
