'Doc2Vec' 对象没有属性 'outputs',同时为 tensorflow 服务保存 doc2vec

'Doc2Vec' object has no attribute 'outputs', while saving doc2vec for tensorflow serving

我一直在尝试从 github 中保存电影推荐模型,然后使用 tf-serving 进行服务。 下面的代码将首先从我的语料库中创建一个标签列表,然后根据这些列表向我提供向量

mv_tags_doc = [TaggedDocument(words=(D), tags=[str(i)]) for i, D in enumerate(mv_tags_corpus)]

max_epochs = 50
vec_size = 20
alpha = 0.025

model = Doc2Vec(alpha=alpha, 
               min_alpha=0.00025,
               min_count=1,
               dm=0) # paragraph vector distributed bag-of-words (PV-DBOW)
 
model.build_vocab(mv_tags_doc)

print('Epoch', end = ': ')
for epoch in range(max_epochs):
 print(epoch, end = ' ')
 model.train(mv_tags_doc,
             total_examples=model.corpus_count,
             epochs=model.epochs)
 # decrease the learning rate
 model.alpha -= 0.0002
 # fix the learning rate, no decay
 model.min_alpha = model.alpha

当我尝试使用可用文档保存它时 here

import tempfile

MODEL_DIR = tempfile.gettempdir()
version = 1
export_path = os.path.join(MODEL_DIR, str(version))
print('export_path = {}\n'.format(export_path))

tf.keras.models.save_model(
    model,
    export_path,
    overwrite=True,
    include_optimizer=True,
    save_format=None,
    signatures=None,
    options=None
)

print('\nSaved model:')
!ls -l {export_path}

我收到这个错误

AttributeError                            Traceback (most recent call last)
/tmp/ipykernel_563154/3914941631.py in <module>
      6 print('export_path = {}\n'.format(export_path))
      7 
----> 8 tf.keras.models.save_model(
      9     model,
     10     export_path,

~/anaconda3/lib/python3.9/site-packages/keras/utils/traceback_utils.py in error_handler(*args, **kwargs)
     65     except Exception as e:  # pylint: disable=broad-except
     66       filtered_tb = _process_traceback_frames(e.__traceback__)
---> 67       raise e.with_traceback(filtered_tb) from None
     68     finally:
     69       del filtered_tb

~/anaconda3/lib/python3.9/site-packages/keras/saving/saving_utils.py in try_build_compiled_arguments(model)
    319 def try_build_compiled_arguments(model):
    320   if (not version_utils.is_v1_layer_or_model(model) and
--> 321       model.outputs is not None):
    322     try:
    323       if not model.compiled_loss.built:

AttributeError: 'Doc2Vec' object has no attribute 'outputs'

我不希望 tf.keras.models.suave_model() 函数——从它的命名听起来是特定于 TensorFlow 和 Keras 的——在 Gensim Doc2Vec 模型上工作,它不是其中的一部分,或者与 TensorFlow 或 Keras 相关或基于其构建。

查看 docs for save_model(),我看到它声明的功能是:

Saves a model as a TensorFlow SavedModel or HDF5 file.

“TensorFlow SavedModel”和“HDF5 文件”都不应被视为足以保存另一个项目的自定义模型(在本例中为 Gensim Doc2Vec 对象)的格式,除非它明确声明这是一种能力。所以这里的某种失败或错误是预期的行为。

如果您的真正目标是稍后能够 re-load 模型,则根本不要涉及 TensorFlow/Keras。您可以:

  1. 使用Python的内部pickle机制,或者
  2. 使用 .save(fname) method native-to model classes in the Gensim package,它使用自己的基于 pickelnumpy 的保存格式。例如:
filename = 'my_doc2vec_model'
initial_model.save(filename)

请注意,此类保存可能分布在几个并排的相关文件中,所有文件都以您提供的相同字符串开头,应将它们放在一起。 (也就是说,在上面的代码之后,一定要将所有以字符串 'my_doc2vec_model' 开头的文件放在一起。)

然后您 re-load 通过在预期模型上调用 .load() class:

reloaded_model = Doc2Vec.load(filename)

另外:您的 Doc2Vec 代码显示了许多不良做法。使用如此低的 min_count=1 几乎总是一个坏主意,使用这种算法会减慢训练速度并恶化结果。在自己多次调用 .train() 的循环中,自己递减 alpha。无论 template/tutorial 表明该方法可能是一个糟糕的方法。