我一直在嘗試從 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
當我嘗試使用此處提供的檔案保存它時
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'
uj5u.com熱心網友回復:
我不希望這個tf.keras.models.suave_model()函式——從它的命名聽起來是特定于 TensorFlow 和 Keras——在 GensimDoc2Vec模型上作業,它不是 TensorFlow 或 Keras 的一部分,也不相關,也不建立在 TensorFlow 或 Keras 之上。
查看檔案save_model(),我看到它宣告的功能是:
將模型另存為 TensorFlow SavedModel 或 HDF5 檔案。
“TensorFlow SavedModel”和“HDF5 檔案”都不應該被認為是足夠的格式來保存另一個專案的自定義模型(在本例中是 GensimDoc2Vec物件),除非它明確聲稱這是一種能力。所以這里的某種失敗或錯誤是預期的行為。
如果您的真正目標是稍后能夠重新加載模型,則根本不要涉及 TensorFlow/Keras。您可以:
- 使用 Python 的內部
pickle機制,或者 - 使用
.save(fname)Gensim 包中的 native-to 模型類方法,它使用自己的基于pickel-and-numpy的保存格式。例如:
filename = 'my_doc2vec_model'
initial_model.save(filename)
請注意,此類保存可能會分布在多個相關檔案中,所有檔案都以您提供的相同字串開頭,應保存在一起。(也就是說,在上面的代碼之后,一定要把所有以字串開頭的檔案'my_doc2vec_model'放在一起。)
.load()然后,您可以通過呼叫預期的模型類來重新加載:
reloaded_model = Doc2Vec.load(filename)
另外:您的 Doc2Vec 代碼顯示了許多不良做法。使用這種min_count=1演算法幾乎總是一個壞主意,會減慢訓練速度并惡化結果。alpha并且在你自己的回圈呼叫中.train()多次遞減你自己是不必要的復雜和容易出錯的。建議該方法的任何模板/教程都可能是一個糟糕的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/432289.html
