Если вы предоставляете корпус sentences
для экземпляра класса, как это сделал ваш код, вам не нужно вызывать train()
.Это уже будет сделано автоматически, и ваш второй train()
будет лишним.(Я рекомендую выполнять все такие операции с включенным ведением журналов на уровне INFO и просматривать lgos после каждого запуска, чтобы понять, что происходит - такие вещи, как два полных тренинга от начала до конца, должны выделяться в журналах.)
Случай, когда вы бы явно вызвали train()
, - это если вы хотите больше контролировать промежуточные этапы.Вы оставляете sentences
вне класса-экземпляра, но тогда вам необходимо выполнить два явных шага: оба - один вызов build_vocab()
(для начального сканирования словаря) и затем один вызов train()
(для фактическогомногоэпоховое обучение).
В этом случае вы можете использовать нативный генсим .save()
для сохранения модели после открытия словаря, чтобы получить модель, которая готова к повторному обучению и не нуждается всообщите об этом шаге.
Таким образом, вы можете многократно перезагружать эту модель словаря для разных переменных, чтобы тренироваться по-разному.Для некоторых мета-параметров модели - например, window
или даже dm
mode - вы можете даже напрямую изменять их значения в модели после построения словарного запаса, чтобы попробовать разные варианты.
Однако, если есть какие-либо изменения в словах / частотах корпуса или других параметрах, которые влияют на инициализацию, которая происходит во время build_vocab()
(например, вектор size
), то инициализация будет завершенасинхронизации с конфигурацией, которую вы пытаетесь, и вы можете получить странные ошибки.
В таком случае лучше всего повторить шаг build_vocab()
полностью.(Вы также можете заглянуть в исходный код, чтобы увидеть отдельные шаги, выполняемые build_vocab()
, и просто пропатчить / повторить шаги инициализации, которые необходимы, но это требует глубокого знакомства с кодом.)