[英]FAISS with C++ indexing 512D vectors
我有一組 512D std::vector 來存儲人臉嵌入。 我創建索引並對數據子集進行訓練。
int d = 512;
size_t nb = this->templates.size() // 95000
size_t nt = 50000; // training data size
std::vector<float> training_set(nt * d);
faiss::IndexFlatIP coarse_quantizer(d);
int ncentroids = int(4 * sqrt(nb)));
faiss::IndexIVFPQ index(&coarse_quantizer,d,ncentroids,4,8);
std::vector<float> training_set(nt*d);
this->templates 在 [0] 中具有索引值,在 [1] 中具有 512D 向量。 我的問題是關於培訓和索引。 我目前有這個:
int v=0;
for (auto const& element : this->templates)
{
std::vector<double> enrollment_template = element.second;
for (int i=0;i<d;i++){
training_set[(v*d)+i] = (float)enrollment_template.at(i);
v++;
}
index.train(nt,training_set.data());
這是將 512D 矢量數據添加到 Faiss 進行訓練的正確方法嗎?
這是一種更有效的編寫方法:
int v = 0;
for (auto const& element : this->templates)
{
auto& enrollment_template = element.second; // not copy
for (int i = 0; i < d; i++) {
training_set[v] = enrollment_template[i]; // not at()
v++;
}
}
我們避免使用auto& enrollment_template
的副本,避免使用enrollment_template[i]
進行額外分支(您知道您不會越界),並通過將v
設為元素數而不是行數來簡化使用training_set[v]
的地址計算。
如果可以將templates
更改為存儲浮點數而不是雙精度數,則可以提高效率——那么您只需按位復制 512 個浮點數,而不是將雙精度數轉換為浮點數。
此外,請務必將d
聲明為constexpr
,以便為編譯器提供優化循環的最佳機會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.