关于pytorch:PyTorch-深度度量学习无敌-Buff九大模块随意调用

40次阅读

共计 3388 个字符,预计需要花费 9 分钟才能阅读完成。

内容导读

从度量学习到深度度量学习,本文介绍了一个 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…

正文完
 0