簡體   English   中英

Tensorflow 評估給出的誤差大於訓練的最后一個時期

[英]Tensorflow evaluate gives larger error than last epoch of training

我有一個 TensorFlow 回歸 model。 我不認為模型層的細節與問題有關,所以我跳過了。 如果您認為它有用,我可以補充一點。

我用下面的代碼編譯。 損失和度量是均方誤差。

model.compile(
    loss=tf.keras.losses.MeanSquaredError(), optimizer=tf.keras.optimizers.Adam(lr=0.001),
    metrics=['mse']
)

現在,我運行以下代碼來訓練網絡並對其進行評估。 我訓練了 2 個 epoch,然后我使用evaluate方法在相同數據上評估 model,然后使用predict方法和 MSE 公式手動評估它。

print('fit')
model.fit(X, y, epochs=2, batch_size=32)

print('evaluate')
print(model.evaluate(X, y))

print('manual evaluate')
print(((y - model.predict(X).ravel()) ** 2).mean())

結果如下:

3152/3152 [==============================] - 12s 3ms/step - loss: 7.7276 - mse: 7.7275
Epoch 2/2
3152/3152 [==============================] - 11s 4ms/step - loss: 0.9898 - mse: 0.9894
evaluate
3152/3152 [==============================] - 2s 686us/step - loss: 1.3753 - mse: 1.3748
[1.3753225803375244, 1.3747814893722534]
manual evaluate
1.3747820755885116

我有一個輕微的正則化,所以損失比預期的 mse 大一點。

但是,如您所見,MSE 在最后一個時期結束時為 0.98。 但是,當我通過evaluate方法評估它或實際手動計算它時,我得到 1.37 MSE。 據我所知,model 使用最后一個時期之后的權重,所以這兩個數字應該相等,對吧? 我在這里缺少什么? 我嘗試了不同的 batch_size 和 epoch 計數。 在擬合方法的最后一個時期,評估的 MSE 總是高於 MSE。

注: y是一維NumPy數組

y.shape
> (100836,)

編輯:我使用與驗證數據相同的(X, y)運行帶有validation_data參數的fit方法:

model.fit(X, y, epochs=2, batch_size=32, validation_data=(X, y))

Output:

Epoch 1/2
3152/3152 [==============================] - 23s 7ms/step - loss: 7.9766 - mse: 7.9764 - val_loss: 2.0284 - val_mse: 2.0280
Epoch 2/2
3152/3152 [==============================] - 22s 7ms/step - loss: 0.9839 - mse: 0.9836 - val_loss: 1.3436 - val_mse: 1.3431
evaluate
[1.3436073064804077, 1.3430677652359009]

現在,這有點道理。 最后一個時期的val_mse似乎與evaluate結果相匹配。 但是,我希望進度條中的mseval_mse值相同,因為訓練數據和驗證數據是相同的。 我認為我對進度條顯示的內容的理解不正確。 有人可以解釋我應該如何解釋進度條以及為什么進度條上的mseval_mse值不同嗎?

對於相同的數據,在訓練和驗證步驟期間指標(在您的情況下為損失)不同的原因很簡單。 即,在訓練您的model期間,通過將其參數從批次更改為批次。 在進度條中,您會看到所有批次的指標平均值 相反,在驗證步驟期間,您的網絡參數被凍結。 使用的參數是在處理網絡看到的最后一批之后獲得的。 這解釋了差異。

為什么驗證損失被證明是更大的訓練損失的問題是微妙的。 一個原因可能是您的 model 具有在訓練和驗證期間表現不同的層(例如,Frightera 注意到的 BatchNorm)。 另一個原因可能是不正確的學習率。 如果它太大,參數將改變太多,從而跳過真正的最小值。 即使使用亞當優化,情況也可能如此。

要了解問題是否與學習率有關,請嘗試使其更小。 指標的差異是否仍然存在,那么您的網絡在訓練和驗證階段的行為不同。

指標差異可能還有其他原因。 例如,訓練數據有噪聲,導致網絡無法很好地訓練。 這將導致損失在均值附近波動,這是正常的。 要了解是否是這種情況,您應該研究不同批次的損失圖(例如,使用 TensorBoard)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM