TypeError:在方法“IndexIDMap_add_with_ids”中,类型为“faiss::IndexIDMapTemplate< faiss::Index >::idx_t c

Posted

技术标签:

【中文标题】TypeError:在方法“IndexIDMap_add_with_ids”中,类型为“faiss::IndexIDMapTemplate< faiss::Index >::idx_t const *”的参数 4【英文标题】:TypeError: in method 'IndexIDMap_add_with_ids', argument 4 of type 'faiss::IndexIDMapTemplate< faiss::Index >::idx_t const *' 【发布时间】:2021-08-29 13:20:36 【问题描述】:

我正在尝试使用预训练的 bert 模型和转换器进行语义搜索。我正在使用 Facebook AI 库 Faiss。

代码是:

encoded_data = model.encode(df.Plot.tolist())
encoded_data = np.asarray(encoded_data.astype('float32'))
index = faiss.IndexIDMap(faiss.IndexFlatIP(768))
index.add_with_ids(encoded_data, np.array(range(0, len(encoded_data))))
faiss.write_index(index, 'movie_plot.index')

它返回的错误是:

TypeError                                 Traceback (most recent call last)
<ipython-input-19-c09b9ccadf2a> in <module>
----> 1 index.add_with_ids(encoded_data, np.array(range(0, len(encoded_data))))
      2 faiss.write_index(index, 'movie_plot.index')

~\t5\lib\site-packages\faiss\__init__.py in replacement_add_with_ids(self, x, ids)
    233 
    234         assert ids.shape == (n, ), 'not same nb of vectors as ids'
--> 235         self.add_with_ids_c(n, swig_ptr(x), swig_ptr(ids))
    236 
    237     def replacement_assign(self, x, k, labels=None):

~\t5\lib\site-packages\faiss\swigfaiss.py in add_with_ids(self, n, x, xids)
   4950 
   4951     def add_with_ids(self, n, x, xids):
-> 4952         return _swigfaiss.IndexIDMap_add_with_ids(self, n, x, xids)
   4953 
   4954     def add(self, n, x):

TypeError: in method 'IndexIDMap_add_with_ids', argument 4 of type 'faiss::IndexIDMapTemplate< faiss::Index >::idx_t const *'

当我在 google colab 中运行相同的程序时,没有返回错误。我现在在 Windows 10 本地电脑上运行这个程序

我得到了答案,我们必须将 np.array(range(0, len(encoded_data))) 转换为 int64

encoded_data = model.encode(df.Plot.tolist())
encoded_data = np.asarray(encoded_data.astype('float32'))
index = faiss.IndexIDMap(faiss.IndexFlatIP(768))
ids = np.array(range(0, len(df)))
ids = np.asarray(ids.astype('int64'))
index.add_with_ids(encoded_data, ids)
faiss.write_index(index, 'movie_plot.index')

【问题讨论】:

我建议添加您的解决方案作为答案。允许并鼓励原始发帖者在找到解决方案时回答自己的问题。 【参考方案1】:

在完成np.asarray(encoded_data) 之后,您可能会转换encoded_data.astype('float32'),例如:

np.asarray(encoded_data).astype('float32')

【讨论】:

encoded_data 已转换为 float32。实际的答案是,我们必须将 np.array(range(0, len(df))) 转换为 int64 类型【参考方案2】:

Faiss add_with_ids() 只接受 np.int64 dtype 的 id。 我没有找到这种数据类型要求的 Python 文档,但是这个链接 https://faiss.ai/cpp_api/struct/structfaiss_1_1Index.html(虽然它是在 c++ 中)显示了它的 id 数据类型。

【讨论】:

以上是关于TypeError:在方法“IndexIDMap_add_with_ids”中,类型为“faiss::IndexIDMapTemplate< faiss::Index >::idx_t c的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:对象不支持此属性或方法

AngularJS指令元素方法绑定-TypeError:无法使用'in'运算符在1中搜索'functionName'

方法返回字符串时获取 TypeError

获取TypeError:无法在mysql node.js中调用null的方法'releaseConnection'

api调用在一种方法中工作但在另一种方法中不起作用---TypeError:无法读取未定义的属性'getResponse'

angular2 http.post 方法抛出 typeerror 异常