内容导读
从度量学习到深度度量学习,本文介绍了一个 PyTorch 中的程序包,它能够极大简化应用深度度量学习的难度。
本文首发自微信公众号「PyTorch 开发者社区」
度量学习(Metric Learning)是机器学习过程中常常用到的一种办法,它能够借助一系列观测,结构出对应的度量函数, 从而学习数据间的间隔或差别,无效地形容样本之间的类似度。
CUB200 数据集样本示例,常被用作度量学习的 benchmark
这个度量函数对于类似度高的观测值,会返回一个小的间隔值;对于差别微小的观测值,则会返回一个大的间隔值。
当样本量不大时,度量学习在解决分类工作的准确率和高效率上,展现出了显著劣势。
DML:为多类别、小样本分类而生
然而,如果要解决的分类工作十分复杂, 具备多类别、小样本等特色时,联合深度学习和度量学习的深度度量学习 ((Deep Metric Learning,简称 DML)),才是真正的王者。
深度度量学习又被称为间隔度量学习(Distance Metric Learning)。 相较于度量学习,深度度量学习能够对输出特色做非线性映射。
通过训练一个基于 CNN 的非线性特征提取模块或编码器,深度度量学习能够将提取的图像特色(Embedding)嵌入到近邻地位,同时借助欧氏间隔、cosine 等间隔度量办法,将不同的图像特色辨别开来。
接下来,深度度量学习再联合 k 最近邻、反对向量机等分类算法, 就能够在不思考类别数量的根底上,利用提取的图像特色,来实现指标辨认工作了。
import numpy as np
# 随机定义 A, B 两个向量
A = np.random.randn(10)
B = np.random.randn(10)
# 欧几里得间隔 (Euclidean distance)
dist = np.square(np.sum(A - B)**2)
# 曼哈顿间隔 (Manhattan distance)
dist = np.sum(np.abs(A - B))
# 切比雪夫间隔 (Chebyshev distance)
dist = np.max(np.abs(A - B))
# cosine 间隔
similarity = (np.sum(A * B))/(np.linalg.norm(A)) / (np.linalg.norm(A))
深度度量学习中的罕用间隔函数
深度度量学习在 CV 畛域的一些极其分类工作(类别泛滥、样本量有余)中体现优异, 利用遍布人脸识别、行人重辨认、图像检索、指标跟踪、特色匹配等场景。
以往要在程序中应用深度度量学习,次要依赖工程师从零到一写代码,不光耗时久还容易出 bug。 当初则能够依赖一个封装了多个罕用模块的开源库, 间接进行调用,省时省力。
PML:让深度度量学习大海捞针
pytorch-metric-learning(PML)是一个开源库,能够让各种繁琐简单的深度度量学习算法,变得更加简略敌对。
pytorch-metric-learning 具备两大特点
1、易于应用
只需增加 2 行代码,就能够在程序中应用度量学习;调用单个函数,就能够开掘 pairs 和 triplets。
2、高度灵便
交融了 loss、miner、trainer 等多个模块,能够在已有代码中实现各种算法组合。
PML 包含 9 个模块,每个模块既能够独自应用,也能够组合成一个残缺的训练 / 测试 workflow
pytorch-metric-learning 中的 9 大模块
1、Loss: 能够利用的各种损失函数
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())
自定义损失函数 TripletMarginLoss 代码示例
2、Distance: 包含计算 pairwise distance 或输出 embedding 之间相似性的各种类别
3、Reducer: 从几个损失值变为单个损失值
4、Regularizer: 对权重和嵌入向量进行正则化
5、Miner:PML 提供两种类型的开掘函数: 子集批处理 miner 及 tuple miner
from pytorch_metric_learning import miners, losses
miner = miners.MultiSimilarityMiner()
loss_func = losses.TripletMarginLoss()
# your training loop
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()
用 Tripletmurginloss 损失函数增加开掘性能
6、Sampler:_torch.utils.data.Sampler_ 类的扩大,决定样本的 batch 的组成状态
7、Trainer: 提供对度量学习算法的拜访,如数据加强、附加网络等
8、Tester: 输出模型和数据集,找到基于最近邻的准确度指标(应用该模块须要装置 faiss 安装包)
9、Util:
- _AccuracyCalculator_:给定一个 query 和推理嵌入向量(reference embedding),计算数个准确度指标
- _Inference model_:_utils.inference_ 蕴含用于在 batch 或一组 pair 中,找到匹配对(matching pairs)的类
- _Logging Preset_:提供日志数据 hook,模型训练、验证和存储期间的提前进行日志。
损失函数能够自定义应用 Distance、Reducer 及 Regularizer 三个模块
PML 上手实际
PyTorch 版本要求
pytorch-metric-learning v0.9.90 版本及以上:torch ≥ 1.6
pytorch-metric-learning v0.9.90 版本以下:没有版本要求,然而测试版本 torch ≥ 1.2
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 版本
pip install pytorch-metric-learning[with-hooks]
或 faiss-CPU
pip install pytorch-metric-learning[with-hooks-cpu]
Conda
conda install pytorch-metric-learning -c metric-learning -c pytorch
GitHub 地址:
https://github.com/KevinMusgr…
Google Colab:
https://github.com/KevinMusgr…
相干论文:
https://arxiv.org/pdf/2008.09…
参考:
http://html.rhhz.net/tis/html…
https://analyticsindiamag.com…