簡體   English   中英

FAISS 與 C++ 索引 512D 向量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM