pytorch-metric-learning

GitHub
6.3k 661 非常简单 1 次阅读 今天MIT开发框架其他图像
AI 解读 由 AI 自动生成,仅供参考

pytorch-metric-learning 是一个基于 PyTorch 构建的开源库,旨在让开发者轻松地在应用中实现深度度量学习。它主要解决了传统方法中损失函数编写复杂、难例挖掘(Mining)逻辑难以复用以及实验流程繁琐等痛点,将原本需要大量自定义代码的环节封装为标准化模块。

该工具非常适合从事人脸识别、图像检索、聚类分析等领域的 AI 研究人员和深度学习开发者使用。无论是希望快速复现前沿论文算法的科研人员,还是需要在生产环境中构建高效特征提取系统的工程师,都能从中受益。

其核心亮点在于高度的模块化与灵活性。库内包含了损失函数、难例挖掘器、距离度量等九大独立模块,用户既可以单独调用某个组件嵌入现有代码,也能组合它们构建完整的训练测试工作流。例如,它可以自动计算批次内的所有三元组,或配合特定的挖掘策略智能筛选出“最难”的正负样本对,从而显著提升模型收敛速度和最终精度。此外,它还内置了常用数据集的下载接口,并提供了丰富的 Google Colab 示例笔记,帮助用户零门槛上手,极大地降低了深度度量学习的开发与实验成本。

使用场景

某电商初创公司的算法团队正在构建一个“以图搜图”功能,旨在让用户上传商品照片即可快速找到库中视觉相似的同款或替代品。

没有 pytorch-metric-learning 时

  • 损失函数实现繁琐:工程师需手动编写复杂的 Triplet Loss 代码,不仅要处理锚点、正负样本对的排列组合,还要小心避免梯度计算错误,开发周期长达数周。
  • 难例挖掘效率低下:缺乏现成的挖掘策略(Miner),模型容易收敛于简单样本,导致在面对外观极其相似的竞品时区分度不足,检索准确率卡在瓶颈。
  • 实验迭代成本高昂:每当想尝试新的损失函数(如 ArcFace)或调整挖掘策略时,都需要重构大量训练循环代码,难以快速验证不同方案的效果。
  • 数据预处理重复造轮子:团队需自行编写脚本下载和整理 CUB200 等标准基准数据集,用于验证模型基础性能,浪费了宝贵的研发时间。

使用 pytorch-metric-learning 后

  • 模块化极速集成:只需几行代码即可调用内置的 TripletMarginLossSubCenterArcFaceLoss,将原本数周的损失函数开发工作缩短至几小时,且无需担心底层数学实现错误。
  • 智能难例挖掘提升精度:直接接入 MultiSimilarityMiner 等模块,自动在训练批次中筛选出高难度的正负样本对,显著提升了模型对细微视觉差异的敏感度,检索命中率大幅提升。
  • 灵活配置加速迭代:得益于其高度解耦的设计,团队可以像搭积木一样随意组合不同的损失函数与挖掘器,一天内即可完成多种架构方案的对比实验。
  • 内置数据集一键加载:利用新增的 Datasets 模块,一键下载并加载 Stanford Online Products 等行业标准数据集,快速建立了可靠的模型评估基准。

pytorch-metric-learning 通过模块化设计将深度度量学习的门槛降至最低,让团队能从繁琐的代码工程中解脱,专注于核心业务效果的优化。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

未说明(依赖 PyTorch 环境,可选配 faiss-gpu 以加速评估)

内存

未说明

依赖
notes核心库仅要求 torch>=1.6。若需使用评估和日志功能(with-hooks),需安装非官方的 faiss-gpu 或 faiss-cpu、record-keeper 和 tensorboard。测试模块需要单独安装 faiss。Windows 用户安装时可能需要指定特定版本的 torch 和 torchvision。
python未说明
torch>=1.6
numpy
scikit-learn
tqdm
torchvision
faiss (可选,用于测试模块)
pytorch-metric-learning hero image

快速开始

PyTorch度量学习

PyPi版本 Anaconda版本

最新消息

8月17日: v2.9.0

12月11日: v2.8.0

文档

Google Colab示例

请参阅examples文件夹,其中包含可下载或在Google Colab上运行的笔记本。

PyTorch度量学习概述

该库包含9个模块,每个模块都可以独立地集成到您现有的代码库中,也可以组合使用以实现完整的训练/测试流程。

high_level_module_overview

损失函数的工作原理

在训练循环中使用损失函数和挖掘器

让我们初始化一个普通的TripletMarginLoss

from pytorch_metric_learning import losses
loss_func = losses.TripletMarginLoss()

要在训练循环中计算损失,需要将模型计算出的嵌入向量和对应的标签传入。嵌入向量的形状应为(N, embedding_size),标签的形状应为(N),其中N是批次大小。

# 您的训练循环
for i, (data, labels) in enumerate(dataloader):
	optimizer.zero_grad()
	embeddings = model(data)
	loss = loss_func(embeddings, labels)
	loss.backward()
	optimizer.step()

TripletMarginLoss会根据您传入的标签,在批次内计算所有可能的三元组。同标签的嵌入构成锚点-正样本对,不同标签的则构成锚点-负样本对。

有时添加一个挖掘器会有帮助:

from pytorch_metric_learning import miners, losses
miner = miners.MultiSimilarityMiner()
loss_func = losses.TripletMarginLoss()

# 您的训练循环
for i, (data, labels) in enumerate(dataloader):
	optimizer.zero_grad()
	embeddings = model(data)
	hard_pairs = miner(embeddings, labels)
	loss = loss_func(embeddings, labels, hard_pairs)
	loss.backward()
	optimizer.step()

在上述代码中,挖掘器会找到它认为特别困难的正样本和负样本对。请注意,尽管TripletMarginLoss是以三元组为基础的,但也可以传入成对的数据。这是因为该库会在必要时自动将成对数据转换为三元组,或将三元组转换为成对数据。

自定义损失函数

损失函数可以通过距离度量规约器正则化器进行定制。下图中,挖掘器找到了批次内困难样本的索引,这些索引用于从距离对象计算出的距离矩阵中提取对应值。对于这张图来说,损失函数是基于成对计算的,因此它会为每一对样本计算损失。此外,还提供了一个正则化器,这样就可以为批次中的每个嵌入计算正则化损失。成对损失和单个元素的损失会被传递给规约器,在这张图中,规约器只保留高值的损失。最后,对高值的成对损失和元素损失分别求平均,并相加得到最终的损失。

high_level_loss_function_overview

下面是一个自定义TripletMarginLoss的例子:

from pytorch_metric_learning.distances import CosineSimilarity
from pytorch_metric-learning.reducers import ThresholdReducer
from pytorch_metric-learning.regularizers import LpRegularizer
from pytorch_metric_learning import losses
loss_func = losses.TripletMarginLoss(distance = CosineSimilarity(), 
				     reducer = ThresholdReducer(high=0.3), 
			 	     embedding_regularizer = LpRegularizer())

这个自定义的三元组损失具有以下特性:

  • 损失将使用余弦相似度而非欧氏距离来计算。
  • 所有高于0.3的三元组损失都将被丢弃。
  • 嵌入将接受L2正则化。

将损失函数用于无监督/自监督学习

为自监督学习提供了一个SelfSupervisedLoss包装器:

from pytorch_metric_learning.losses import SelfSupervisedLoss
loss_func = SelfSupervisedLoss(TripletMarginLoss())

# 您的训练循环
for i, data in enumerate(dataloader):
	optimizer.zero_grad()
	embeddings = your_model(data)
	augmented = your_model(your_augmentation(data))
	loss = loss_func(embeddings, augmented)
	loss.backward()
	optimizer.step()

如果您对MoCo-风格的自监督感兴趣,请查看MoCo on CIFAR10笔记本。它使用CrossBatchMemory来实现动量编码器队列,这意味着您可以使用任何成对损失函数和成对挖掘器从队列中提取困难样本。

库的其余部分亮点

  • 如果您想以一种便捷的方式训练模型,请查看训练器
  • 想在数据集上测试模型的准确率吗?试试测试器
  • 要直接计算嵌入空间的准确率,可以使用AccuracyCalculator

如果您时间有限,想要一个完整的训练/测试流程,可以查看示例 Google Colab 笔记本

如需了解更多关于上述内容的信息,请参阅文档

安装

所需的 PyTorch 版本

  • pytorch-metric-learning >= v0.9.90 需要 torch >= 1.6
  • pytorch-metric-learning < v0.9.90 没有版本要求,但已在 torch >= 1.2 上进行过测试

其他依赖:numpy, scikit-learn, tqdm, torchvision

Pip

pip install pytorch-metric-learning

获取最新开发版本

pip install pytorch-metric-learning --pre

在 Windows 上安装

pip install torch===1.6.0 torchvision===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html
pip install pytorch-metric-learning

安装带有评估和日志记录功能的版本

(这将安装 faiss-gpu 的非官方 pypi 版本,以及 record-keeper 和 tensorboard):

pip install pytorch-metric-learning[with-hooks]

安装带有评估和日志记录功能的 CPU 版本

(这将安装 faiss-cpu 的非官方 pypi 版本,以及 record-keeper 和 tensorboard):

pip install pytorch-metric-learning[with-hooks-cpu]

Conda

conda install -c conda-forge pytorch-metric-learning

要使用测试模块,您需要 faiss,也可以通过 conda 安装。请参阅 faiss 的安装说明

基准测试结果

请参阅 powerful-benchmarker 查看基准测试结果并使用该工具。

开发

开发工作在 dev 分支上进行:

git checkout dev

单元测试可以使用默认的 unittest 库运行:

python -m unittest discover

您可以使用环境变量指定测试的数据类型和设备。例如,要在 CPU 上使用 float32 和 float64 进行测试:

TEST_DTYPES=float32,float64 TEST_DEVICE=cpu python -m unittest discover

如果只想运行单个测试文件而不是整个测试套件,可以指定文件名:

python -m unittest tests/losses/test_angular_loss.py

代码使用 blackisort 格式化:

pip install black isort
./format_code.sh

致谢

贡献者

感谢所有提交拉取请求的贡献者!

贡献者 亮点
domenicoMuscill0 - ManifoldLoss
- P2SGradLoss
- HistogramLoss
- DynamicSoftMarginLoss
- RankedListLoss
mlopezantequera - 使测试器能够在任意查询集和参考集的组合上运行
- 使AccuracyCalculator能够处理任意标签比较
cwkeam - SelfSupervisedLoss
- VICRegLoss
- 向AccuracyCalculator添加了平均倒数排名准确率
- BaseLossWrapper
ir2718 - ThresholdConsistentMarginLoss
- SmoothAPLoss
- Datasets模块
marijnl - BatchEasyHardMiner
- TwoStreamMetricLoss
- GlobalTwoStreamEmbeddingSpaceTester
- 使用trainers.TwoStreamMetricLoss的示例
chingisooinar SubCenterArcFaceLoss
elias-ramzi HierarchicalSampler
fjsj SupConLoss
AlenUbuntu CircleLoss
interestingzhuo PNPLoss
wconnell 学习scRNAseq度量嵌入
mkmenta 改进了get_all_triplets_indices(修复了INT_MAX错误)
AlexSchuy 优化了utils.loss_and_miner_utils.get_random_triplet_indices
JohnGiorgi utils.distributed中的all_gather
Hummer12007 utils.key_checker
vltanh 使InferenceModel.train_indexer能够接受数据集
btseytlin InferenceModel中的get_nearest_neighbors
mlw214 AccuracyCalculator添加了return_per_class
layumi InstanceLoss
NoTody 帮助在分布式包装器中添加了ref_embref_labels
ElisonSherton 修复了ArcFaceLoss中的一个边缘情况。
stompsjo 改进了NTXentLoss的文档。
Puzer 修复了PNPLoss中的一个错误。
elisim 对DistributedLossWrapper进行了开发者层面的改进。
lucamarini22
marcpaga
GaetanLepage
z1w
thinline72
tpanum
fralik
joaqo
JoOkuma
gkouros
yutanakamura-tky
KinglittleQ
martin0258
michaeldeyzel
HSinger04
rheum
bot66

Facebook AI

感谢Facebook AI的Ser-Nam Lim,以及我的研究导师Serge Belongie教授。这个项目始于我在Facebook AI的实习期间,当时我从Ser-Nam及其计算机视觉和机器学习工程师、研究科学家团队那里获得了宝贵的反馈。特别要感谢Ashish ShahAustin Reiter,他们在项目早期阶段对我的代码进行了评审。

开源仓库

本库包含从以下优秀开源仓库改编和修改的代码:

标志

感谢Jeff Musgrave设计了标志。

引用本库

如果您希望在论文中引用 pytorch-metric-learning,可以使用以下 BibTeX 格式:

@article{Musgrave2020PyTorchML,
  title={PyTorch Metric Learning},
  author={Kevin Musgrave and Serge J. Belongie and Ser-Nam Lim},
  journal={ArXiv},
  year={2020},
  volume={abs/2008.09164}
}

版本历史

v2.9.02025/08/17
v2.8.12024/12/11
v2.8.02024/12/11
v2.7.02024/11/02
v2.6.02024/07/24
v2.5.02024/04/01
v2.4.12023/12/16
v2.4.02023/12/16
v2.3.02023/07/25
v2.2.02023/06/18
v2.1.22023/05/27
v2.1.12023/05/03
v2.1.02023/04/05
v2.0.12023/02/21
v2.0.02023/01/29
v1.7.32023/01/29
v1.7.22023/01/21
v1.7.12023/01/17
v1.7.02023/01/16
v1.6.32022/11/01

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架