У меня есть модель регрессии с расстоянием 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
, и у меня все еще есть разница в результате.
Так что мой вопросы:
- Почему эта разница в результатах
- На кого мне следует положиться в тестовом наборе, на
model.fit
результат или model.evalute
- Я знаю, что для потери и точности обучения 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
будет неверным. Я все еще работаю над согласованием формы, но все еще не нашел хорошего решения.