TensorFlow-similarity 学习笔记2

宰坚
2023-12-01

TensorFlow-similarity 学习笔记2

2021SC@SDUSC
学习内容:Tensorflow Similarity Supervised Learning Hello World
目录:similarity/examples/supervised_hello_world.ipynb
TensorFlowSimilarity 是一个专注于让相似学习快捷简便的python库。

本学习笔记演示了如何使用TensorFlow Similarity在一小部分MNIST classes的基础上来训练SimilarityModel(),这个模型能够从MNIST数据集中查询和提取出相似的图片

DATA preparation

我们将加载 MNIST 数据集并将我们的训练数据限制为 10 个类中的 N 个(默认为 6 个),以展示模型如何从训练期间未见过的类中找到类似的示例。该模型无需重新训练即可将匹配推广到未见过的类的能力是我们希望使用metric learning的主要原因之一。
警告:TensorFlowSimilarity期望 y_train 是一个 IntTensor,其中包含每个示例的类 ID,而不是传统上用于多类分类的标准分类编码。
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
要有效地学习相似性模型,每批必须包含每个类至少 2 个示例。
为了方便做到这一点,tf_similarity提供Samplers(),使我们能够设置每批次的类数和每个类的最小示例数。在这里,我们正在创建一个MultiShotMemorySampler(),它允许您采样内存内数据集,并提供每个类的多个示例。
TensorFlowSimilarity提供各种samplers,以满足不同的要求,包括用于Single-shot学习的SingleShotMemorySampler(),直接与 TensorFlow 数据集目录集成的 TFDatasetMultiShotMemorySampler()和 TFRecordDatasetSampler() 允许我们从存储在磁盘上的非常大的数据集(TFRecords shards)中取样。

CLASSES = [2, 3, 1, 7, 9, 6, 8, 5, 0, 4]
NUM_CLASSES = 6  #@param {type: "slider", min: 1, max: 10}
CLASSES_PER_BATCH = NUM_CLASSES
EXAMPLES_PER_CLASS = 6 #@param {type:"integer"}
STEPS_PER_EPOCH = 1000 #@param {type:"integer"}

sampler = MultiShotMemorySampler(x_train, y_train, 
                                 classes_per_batch=CLASSES_PER_BATCH, 
                                 examples_per_class_per_batch=EXAMPLES_PER_CLASS,
                                 class_list=CLASSES[:NUM_CLASSES], # Only use the first 6 classes for training.
                                 steps_per_epoch=STEPS_PER_EPOCH)

The initial batch size is 36 (6 classes * 6 examples per class) with 0 augmenters

filtering examples:   0%|          | 0/60000 [00:00<?, ?it/s]

selecting classes:   0%|          | 0/6 [00:00<?, ?it/s]

gather examples:   0%|          | 0/36963 [00:00<?, ?it/s]

indexing classes:   0%|          | 0/36963 [00:00<?, ?it/s]

MNIST DATABASE

The MNIST database of handwritten digits, available from this page,
has a training set of 60,000 examples, and a test set of 10,000
examples. It is a subset of a larger set available from NIST. The
digits have been size-normalized and centered in a fixed-size image.
It is a good database for people who want to try learning techniques
and pattern recognition methods on real-world data while spending
minimal efforts on preprocessing and formatting.

Metric Learning

什么是度量学习

机器学习的许多方法都需要测量数据点之间的距离。传统上,从业者会使用域的优先知识选择标准距离度量(欧几里德、城市块、Cosine 等)。但是,通常很难设计适合特定数据和感兴趣任务的指标。
距离指标学习(或简约的公制学习)旨在以机器学习的方式自动构建来自(弱)受监督数据的任务特定距离指标。然后,学习的距离指标可用于执行各种任务(例如 k-NN 分类、聚类、信息检索)。

问题集

指标学习问题分为两个主要类别,具体取决于培训数据可用的监督类型:

监督学习:该算法可以访问一组数据点,每个数据点都属于标准分类问题中的类(标签)。从广义上讲,此设置的目标是学习一个距离度量,将同一标签的点紧密地放在一起,同时推开具有不同标签的点。
Weak监督学习:该算法只能访问一组数据点,而监督仅在图普尔级别(通常是对、三胞胎或数据点的四胞胎)。这种弱监督的一个典型例子是一组正负对:在这种情况下,目标是学习一个距离指标,将正对靠近在一起,负对放在一边。
基于上述(弱)受监督的数据,指标学习问题通常被制定为优化问题,其中人们试图找到一个距离函数的参数,优化一些客观函数,测量与培训数据的一致性。

Mahalanobis Distances
在公制学习包中,当前实施的所有算法都学习所谓的马哈拉诺比斯距离。给定真实值参数矩阵 L
L形状 (num_dims, n_features), 其中n_features是描述数据的数字特征, 与 L 相关的马哈拉诺比斯距离L定义如下:

换句话说,马哈拉诺比斯距离是 L 定义的特征空间的线性转换后的欧几里德距离
L(服用 LL成为身份矩阵恢复标准欧几里德距离)。
因此,马哈拉诺比斯距离指标学习可以被看作是学习维度num_dims的新嵌入空间。请注意,当num_dims小于n_features时,这会降低尺寸。
严格地说,马哈拉诺比斯的距离是”伪指标":它们满足一个指标的三个属性(非负、对称、三角不等式等),但不一定是不可区分的身份。
Use-cases
公制学习有许多用例。我们在此处列出一些热门示例(用于说明其中一些用例的代码,请参阅文档示例部分):

最近的邻居模型:学习的指标可用于改进近邻学习模型的分类,回归,异常检测。
聚类:公制学习提供了一种将 K-手段等算法发现的聚类偏向预期语义的方法。
信息检索:已学到的指标可用于检索在语义上最接近查询元素的数据库元素。
维度降低:公制学习可被视为在(弱)监督环境中减少数据维度的一种方式。
更一般地,学习转换 L可用于将数据投影到新的嵌入空间中,然后再将其馈送到其他机器学习算法中。

Book: Metric Learning (2015)

 类似资料: