Лучший способ сохранить обученную модель в PyTorch?
Я искал альтернативные способы сохранить обученную модель в PyTorch. До сих пор я нашел две альтернативы.
факел.сохранить() для сохранения модели и факел.нагрузки() для загрузки модели.
модель.state_dict () для сохранения обученной модели и модель.load_state_dict () для загрузки сохраненной модели.
я наткнулся на это обсуждение где подход 2 рекомендуется за 1 подход.
мой вопрос в том, почему предпочтителен второй подход? Это только потому, что факел.nn модули имеют эти две функции, и нам рекомендуется их использовать?
2 ответов:
Я нашел на этой странице на их репозитории github я просто вставлю содержимое здесь.
рекомендуемый подход для сохранения модели
есть два основных подхода к сериализации и восстановления модели.
первый (рекомендуется) сохраняет и загружает только параметры модели:
torch.save(the_model.state_dict(), PATH)позже:
the_model = TheModelClass(*args, **kwargs) the_model.load_state_dict(torch.load(PATH))второй сохраняет и загружает всю модель:
torch.save(the_model, PATH)затем позже:
the_model = torch.load(PATH)однако в этом случае сериализованные данные привязываются к определенным классам и точная структура каталогов используется, поэтому он может сломаться различными способами, когда использованы в других проектах, или после серьезных операций рефакторинга.
это зависит от того, что вы хотите сделать.
Случай № 1: сохраните модель, чтобы использовать ее самостоятельно для вывода: вы сохраняете модель, восстанавливаете ее, а затем меняете модель на режим оценки. Это делается потому, что у вас обычно есть
BatchNormиDropoutслои, которые по умолчанию находятся в режиме поезда на конструкции:torch.save(model.state_dict(), filepath) #Later to restore: model.load_state_dict(torch.load(filepath)) model.eval()случай № 2: сохраните модель, чтобы возобновить обучение позже: Если вам нужно продолжать обучение модели, которую вы собираетесь сохранить, нужно сохранить больше, чем просто модель. Вы также должны сохранять состояние оптимизатор, эпох, результат и т. д. Вы бы сделали это так:
state = { 'epoch': epoch, 'state_dict': model.state_dict(), 'optimizer': optimizer.state_dict(), ... } torch.save(state, filepath)чтобы возобновить обучение, вы будете делать такие вещи, как:
state = torch.load(filepath), а затем, чтобы восстановить состояние каждого отдельного объекта, что-то вроде этого:model.load_state_dict(state['state_dict']) optimizer.load_state_dict(state['optimizer'])так как вы возобновляете обучение,НЕ вызов
model.eval()после восстановления состояния при загрузке.Дело № 3: Модель для использования кем-то другим без доступа к вашему коду: В Tensorflow вы можете создать
.pbфайл, который определяет как архитектуру, так и вес модели. Это очень удобно, особенно при использованииTensorflow serve. Эквивалентный способ сделать это в Pytorch будет:torch.save(model, filepath) # Then later: model = torch.load(filepath)этот способ все еще не является пуленепробиваемым, и поскольку pytorch все еще претерпевает много изменений, я бы не рекомендовал его.
Comments