Вопрос или проблема
Я сохранял историю обучения в 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"
Решение
-
Сохранение истории обучения:
При обучении модели, объект
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)
-
Загрузка сохраненной истории:
Для корректной загрузки данных из файла
.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
, используйте соответствующий способ загрузки, описанный выше. Если файл сохранён без него, вероятно, восстановление данных невозможно, и придётся запускать обучение заново.
Этот подход позволит вам минимизировать потерю данных и обеспечить целостность сохранённых файлов.