'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。您可以:
- 使用Python的内部
pickle
机制,或者
- 使用
.save(fname)
method native-to model classes in the Gensim package,它使用自己的基于 pickel
和 numpy
的保存格式。例如:
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 表明该方法可能是一个糟糕的方法。
我一直在尝试从 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。您可以:
- 使用Python的内部
pickle
机制,或者 - 使用
.save(fname)
method native-to model classes in the Gensim package,它使用自己的基于pickel
和numpy
的保存格式。例如:
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
是