【问题标题】:Load a saved Doc2Vec model in Colab在 Colab 中加载保存的 Doc2Vec 模型
【发布时间】:2023-11-24 21:26:01
【问题描述】:

我已经在 colab 中使用 doc2vec 训练并保存了一个模型

model = gensim.models.Doc2Vec(vector_size=size_of_vector, window=10, min_count=5, workers=16,alpha=0.025, min_alpha=0.025, epochs=40)
model.build_vocab(allXs)
model.train(allXs, epochs=model.epochs, total_examples=model.corpus_count)

模型保存在我的驱动器无法访问但我可以看到的文件夹中:

from os import listdir
from os.path import isfile, getsize
from operator import itemgetter

files = [(f, getsize(f)) for f in listdir('.') if isfile(f)]
files.sort(key=itemgetter(1), reverse=True)

for f, size in files:
    print ('{} {}'.format(size, f))
print ('({} files {} total size)'.format(len(files), sum(f[1] for f in files)))

输出是:

79434928 Model_after_train.docvecs.vectors_docs.npy
9155086 Model_after_train
1024 .rnd
(3 files 88591038 total size)

将两个文件移动到与笔记本相同的共享目录中

folder_id = FolderID

for f, size in files:
  if 'our_first_lda' in f:  
    file = drive.CreateFile({'parents':[{u'id': folder_id}]})
    file.SetContentFile(f)
    file.Upload()

我现在面临的问题有两个: 1) gensim 在保存模型时会创建两个文件。我应该加载哪个?

2) 当我尝试加载文件或其他文件时:

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
# 1. Authenticate and create the PyDrive client.
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

from googleapiclient.discovery import build
drive_service = build('drive', 'v3')

file_id = FileID


import io
from googleapiclient.http import MediaIoBaseDownload

request = drive_service.files().get_media(fileId=file_id)
downloaded = io.BytesIO()
downloader = MediaIoBaseDownload(downloaded, request)
done = False
while done is False:
  _, done = downloader.next_chunk()
model = doc2vec.Doc2Vec.load(downloaded.read())

我无法加载出现错误的模型:

TypeError: file() argument 1 must be encoded string without null bytes, not str

有什么建议吗?

【问题讨论】:

    标签: python gensim google-colaboratory doc2vec


    【解决方案1】:

    我从未使用过gensim,但从查看文档来看,我认为是这样的:

    1. 您将获得两个文件,因为您传递了 separately=True to save,这会将输出中的大型 numpy 数组保存为单独的文件。您需要复制两个文件。

    2. 基于load docs,你想传递一个文件名,不是文件的内容。因此,当从云端硬盘获取文件时,保存到文件中,并将mmap='r' 传递给load

    如果这不能让您启动并运行,那么查看一个完整的示例(例如使用假数据)会很有帮助。

    【讨论】:

    • separately 的默认值为None。但是,从文档看来,“如果 None - 自动检测正在存储的对象中的大型 numpy/scipy.sparse 数组,并将它们存储到单独的文件中”,这是非常违反直觉的。另一种可能性是使用list of str,它似乎再次创建了两个单独的文件:“如果 str 列表 - 此属性将存储在单独的文件中,在这种情况下不执行自动检查”。但是,尝试separately='list of str' 我得到TypeError: cannot concatenate 'str' and 'list' objects
    最近更新 更多