
После завершения обучения нейросети на основе Keras, PyTorch или другой библиотеки встает задача сохранить модель для последующего использования без повторного обучения. Это особенно важно при работе с объемными датасетами, когда обучение занимает часы или даже дни.
В Keras рекомендуется использовать метод model.save(‘model.h5’), который сохраняет архитектуру, веса и конфигурацию обучения в одном файле. Для загрузки модели применяется load_model(‘model.h5’) из модуля tensorflow.keras.models. Если нужно сохранить только веса, используется model.save_weights().
В PyTorch предпочтительнее сохранять только состояние весов с помощью torch.save(model.state_dict(), ‘model_weights.pth’). При загрузке необходимо предварительно создать объект модели и затем вызвать model.load_state_dict(torch.load(…)). Полное сохранение с архитектурой доступно, но менее надёжно при изменении кода между сессиями.
Для повышения переносимости и стабильности рекомендуется явно фиксировать версии библиотек, а также использовать сериализацию в формате ONNX, если модель планируется интегрировать в другие среды, не связанные с Python. Экспорт в ONNX в PyTorch осуществляется через torch.onnx.export().
Сериализация модели с использованием pickle
Модуль pickle позволяет сохранить обученную модель Python в файл для последующего использования без повторного обучения. Это особенно актуально при работе с моделями, не зависящими от внешней среды, например, классами из scikit-learn или xgboost.
Для сохранения модели в файл:
import pickle
with open('model.pkl', 'wb') as f:
pickle.dump(model, f)
Загрузка модели выполняется так:
with open('model.pkl', 'rb') as f:
model = pickle.load(f)
Формат бинарный, поэтому важно открывать файл в режиме 'wb' или 'rb'. При сохранении сложных пайплайнов стоит удостовериться, что все объекты внутри модели сериализуемы. Некоторые внешние зависимости, например, сессии TensorFlow, не поддерживаются напрямую.
Если необходимо сохранить несколько объектов (например, модель и трансформеры), используйте словарь:
data = {'model': model, 'scaler': scaler}
with open('bundle.pkl', 'wb') as f:
pickle.dump(data, f)
Рекомендуется контролировать версию Python и библиотек, чтобы избежать проблем при загрузке модели в другой среде. Также стоит учитывать риски безопасности: не загружайте файлы, полученные из недоверенных источников, так как pickle.load() может выполнять произвольный код.
Сохранение модели Keras через метод save()

Метод model.save() позволяет сохранить модель Keras в одном файле формата HDF5 или в виде директории, содержащей конфигурацию, веса и оптимизатор отдельно. Это включает архитектуру модели, веса и состояние обучающего процесса, что позволяет восстановить модель без дополнительной настройки.
- Для сохранения в формате HDF5 используется строка с расширением
.h5:model.save('model.h5')Такой файл содержит всё необходимое для дальнейшей загрузки через
keras.models.load_model(). - Если указать путь без расширения
.h5, будет создана директория в формате TensorFlow SavedModel:model.save('saved_model_directory')Подходит для переноса между платформами и использования в TensorFlow Serving.
Перед сохранением модель должна быть собрана и, при необходимости, обучена. Метод сохраняет также состояние оптимизатора, если модель обучалась через fit(). Это позволяет продолжить обучение после загрузки без потери информации о моментуме, шагах и других параметрах оптимизации.
Рекомендуется использовать формат HDF5 для локального сохранения и быстрой загрузки, а формат SavedModel – для интеграции в производственные пайплайны и развёртывания через TensorFlow API.
Экспорт PyTorch-модели с помощью torch.save()
Функция torch.save() сохраняет модель в бинарном формате, используя сериализацию через pickle. Основных подходов два: сохранение только параметров или всей модели.
- Сохранение состояния параметров (рекомендуется):
torch.save(model.state_dict(), "model_weights.pth")
- Создает файл с параметрами, без архитектуры.
- Позволяет гибко загружать параметры в модифицированную модель.
- Требует ручного воссоздания архитектуры при загрузке.
- Сохранение всей модели:
torch.save(model, "full_model.pth")
- Сохраняет модель вместе с архитектурой.
- Более уязвимо к несовместимостям при обновлениях PyTorch.
- Не рекомендуется для долгосрочного хранения.
Файл лучше сохранять с расширением .pth или .pt. Перед экспортом убедитесь, что модель переведена в нужное состояние:
model.eval() # для inference
Если используется CUDA, сохранение с указанием устройства может повысить переносимость:
torch.save(model.state_dict(), "model.pth", _use_new_zipfile_serialization=True)
Сохраняемый путь должен быть доступен для записи, желательно без абсолютных путей внутри кода.
Сохранение структуры и весов модели отдельно

Чтобы сохранить структуру модели отдельно от весов, используйте метод model.to_json() или model.to_yaml() в случае Keras. Полученную строку необходимо записать в файл. Пример для JSON:
from tensorflow.keras.models import model_from_json
# Сохранение структуры
json_config = model.to_json()
with open("model_structure.json", "w") as json_file:
json_file.write(json_config)
# Сохранение весов
model.save_weights("model_weights.h5")
Для восстановления структуры требуется прочитать конфигурационный файл и создать модель с помощью model_from_json():
with open("model_structure.json", "r") as json_file:
loaded_json = json_file.read()
restored_model = model_from_json(loaded_json)
restored_model.load_weights("model_weights.h5")
Если модель использует нестандартные слои или функции активации, необходимо передать аргумент custom_objects при загрузке. Подход с раздельным сохранением особенно полезен при необходимости зафиксировать архитектуру модели и обновлять веса отдельно, например, при дообучении на новых данных.
Использование joblib для сохранения моделей scikit-learn

Модуль joblib оптимизирован для сериализации объектов, содержащих большие массивы NumPy, что делает его предпочтительным для сохранения моделей, обученных с использованием scikit-learn. Он обеспечивает более быструю загрузку по сравнению с pickle, особенно при работе с деревьями решений, случайными лесами и другими алгоритмами, требующими значительных ресурсов.
Для сохранения модели используйте функцию joblib.dump():
from joblib import dump
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
dump(model, 'random_forest_model.joblib')
Для загрузки используйте joblib.load():
from joblib import load
model = load('random_forest_model.joblib')
predictions = model.predict(X_test)
Сохраняйте модель в формате .joblib, чтобы избежать путаницы с другими сериализованными объектами. Не используйте protocol=, так как joblib автоматически применяет подходящий протокол pickle на основе версии Python. Для сохранения нескольких объектов используйте список или словарь:
dump({'model': model, 'scaler': scaler}, 'model_and_scaler.joblib')
Не записывайте объекты, содержащие нестабильные компоненты, например соединения с базами данных или открытые файлы. После загрузки убедитесь, что окружение (версии библиотек, структура входных данных) совпадает с тем, в котором модель была обучена.
Создание пользовательского формата для хранения параметров

Когда необходимо сохранить обученную нейросеть в Python, стандартные форматы, такие как HDF5 или JSON, не всегда обеспечивают нужную гибкость. В этом случае создание собственного формата для хранения параметров модели может быть удобным решением. Для этого можно использовать бинарные файлы, что позволяет значительно снизить объём данных и улучшить производительность при загрузке и сохранении.
В основе пользовательского формата для хранения параметров лежит сериализация данных. В Python для этого можно использовать модуль pickle, но для большего контроля и оптимизации стоит написать свою систему сериализации. Главным преимуществом такого подхода является возможность точно настроить процесс сохранения данных и ускорить его, если это необходимо.
Для создания пользовательского формата важно определить структуру хранения. Каждый параметр нейросети (веса, смещения, гиперпараметры) можно хранить в виде последовательности байтов. Для этого удобно использовать модули struct или numpy, которые позволяют эффективно работать с бинарными данными. Например, можно хранить веса слоёв как одномерные массивы numpy, сериализуя их в бинарный формат.
Пример создания пользовательского формата для хранения параметров модели с использованием numpy:
import numpy as np def save_model(parameters, filename): with open(filename, 'wb') as f: for param in parameters: np.save(f, param) def load_model(filename): parameters = [] with open(filename, 'rb') as f: while True: try: param = np.load(f) parameters.append(param) except EOFError: break return parameters
В данном примере используется np.save для записи данных в бинарный файл. Это гарантирует, что веса и параметры будут сохранены с минимальной потерей производительности. Метод load_model загружает данные поочерёдно, что позволяет эффективно восстанавливать модель.
Для оптимизации сохранения и загрузки можно также использовать индексирование. Например, для каждого слоя можно хранить не только веса, но и метаданные (тип слоя, размерность), что поможет ускорить обработку при загрузке модели.
Создание такого формата подходит для специфических задач, когда нужно повысить скорость или контролировать процесс сериализации данных. Это решение гибкое и легко адаптируется под любые потребности при разработке и эксплуатации нейросетевых моделей.
Загрузка сохранённой модели и проверка её работоспособности

Для загрузки сохранённой модели в Python часто используют библиотеки, такие как TensorFlow или PyTorch. В этой части работы будет показано, как восстановить модель из файла и проверить её на работоспособность.
Если модель была сохранена с помощью TensorFlow, то для её загрузки можно использовать метод tf.keras.models.load_model(). Для PyTorch используется функция torch.load(), после чего требуется загрузить веса в модель. Рассмотрим оба варианта.
Пример загрузки модели в TensorFlow:
from tensorflow.keras.models import load_model
model = load_model('model.h5')
Пример загрузки модели в PyTorch:
import torch
model = torch.load('model.pth')
model.eval()
После загрузки модели необходимо проверить её работоспособность. Для этого лучше всего использовать небольшой тестовый набор данных, похожий на те, что использовались для обучения. Важно, чтобы тестовый набор не был частью исходных данных, чтобы избежать переобучения.
Пример проверки работы модели на тестовых данных в TensorFlow:
test_data = ... # ваш тестовый набор данных
predictions = model.predict(test_data)
print(predictions)
Для PyTorch проверка выполняется так:
test_data = ... # ваш тестовый набор данных
with torch.no_grad():
predictions = model(test_data)
print(predictions)
Если модель загружена правильно и даёт осмысленные результаты, можно считать её работоспособность подтверждённой. Для более точной проверки стоит оценить метрики модели (например, точность или F1-меру) на тестовом наборе.
Вопрос-ответ:
Как сохранить обученную нейросеть в Python?
Для сохранения обученной нейросети в Python часто используют библиотеки, такие как `pickle` или `joblib`. Однако для сохранения моделей глубокого обучения лучше использовать специализированные фреймворки, такие как TensorFlow или PyTorch. В TensorFlow для этого применяется метод `model.save()`, а в PyTorch — сохранение с помощью функции `torch.save()`. Важно правильно сохранить как веса модели, так и её архитектуру, чтобы впоследствии можно было восстановить и использовать нейросеть без потери данных.
Какие форматы файлов обычно используются для сохранения нейросетей?
Наиболее популярные форматы для сохранения моделей нейросетей включают HDF5, PyTorch `.pt` и `.pth` файлы, а также TensorFlow `.h5` или `.pb`. Формат HDF5 (для TensorFlow) позволяет сохранять как веса, так и метаданные, включая архитектуру модели. Для PyTorch используется формат `.pt`, который сохраняет только веса или полный объект модели, включая архитектуру и веса. Эти форматы подходят для переноса обученной модели на другие устройства или для её дальнейшего использования в других проектах.
Что нужно учитывать при сохранении и загрузке модели нейросети?
При сохранении модели важно удостовериться, что сохранены все необходимые компоненты, такие как архитектура и веса, а также возможные параметры, которые могут быть полезны для дальнейшей дообучения или адаптации модели. При загрузке важно учитывать версии библиотек, которые использовались для обучения модели. Иногда модели, сохранённые в одной версии библиотеки, могут не работать в другой версии из-за изменений в API или методах.
Какая разница между сохранением модели в формате PyTorch и TensorFlow?
Основное отличие между сохранением моделей в PyTorch и TensorFlow заключается в их структуре. В TensorFlow модели можно сохранять как в формате `.h5` (для всей модели, включая архитектуру и веса), так и в формате `SavedModel` (директория с файлами, описывающими модель и её веса). В PyTorch сохранение обычно происходит с помощью метода `torch.save()`, и в этом случае сохраняется только состояние модели, без описания её архитектуры, что требует последующего восстановления архитектуры при загрузке. Также стоит отметить, что в TensorFlow можно легко экспортировать модели в формат, совместимый с мобильными устройствами или браузерами, используя TensorFlow Lite или TensorFlow.js.
Как восстановить модель нейросети после её сохранения?
Для восстановления модели, сохранённой в формате TensorFlow, можно использовать метод `tf.keras.models.load_model()`, который загружает модель из файла `.h5` или директории `SavedModel`. В PyTorch для восстановления модели используется функция `torch.load()`, которая загружает сохранённое состояние модели, после чего необходимо заново определить архитектуру модели перед загрузкой весов. Важно помнить, что для корректной загрузки модели должны быть установлены те же версии библиотек, которые использовались при её обучении.
