Керас: модель. Прогноз не соответствует модели. Потеря оценки

Я применил это руководство https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/23_Time-Series-Prediction.ipynb (в другом наборе данных), турториал не вычислял среднеквадратичную ошибку из отдельных выходных данных, поэтому я добавил следующее строка в функции сравнения:

    mean_squared_error(signal_true,signal_pred)

но потеря и mse из прогноза отличались от потерь и mse из оценки модели на тестовых данных. Ошибки из model.evaluation (Loss, mae, mse) (test-set):

    [0.013499056920409203, 0.07980187237262726, 0.013792216777801514]

ошибка отдельной цели (выходы):

    Target0 0.167851388666284
    Target1 0.6068108648555771
    Target2 0.1710370357827747
    Target3 2.747463225418181
    Target4 1.7965991690103074
    Target5 0.9065426398192563 

Я думаю, что это может быть проблемой при обучении модели, но я не мог найти, где именно она находится. Буду очень признателен за вашу помощь.

Благодарность


person Manal    schedule 26.03.2020    source источник


Ответы (2)


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

  • Некоторые операции, такие как пакетная нормализация, отключены при прогнозировании - это может иметь большое значение для определенных архитектур, хотя обычно этого не должно быть, если вы правильно используете пакетную норму.
  • MSE для обучения усредняется за всю эпоху, в то время как оценка происходит только на последней «лучшей» версии модели.
  • Это может быть связано с различиями в наборах данных, если разбиение не является случайным.
  • Вы можете использовать разные показатели, даже не осознавая этого.

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

person markemus    schedule 26.03.2020
comment
спасибо за ответ, разница в производительности между model.prediction и model.evaluation. Оценка проводилась на тестовом наборе, а прогноз - на том же тестовом наборе. Я рассчитал MSE вручную, используя MSE из keras.metrics, и получил тот же результат. Поэтому я подумал, что это проблема при обучении модели, но я не мог понять, где именно ошибка. - person Manal; 26.03.2020
comment
Обучение проходило с помощью model.fit.generator () и оценки с использованием model.evaluation () на тестовых данных, и я получил почти аналогичные результаты, но прогноз, который также основан на тестовых данных, был с помощью model.prediction () и результаты не соответствовали результатам оценки. - person Manal; 26.03.2020
comment
Я не знаю. Как я уже сказал, это может быть вызвано множеством разных вещей. Если это не создает проблем для тренировки и разница не слишком велика, просто игнорируйте ее. Если это серьезная проблема, вы можете отладить ее, настроив архитектуру модели и посмотрев, как она влияет на результаты. Вы также можете изучить функцию Assessment () и посмотреть, что она делает. Возможно, он использует другую функцию mse, которая дает несколько другие результаты - я видел это раньше. Может быть, кто-нибудь еще сможет дать вам более конкретный совет, но это все, что у меня есть :) - person markemus; 26.03.2020

У меня была такая же проблема, и я нашел решение. Надеюсь, это та же проблема, с которой вы столкнулись.

Оказывается, model.predict не возвращает прогнозы в том же порядке, что и generator.labels, и именно поэтому MSE была намного больше, когда я попытался вычислить вручную (с использованием метрической функции scikit-learn).

>>> model.evaluate(valid_generator, return_dict=True)['mean_squared_error']
13.17293930053711
>>> mean_squared_error(valid_generator.labels, model.predict(valid_generator)[:,0])
91.1225401637833

Мое быстрое и грязное решение:

valid_generator.reset()  # Necessary for starting from first batch
all_labels = []
all_pred = []
for i in range(len(valid_generator)):  # Necessary for avoiding infinite loop
    x = next(valid_generator)
    pred_i = model.predict(x[0])[:,0]
    labels_i = x[1]
    all_labels.append(labels_i)
    all_pred.append(pred_i)
    print(np.shape(pred_i), np.shape(labels_i))

cat_labels = np.concatenate(all_labels)
cat_pred = np.concatenate(all_pred)

Результат:

>>> mean_squared_error(cat_labels, cat_pred)
13.172956865002352

Это можно сделать гораздо элегантнее, но мне этого было достаточно, чтобы подтвердить свою гипотезу о проблеме и восстановить рассудок.

person Shovalt    schedule 17.08.2020