Перейти к содержимому
НейроКуб
Открытый материал · 2 мин
Марк Суть

Лучшие веса 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 работали в режиме оценки. Критерий успеха — воспроизведённая метрика выбранного состояния, а не наличие переменной с убедительным именем.

Памятка относится к обычному локальному состоянию модели. Для продолжения обучения нужны и другие данные, включая состояние оптимизатора; распределённое сохранение требует своего протокола. Сначала определите, что хотите восстановить: предсказания выбранной модели или весь ход обучения.

Комментарии

Пока нет комментариев. Начните обсуждение.