Загрузка модели Gensim FastText с ошибками обратного вызова - PullRequest
0 голосов
/ 04 октября 2019

После создания модели FastText с использованием Gensim я хочу загрузить ее, но сталкиваюсь с ошибками, которые, по-видимому, связаны с обратными вызовами.

Код, используемый для создания модели:

TRAIN_EPOCHS = 30
WINDOW = 5
MIN_COUNT = 50
DIMS = 256

vocab_model = gensim.models.FastText(sentences=model_input,
                                     size=DIMS,
                                     window=WINDOW,
                                     iter=TRAIN_EPOCHS,
                                     workers=6,
                                     min_count=MIN_COUNT,
                                     callbacks=[EpochSaver("./ftchkpts/")])

vocab_model.save('ft_256_min_50_model_30eps')

, а обратный вызов EpochSaver определяется как

from gensim.models.callbacks import CallbackAny2Vec

class EpochSaver(CallbackAny2Vec):
    '''Callback to save model after each epoch and show training parameters '''

    def __init__(self, savedir):
        self.savedir = savedir
        self.epoch = 0
        os.makedirs(self.savedir, exist_ok=True)

    def on_epoch_end(self, model):
        savepath = os.path.join(self.savedir, f"ft256_{self.epoch}e")
        model.save(savepath)
        print(f"Epoch saved: {self.epoch + 1}")
        if os.path.isfile(os.path.join(self.savedir, f"ft256_{self.epoch-1}e")):
            os.remove(os.path.join(self.savedir,  f"ft256_{self.epoch-1}e"))
            print("Previous model deleted ")
        self.epoch += 1

Помимо типа модели, этоидентичен моему процессу для Word2Vec, который работал без проблем. Однако, когда я открываю другой файл и пытаюсь загрузить модель с

from gensim.models import FastText
vocab = FastText.load(r'vocab/ft_256_min_50_model_30eps')

, меня приветствует ошибка

AttributeError: Can't get attribute 'EpochSaver' on <module '__main__'>

Что я могу сделать, чтобы загрузить словарь, чтобы я мог создать слой встраивания для моей модели keras? Если это актуально, это происходит в JupyterLab.

1 Ответ

0 голосов
/ 04 октября 2019

Эта дополнительная сложность при загрузке моделей с пользовательскими обратными вызовами - это известный открытый номер (по крайней мере, до gensim-3.8.1 и октября 2019 года).

Вы можете увидеть обсуждения возможных обходных путей и исправлений там - и команда gensim рассматривает возможность просто отключить автосохранение обратных вызовов, требуя их повторного указания для каждого последующего вызова train() / etcэто нуждается в них.

Вы можете загрузить существующие модели, сохраненные с вашими пользовательскими обратными вызовами, импортировав те же классы обратного вызова, что и те же имена, в контекст кода, где вы делаете load().

Вы можете сохранить версии своих обученных моделей без обратного вызова, указав для свойства callbacks модели пустое значение по умолчанию непосредственно перед save(), например:

model.callbacks = ()
model.save(save_path)

Тогдавам не нужно было бы делать какой-либо специальный импорт пользовательских классов до load(). (Конечно, если вам снова понадобится функция обратного вызова в перезагруженной модели, их необходимо будет явно восстановить после load()).

...