Как сохранить то, чему научилась сеть
После обучения сеть XOR правильно отвечает на все четыре булевы пары. Но если закрыть программу, созданные в памяти объекты исчезнут. При следующем запуске новый вызов конструктора создаст новую модель с начальными параметрами. Чтобы пользоваться результатом обучения дальше, нужно сохранить найденные числа, а затем восстановить их в подходящей модели.
Здесь полезно вспомнить различие архитектуры и параметров. Архитектура — это описание слоёв и порядка вычислений: в нашем случае два входа, скрытый слой из четырёх нейронов с ReLU и два выхода. Параметры — конкретные веса и смещения, найденные при обучении. Можно сравнить архитектуру с устройством музыкального инструмента, а параметры — с его настройкой. Сохранённая настройка пригодна лишь для совместимого устройства; сама по себе она не сообщает, как соединены его части.
Метод model.state_dict() возвращает именованный набор состояния модели. В нашей сети это веса и смещения двух линейных слоёв; у других модулей в такой набор могут входить и дополнительные сохраняемые тензоры, называемые буферами. Команда torch.save записывает этот набор, а torch.load читает его обратно. Затем load_state_dict помещает значения в уже созданную модель с совместимым устройством.
В следующем примере весь путь собран в одном блоке: мы обучим сеть, запомним её выходы, сохраним параметры и загрузим их в новый экземпляр. Вместо файла на диске используем io.BytesIO — область памяти, которая ведёт себя как двоичный файл. Так можно продемонстрировать сохранение без выбора папки. Вызов buffer.seek(0) возвращает позицию чтения в начало записанных данных. При загрузке map_location="cpu" направляет тензоры на процессор, а weights_only=True ограничивает загрузку предназначенными для такого сценария объектами.