Faiss(3):基于IndexIVFPQ的demo程序

本文介绍使用Faiss库构建IVFPQ索引的全过程,包括参数配置、数据集生成、索引创建、训练、添加向量、GPU迁移及搜索。通过对比暴力搜索结果评估索引精确度。

1. 说明

在研究Faiss库一段时间之后,做了一个简单的demo程序。这个程序在CPU环境下进行训练,GPU内进行搜索。使用IndexIVFPQ索引。

由于没有实际的图片库,这里使用numpy生成多维随机数组的方式来模拟数据检索的过程。

1.1 开发环境

参考Faiss(2):编程环境搭建

1.2 程序总体流程

Faiss总体使用过程可以分为三步:

  1. 构建训练数据和查询数据,原始数据集以二维矩阵形式表达,矩阵每一行代表数据库中的一个数据,每一列代表数据库中所有数据的某个特征,每个数据为高维浮点矢量如64维,当数据库中数据量较大时,训练集规模远小于数据库。查询数据与训练数据类型和格式相同。这一步骤是离线进行,更新频率很低。

  2. 挑选合适配置参数建立Index(Faiss的核心部件),从数据库中选取训练数据训练并得到聚类中心向量,数据库数据通过add操作建立Index索引。这部分也是离线,更新频率高于上一步。

  3. Search搜索,距离计算+比较得到最后结果。在线进行,目标是低延迟,高吞吐量。

2. 程序设计

1. 设置参数配置

nb = nb            # dataset numbers
nq = nq            # query numbers
nlist = nlist
nprobe = nprobe
topk = topk
d = 64             # dimension
m = 64             # sub quantizer
nbits = 8          # bits of per code

learning_ratio = lr   # 学习率

程序使用固定为64的维度, 其中nb表示database,本文以1M数据量为例进行说明。

2. 准备测试样本集和训练集

# prep nq test samples
def CreateDataSet(nb, nq, d):
    # dataset
    np.set_printoptions(threshold = np.inf)
    np.random.seed(1234)

    xb = np.random.random((nb, d)).astype('float32')
    xb[:, 0] += np.arange(nb) / int(nb)
    
    # query
    xq = np.</
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翔底

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值