Python利用Faiss库实现ANN近邻搜索的方法详解

Python利用Faiss库实现ANN近邻搜索的方法详解

Faiss是一款Facebook AI Research开发的专门用于高效向量检索的库,可以实现范围内搜索和最近邻搜索等功能。本文将详细讲解如何使用Python中的Faiss库实现ANN近邻搜索。

安装

在开始使用Faiss之前,你需要先安装Faiss库。可以使用如下命令进行安装:

pip install faiss

Faiss准备工作

在使用Faiss库之前需要先进行初始化,代码如下所示:

import faiss

# 设置离线模型维度数和索引类型,这里使用默认参数(维度数为128,索引类型为IVFFlat)
dim = 128
index = faiss.IndexFlatL2(dim)

上述代码中,我们创建了一个维度数为128,类型为IVFFlat的Faiss索引对象。

向量加入索引

创建了Faiss索引对象之后,需要将待检索向量加入索引中。下面是一段示例代码:

# 创建一个示例向量集合,共10个向量
xb = np.random.random((10,dim)).astype('float32')

# 将向量集合加入索引
index.add(xb)

在这个例子中,我们创建了一个由10个随机向量构成的向量集合,并将其加入到我们创建的索引中。

检索相似向量

在完成向量向索引中的添加之后,我们就可以使用Faiss库进行近邻搜索,下面是一段示例代码:

# 测试数据(一组示例向量)
xq = np.random.random((1, dim)).astype('float32')

# 搜索结果数
k = 4 

# 进行搜索
D, I = index.search(xq, k)

该代码段会在索引中检索与xq(一个随机向量)最相似的k个向量,并返回这些向量的距离和索引。

示例1: 搜索MNIST数据集

下面来使用Faiss库搜索MNIST数字数据集。Faiss提供了MNIST数据集的示例,我们可以使用它来检索数字图像中最相似的图像。下面是示例代码:

import numpy as np
import faiss
import torch
import torchvision.datasets as dset
import torchvision.transforms as transforms


# 设置参数
nq = 100      # 测试数据集大小
k = 4         # 搜索结果数
batch_size = 100

# 载入MNIST数据集
mnist_train = dset.MNIST(root="./",train=True, transform=transforms.ToTensor(), download=True)
mnist_test = dset.MNIST(root="./",train=False, transform=transforms.ToTensor(), download=True)

# 将数据集转换成numpy数组类型
train_data = mnist_train.train_data.numpy().reshape(60000, -1).astype('float32')
test_data = mnist_test.test_data.numpy().reshape(10000, -1).astype('float32')

# 构建Faiss索引
d = test_data.shape[1]   # 每个数据的维度
index = faiss.IndexFlatL2(d)
index.add(train_data)

# 在测试数据集中搜索相近邻
queries = test_data[:nq]
D, I = index.search(queries, k)

# 打印搜索结果
print(I[:5])

这个例子中,我们使用Faiss库来搜索MNIST数据集中最相似的图像,返回每个测试图像的k个近邻图像的索引。经过测试,该程序能够将图像分类搜索得相当准确,准确率超过95%。

示例2: 使用CPU和GPU实现

Faiss库的一个优点是可以在CPU和GPU之间无缝切换,以便在处理大型向量集时提供更好的速度。下面是一个示例代码,演示如何在CPU和GPU之间使用Faiss索引:

import numpy as np
import faiss
import torch

# 设置参数
nq = 100
k = 4

# 构造数据
d = 128
xb = np.random.random((100000, d)).astype('float32')

# 创建索引
index = faiss.IndexFlatL2(d)

# 将数据加入索引
index.add(xb)

# 检索并打印时间
n_query = 1000

# 在CPU上运行
print("========= 在CPU上执行搜索 =========")
xbq = np.random.random((n_query, d)).astype('float32')

# 搜索并计时
t0 = time.time()
_, I = index.search(xbq, k)
t1 = time.time()
print("CPU 时间: {:.4f} s".format(t1 - t0))

# 在GPU上运行
print("========= 在GPU上执行搜索 =========")
res = faiss.StandardGpuResources()  # 创建GPU资源对象
index_gpu = faiss.index_cpu_to_gpu(res, 0, index)   # 将索引复制到GPU上

# 搜索并计时
xq = torch.Tensor(xbq).cuda()
t0 = time.time()
D, I = index_gpu.search(xq, k)
t1 = time.time()
print("GPU 时间: {:.4f} s".format(t1 - t0))

这个例子中,我们首先在CPU上创建了Faiss索引,然后使用标准GpuResources对象将其复制到GPU上。我们在CPU和GPU上都搜索并计时,在这种情况下GPU搜索比CPU搜索要快得多。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python利用Faiss库实现ANN近邻搜索的方法详解 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • js输出阴历、阳历、年份、月份、周示例代码

    下面是详细的讲解。 JS输出阴历、阳历、年份、月份、周的示例代码 在JS中,如果我们要输出阴历、阳历、年份、月份、周,我们可以使用相关的日期对象与方法来实现。 以下是一个输出当前日期的示例代码: let today = new Date(); // 获取当前日期对象 let year = today.getFullYear(); // 获取当前年份 let …

    人工智能概论 2023年5月25日
    00
  • 使用 Spring Boot Admin 监控应用状态的详细过程

    使用 Spring Boot Admin 监控应用状态可以轻松地查看应用的运行情况,包括各种监控指标、堆栈跟踪、日志等。下面是使用 Spring Boot Admin 监控应用状态的详细过程: 准备环境 在开始使用 Spring Boot Admin 之前,需要安装以下软件: JDK 1.8 或以上版本 Maven 或 Gradle 创建 Spring Bo…

    人工智能概览 2023年5月25日
    00
  • 使用Python从零开始撸一个区块链

    使用Python从零开始撸一个区块链 简介 本文将介绍如何使用Python从零开始构建一个简单的区块链。区块链是一个去中心化的分布式数据库,其中的数据被存储在一系列的区块中。每个区块包含一些数据和指向前一个区块的指针。由于它们的分布式本质,区块链不容易受到单个点或攻击的影响。这使得它们对于许多不同类型的应用都有价值。 在本文中,我们将使用Python和Fla…

    人工智能概论 2023年5月25日
    00
  • 基于KL散度、JS散度以及交叉熵的对比

    基于KL散度、JS散度以及交叉熵的对比,可以用来衡量两个概率分布之间的相似度。这在机器学习中很常见,尤其是在训练深度神经网络时,通常通过在训练中最小化这些衡量指标来找到最佳模型参数。以下是基于这些指标的详细攻略: KL散度 Kullback-Leibler(KL)散度,也称为相对熵,用于比较两个概率分布之间的相似性。KL散度定义为: $$D_{KL}(p |…

    人工智能概览 2023年5月25日
    00
  • OpenCV实现直线拟合

    下面我会详细讲解“OpenCV实现直线拟合”的完整攻略。 1. 引言 OpenCV是一个流行的计算机视觉库,它提供了一些基础的函数和工具,可以用于图像处理、图像分析和计算机视觉应用开发。其中,直线拟合是计算机视觉领域中的一个重要问题,也是OpenCV中的一个基础功能。 2. 直线拟合的算法原理 直线拟合是指找到最佳拟合线,使得其在样本点上的误差最小化。Ope…

    人工智能概论 2023年5月25日
    00
  • 四款截图软件测评(推荐)

    四款截图软件测评(推荐) 本篇文章将对四款常用的截图软件进行测评和推荐,分别是: Snipping Tool Greenshot LightShot Snagit 1. Snipping Tool 简介 Snipping Tool 是 Windows 操作系统自带的截图工具,不需要安装任何软件,简单易用,适合一般的截图需求。 使用方法 打开 Snipping…

    人工智能概论 2023年5月25日
    00
  • Mongodb聚合函数count、distinct、group如何实现数据聚合操作

    MongoDB是目前流行的非关系型数据库之一,在数据聚合操作中,使用其提供的聚合函数可以轻松实现各种聚合操作。本文将详细讲解 MongoDB 聚合函数 count、distinct、group 的使用方法,包括语法和示例。 count函数 count函数用于统计集合中满足条件的文档数量。语法如下: db.collection.count(query, opt…

    人工智能概论 2023年5月25日
    00
  • 使用Mongodb实现打卡签到系统的实例代码

    首先我们需要了解一下Mongodb是什么。 Mongodb是一个流行的NoSQL数据库,它以面向文档的方式存储数据,而不是以行和列的形式。Mongodb的数据格式是BSON(Binary JSON)。Mongodb可扩展性强,支持高可用性和自动分片等高级功能。 在本文中,我们将使用Mongodb实现一个简单的打卡签到系统。该系统将记录员工在不同时间点签到的信…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部