使用回调加载 Gensim FastText 模型失败
Loading Gensim FastText Model with Callbacks Fails
使用 Gensim 创建 FastText 模型后,我想加载它,但 运行 出现似乎与回调相关的错误。
用于创建模型的代码是
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 中。
使用自定义回调加载模型的额外难度是 known, open issue(至少到 gensim-3.8.1
和 2019 年 10 月)。
你可以在那里看到关于可能的解决方法和修复的讨论——并且 gensim 团队正在考虑完全禁用回调的自动保存,要求为以后的每个回调重新指定它们 train()
/etc需要他们的电话。
您可以通过将相同的回调 类 以相同的名称导入到您正在执行 load()
的代码上下文中,从而加载与自定义回调一起保存的现有模型。
您可以通过将模型的 callbacks
属性 设为空默认值来保存训练模型的无回调版本,就在 save()
之前,例如:
model.callbacks = ()
model.save(save_path)
然后,您不需要在 load()
之前对自定义 类 进行任何特殊导入。 (当然,如果您再次需要在重新加载的模型上使用回调功能,则必须在 load()
之后显式重新建立它们)。
使用 Gensim 创建 FastText 模型后,我想加载它,但 运行 出现似乎与回调相关的错误。
用于创建模型的代码是
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 中。
使用自定义回调加载模型的额外难度是 known, open issue(至少到 gensim-3.8.1
和 2019 年 10 月)。
你可以在那里看到关于可能的解决方法和修复的讨论——并且 gensim 团队正在考虑完全禁用回调的自动保存,要求为以后的每个回调重新指定它们 train()
/etc需要他们的电话。
您可以通过将相同的回调 类 以相同的名称导入到您正在执行 load()
的代码上下文中,从而加载与自定义回调一起保存的现有模型。
您可以通过将模型的 callbacks
属性 设为空默认值来保存训练模型的无回调版本,就在 save()
之前,例如:
model.callbacks = ()
model.save(save_path)
然后,您不需要在 load()
之前对自定义 类 进行任何特殊导入。 (当然,如果您再次需要在重新加载的模型上使用回调功能,则必须在 load()
之后显式重新建立它们)。