Для регрессионной модели, почему набор проверки, переданный для model.fit, имеет другой результат metri c, чем model.evaluate? - PullRequest
1 голос
/ 21 февраля 2020

У меня есть модель регрессии с расстоянием Euclidean в качестве функции потерь и RMSE в качестве оценки метри c (чем ниже, тем лучше). Когда я проезжал поезд, тестовые наборы равнялись model.fit, у меня train_rmse и test_rmse, значения которых для меня имели смысл. Но когда я сдаю тестовые наборы в model.evalute после загрузки веса обученной модели, я получаю разные результаты, которые примерно вдвое превышают результат model.fit. И я знаю о разнице, которая должна произойти между оценкой поезда и оценкой теста, поскольку я знаю из Keras, что:

потеря обучения - это среднее значение потерь по каждой партии данных обучения. Поскольку ваша модель со временем меняется, потери за первые партии эпохи обычно выше, чем за последние партии. С другой стороны, тестовые потери для эпохи вычисляются с использованием модели в том виде, как она есть в конце эпохи, что приводит к меньшим потерям.

Но здесь я говорю о результате Набор тестов, переданный Model.fit, в котором я поверил, оценивается по окончательной модели. В документации Keras они сказали в аргументе валидации, что я передаю набор тестов:

validation_data: Данные, по которым нужно оценивать потери, и любые метрики модели в конце каждой эпохи. Модель не будет обучаться на этих данных.

Когда я искал проблему, я обнаружил несколько проблем

1- Некоторые люди, такие как здесь сообщают, что это проблема связана с самой моделью, если у них есть уровень пакетной нормализации, или если вы переносите обучение и замораживаете некоторые слои BN, например здесь . моя модель имеет слои BN, и я не замораживал ни один слой. Кроме того, я использовал ту же модель для задачи классификации мультикласса (не регрессии), и результат был таким же для набора тестов в model.fit и model.evaluate.

2- Другие люди, подобные, сказали, что это связано либо с прогнозом, либо с вычислением метри c, например здесь , в котором они обнаружили, что эта разница связана с разным dtype для y_true и y_pred, если кто-то является float32 и другим float64, например, тогда расчет метри c будет другим. Когда они унифицировали dtype, проблема была исправлена.

Я полагал, что последний случай применяется ко мне, так как в задаче регрессии мои метки теперь - tf.float32. Мои ярлыки y_true уже разыграны с tf.float32 до tfrecord, поэтому я попытался привести y_pred к tf.float32 до вычисления rmse, и у меня все еще есть разница в результате.

Так что мой вопросы:

  1. Почему эта разница в результатах
  2. На кого мне следует положиться в тестовом наборе, на model.fit результат или model.evalute
  3. Я знаю, что для потери и точности обучения keras делает промежуточное среднее по партиям, и я знаю, что для model.evalute эти метри c рассчитываются путем однократного взятия всего набора данных в окончательной модели. Но как потери и точность проверки, рассчитанные для набора проверки, передаются в model.fit?

ОБНОВЛЕНИЕ: Проблема заключалась в конфликте форм между y_true и y_pred. Что касается метки y_true, я сохраняю ее в tfrecords как одиночное значение с плавающей запятой и в конечном итоге получу размер [batch_size], тогда как регрессионная модель дает прогноз в виде [batch_size, 1], а затем результат tf.subtract(y_true, y_pred) в уравнении rmse приведет к матрице [batch_size, batch_sizze], и, взяв среднее значение этого окончательного значения, вы никогда не догадаетесь, что это неправильно, и код не выдаст никакой ошибки, но вычисление rmse будет неверным. Я все еще работаю над согласованием формы, но все еще не нашел хорошего решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...