Сохранение и загрузка объекта keras.callbacks.History с помощью np.save и np.load

Вопрос или проблема

Я сохранял историю обучения в keras следующим образом:

history = model.fit(X_train, Y_train, epochs=700, batch_size=128,validation_data=(X_cv, Y_cv))

np.save('./history_sim#', history)

Затем я пытаюсь загрузить историю обучения из различных симуляций, чтобы напечатать графики, такие как потеря по эпохам, и т.д. следующим образом:

history = np.load('history_sim#.npy')

Когда я пытаюсь загрузить историю обучения, я получаю следующее сообщение об ошибке:

"ValueError: Unknown metric function:precision"

Я очень обеспокоен тем, что потерял всю историю обучения. Обучение занимает несколько дней, и у меня немного времени. Данные потеряны или есть какой-то способ получить данные из файла .npy, где я их сохранил?

Я уже понял, что это отлично работает, если сохранить/загрузить следующим образом:

np.save('./history_sim#', history.history)
np.load('history_sim#').item()

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

Спасибо!

Дополнительная информация:

import keras_metrics

# Расчет точности для второй метки.
precision = keras_metrics.precision(label=1)

# Расчет полноты для первой метки.
recall = keras_metrics.recall(label=0)

opt = Adam(lr=0.05, beta_1=0.9, beta_2=0.999, decay=0.0)
model.compile(loss="binary_crossentropy", optimizer=opt, metrics=[precision, recall])

используйте allow_pickle=True в np.load

>>>np.save("a.npy",his)
>>>item = np.load("a.npy",allow_pickle=True).item()

Не проверено, но у меня недостаточно репутации, чтобы комментировать:

Возможно, сначала вам нужно преобразовать history в массив numpy.

import numpy
numpy_history = numpy.array(history)
numpy.save("loss_history", numpy_history)

Ответ или решение

Чтобы решить вашу проблему с сохранением и загрузкой объекта keras.callbacks.History, давайте разберёмся с тем, как правильно сохранить и восстановить историю обучения модели, особенно учитывая специфику использования np.save и np.load.

Проблема

Вы сохраняли объект history непосредственно как файл с расширением .npy:

np.save('./history_sim#', history)

При попытке загрузить этот файл вы получали ошибку:

"ValueError: Unknown metric function:precision"

Решение

  1. Сохранение истории обучения:

    При обучении модели, объект keras.callbacks.History, возвращаемый методом model.fit(), хранит в себе полезные данные, особенно в атрибуте .history, который является словарём. Именно этот атрибут содержит историю потери и метрик, зафиксированных во время обучения.

    history = model.fit(X_train, Y_train, epochs=700, batch_size=128, validation_data=(X_cv, Y_cv))
    np.save('./history_sim#', history.history)
  2. Загрузка сохраненной истории:

    Для корректной загрузки данных из файла .npy, следует использовать параметр allow_pickle=True в функции np.load:

    history_dict = np.load('history_sim#.npy', allow_pickle=True).item()

Причина Ошибки

Ошибка, с которой вы столкнулись, скорее всего вызвана тем, что при попытке сохранить объект целиком, в нём оставались ссылочные объекты и функции (например, ваши метрики precision и recall), которые не поддерживаются в простом бинарном формате .npy. Указание параметра allow_pickle=True позволяет Python корректно обрабатывать сложные объекты, но в вашем случае сохранять всю историю через атрибут .history — более простой и надёжный подход.

Дальнейшие действия

  • Для новых тренировок: Продолжайте работать с history.history. Это облегчит процесс сохранения и загрузки данных.

  • Для старых данных: Если вы каким-то образом все же сохраняли их с использованием параметра allow_pickle=True, используйте соответствующий способ загрузки, описанный выше. Если файл сохранён без него, вероятно, восстановление данных невозможно, и придётся запускать обучение заново.

Этот подход позволит вам минимизировать потерю данных и обеспечить целостность сохранённых файлов.

Оцените материал
Добавить комментарий

Капча загружается...