Warum addieren model.egaluate () gegen manuelle Verlustberechnung mit Modell.Predict () in TF.keras nicht?Python

Python-Programme
Anonymous
 Warum addieren model.egaluate () gegen manuelle Verlustberechnung mit Modell.Predict () in TF.keras nicht?

Post by Anonymous »

Ich benutze Keras und Tensorflow, um eine "einfache" Multilayer-Perzeptron (MLP) für eine Regressionsaufgabe zu trainieren, bei der ich den Mittelwert-Quadrat-Fehler (MSE) als Verlustfunktion verwende. Ich bezeichne meine Trainingsdaten als x_train, y_train und meine Testdaten als x_test, y_test . Ich erkannte Folgendes: Für a und b wie folgt definiert:
  • Code: Select all

    A = model.evaluate(x_test, y_test)
    und
  • Code: Select all

    B = loss(pred_test, y_test)
    , wobei pred_test = model.Predict (x_test) die aus meinem Modell erhaltenen Vorhersagen außerhalb der Stichprobe sind
Die Werte für a und b sind (leicht) unterschiedlich. Meine Frage ist, woher der Unterschied kommt und was ich tun kann, so dass die Werte übereinstimmen. Im Folgenden gebe ich ein minimal reproduzierbares Beispiel, in dem ich versuchte, die Antwort selbst zu finden (ohne Erfolg). Mein erster Verdacht war, dass dies durch die Batchwise-Berechnung verursacht wird, nachdem nach einigem Experimentieren mit den Chargengrößen dies nicht der Fall zu sein scheint. Auf dieser Website gibt es verwandte Fragen, aber die Antwort auf diese Frage zum gleichen (?) Problem scheint spezifisch für CNNs zu sein. In der Diskussion in diesem Beitrag wird behauptet, dass der Unterschied durch die batch-wise-Bewertung im Modell verursacht wird. Dies ist sogar der Fall in der Antwort auf den Befragten. Zuletzt gibt es diesen Thread, in dem das Problem durch die Eigenschaft der Metrik verursacht zu sein scheint, dass es sich tatsächlich um eine Variante W.R.T. zu batchgröße. Dies ist jedoch bei MSE!import tensorflow as tf
import keras
import numpy as np
import random as random # for sims and seed setting

random.seed(10)

x = np.random.normal([0, 1, 2], [2,1,4], (200, 3))
y = x[:,0] + 0.01 * np.power(x[:,1], 2) + np.sqrt(np.abs(x[:,2] - 3)) + np.random.normal(0, 1, (200))
y = y[:,np.newaxis]

x_train = x[0:100,:]
y_train = y[0:100,:]
x_test = x[101:200,:]
y_test = y[101:200,:]

# MSE
def MSE(a,b):
return tf.reduce_mean(tf.pow(a - b, 2))

# layers
Inputs_MLP = tf.keras.Input(batch_shape = (100,3), dtype = tf.float32)
Layer1_MLP = tf.keras.layers.Dense(16)(Inputs_MLP)
Outputs_MLP = tf.keras.layers.Dense(1)(Layer1_MLP)

# keras model
model_MLP = tf.keras.Model(Inputs_MLP, Outputs_MLP)
model_MLP.compile(loss = MSE)
history = model_MLP.fit(x = x_train, y = y_train, epochs=5, batch_size = 25)

# evaluation

# out-of-sample
model_MLP.evaluate(x_test, y_test, 100)
# 5.561294078826904
pred_MLP_test = model_MLP.predict(x_test, batch_size = 100)
MSE(pred_MLP_test, y_test)
#

# in-sample
model_MLP.evaluate(x_train, y_train, 100)
# 5.460160732269287
pred_MLP_train = model_MLP.predict(x_train, batch_size = 100)
MSE(pred_MLP_train, y_train)
#
< /code>
Die Bewertung außerhalb der Stichprobe ergibt einmal und auf der anderen Seite 5.561294078826904 5.561294010797092. In diesem Beispiel ist es nur ein kleiner Unterschied, aber es nervt mich immer noch. Auch für ein anderes Beispiel (länger und komplizierter) ist der Unterschied größer. Ich würde mich über jede Hilfe freuen!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post