Почему model.evaluate () по сравнению с ручным вычислением потерь с model.predict () в tf.keras не складываются?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему model.evaluate () по сравнению с ручным вычислением потерь с model.predict () в tf.keras не складываются?

Сообщение Anonymous »

Я использую кера и tensorflow для обучения «простого» многослойного персептрона (MLP) для задачи регрессии, где я использую ошибку среднего квадрата (MSE) в качестве функции потерь. Я обозначаю свои учебные данные как x_train, y_train и мои тестовые данные как x_test, y_test . Я распознал следующее: для и b определено следующим образом:
  • Код: Выделить всё

    A = model.evaluate(x_test, y_test)
    и
  • Код: Выделить всё

    B = loss(pred_test, y_test)
    , где pred_test = model.predict (x_test) -это прогнозы вне выборки, полученные из моей модели,
Значения для и b (немного) отличаются. Мой вопрос заключается в том, откуда приходит разница и что я могу сделать, так что значения совпадают. Ниже я даю минимальный воспроизводимый пример, в котором я сам пытался найти ответ (безуспешно). Мое первое подозрение заключалось в том, что это вызвано пакетным вычислением, после некоторого эксперимента с размерами партии, это, похоже, не имеет значения. На этом веб -сайте есть связанные вопросы, но ответ на этот вопрос о той же (?) Проблемах, по -видимому, специфичен для CNN. Обсуждение в этом посте утверждает, что разница вызвана пакетной оценкой в ​​model.Evaluate , но 1.) Я действительно не вижу, как выбор размера партии должен влиять на результат, поскольку в конце концов, среднее значение все равно построено и 2.) даже если установить размеры партии к количеству выборок, результаты все еще различны . Это даже тот случай в ответе на поступок. Наконец, есть эта поток, где проблема, по -видимому, вызвана свойством метрики, что она на самом деле является вариантом W.R.T. к размерам партии. Тем не менее, это не относится к 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>
Оценка вне выборки дает 5,561294078826904 один раз и, с другой стороны, 5,561294010797092. Для этого примера это всего лишь небольшая разница, но это все еще беспокоит меня. Кроме того, для другого (более длинного и более сложного) примера разница больше. Я был бы признателен за любую помощь!

Подробнее здесь: https://stackoverflow.com/questions/795 ... ct-in-tf-k
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»