Лучшие веса PyTorch могут измениться после «сохранения». Проверьте одну строку
Присваивание state_dict сохраняет ссылки на тензоры, а не независимый снимок. Разбираем, как удержать выбранное по валидации состояние и проверить его после продолжения обучения.
Вы нашли эпоху с лучшей ошибкой на валидации и записали best = model.state_dict(). Обучение продолжилось, а в конце «лучший» результат почему-то совпал с последним. Проблема может быть в способе хранения: state_dict не создаёт независимый снимок тензоров.
Сначала отделите состояние
В справочнике Module возвращаемый словарь описан как поверхностная копия со ссылками на параметры и постоянные буферы. При изменении этих тензоров их новое содержимое видно и через ранее полученный словарь. Имя best не делает состояние неизменяемым.
Для обычной модели есть два варианта: сразу записать выбранное состояние в файл или сделать глубокую копию в памяти. Именно эти варианты рекомендует руководство по сохранению моделей. Выбирайте с учётом доступной памяти и необходимости пережить остановку процесса: копия в оперативной памяти не заменяет файл.
Короткая проверка механизма
В отдельном учебном окружении можно создать слой с одним весом, сохранить состояние двумя способами и явно изменить вес. Это проверяет общий механизм ссылок, без датасета и долгого обучения:
import copy
import torch
net = torch.nn.Linear(1, 1, bias=False)
live = net.state_dict()
frozen = copy.deepcopy(net.state_dict())
with torch.no_grad():
net.weight.add_(1)
print(torch.equal(live["weight"], net.weight))
print(torch.equal(frozen["weight"], net.weight))Ожидаемый смысл результата: первое сравнение истинно, второе ложно. Глубокая копия удерживает прежнее значение, а live продолжает видеть изменённый вес. Это демонстрационный пример по документированному поведению, а не измерение качества модели.
Как принять сохранённую модель
В реальном цикле обновляйте лучший снимок только при улучшении заранее выбранной метрики. Рядом сохраняйте номер эпохи, значение метрики и версию данных: иначе трудно установить, какой результат вы восстанавливаете.
После обучения загрузите выбранные веса в отдельный экземпляр той же архитектуры и повторите оценку на той же валидационной выборке. Перед инференсом установите eval(), чтобы Dropout и BatchNorm работали в режиме оценки. Критерий успеха — воспроизведённая метрика выбранного состояния, а не наличие переменной с убедительным именем.
Памятка относится к обычному локальному состоянию модели. Для продолжения обучения нужны и другие данные, включая состояние оптимизатора; распределённое сохранение требует своего протокола. Сначала определите, что хотите восстановить: предсказания выбранной модели или весь ход обучения.
Комментарии
Войдите, чтобы оставить комментарий
Пока нет комментариев. Начните обсуждение.