图像嵌入和准确性简介
自动编码器的广泛介绍
图像嵌入和准确性简介
使用聚类、线性判别分析和性能评估
上一章 是对嵌入、相似性和聚类的一般介绍。本章通过扩展嵌入的概念以包括图像来建立在这些基础之上。我们将探讨 K-Means 聚类是如何引入的 上一章 ,执行图像嵌入,并介绍通过准确性和召回率来衡量性能的方法。引入了线性判别分析形式的简单自动编码器,以帮助我们了解聚类和性能如何处理图像。本章不解释自动编码器,因为它将在下一章中介绍。
表中的内容:
- 2.1 图像嵌入
- 2.2 集群性能
- 2.3 讨论
- 2.4 结论
2.1 图像嵌入
第1章 解释了同一对象的不同嵌入如何适用于不同的应用程序。以图像形式嵌入书籍不适合书籍推荐,但需要以流派形式嵌入。但是,我们无法使用流派嵌入来阅读书籍,因为此应用程序需要实际文本。一般来说,使用嵌入时,目标是找到一种嵌入方法,为我们提供适合应用程序的相似性。
在寻找相似性时,图像是一种棘手的嵌入形式。一个示例可能是我们希望移动应用程序帮助我们识别 动物 我们正在看。在这里,我们需要找到图像和动物物种之间的相似之处。
Figure 2.1 — Images of animals as examples of categories from the dataset: 动物 10. Cat photo by 琥珀基普 on 不飞溅, Dog photo by 瓦莱里娅·博尔特涅娃 from 像素, Chicken photo by 埃里克·卡里茨 from 像素, and Cow photo by 加布里埃尔·波拉斯 on 不飞溅.
图像是我们在现实世界中看到的内容的嵌入。图像包括像素,每个像素是单一颜色。上面的图像是通过组合 10.000 个这些像素(准确地说是 100.000 个图像)创建的。每个像素都提供了少量独特的信息,我们只能得到所有像素的完整图片。每个像素代表一个知识,因此应该有自己独特的维度。 第1章 展示了如何用两种类型来表示一本书,从而给它总共两个维度。但是,250x400 像素的灰度图像总共有 100.000 个维度!
Figure 2.2 — Process of turning an image into numbers. Taken from 第1章, figure 1.1. Book photo by 杰斯·贝利 on 不飞溅
那么问题就变成了,可以使用像素嵌入来对图像中的动物进行分类吗?图 2.1 有四个动物组(即猫、狗、鸡和牛)。从每组中提取 16 幅图像 动物 10 数据集并放置在图 2.3 中的坐标系内(每个动物组都有唯一的颜色)。这些动物来自 动物 10 数据集托管在 卡格尔 [1] 并且可以免费下载。
Figure 2.3 — The four animals from figure 2.1 are represented with 16 images each in a 2D space. Linear Discriminant Analysis (LDA) is used to transform the images to 2D as it focuses on separating classes.
细心的读者可能会认识到该图仅显示了两个维度,而不是全部 100.000。为了简单起见,我们从两个维度开始,然后将这些技术扩展到所有 100.000 个维度。关键点是彩色点没有明确的单一颜色组,而是全部混合在一起。
主成分分析 [2] (PCA) 和 线性判别分析 [3] (LDA) 都可以将图像转换为 2D。 PCA 专注于转换没有类的数据,而 LDA 专注于转换有类的数据。 LDA 用于将图像转换为 2D,因为每个图像中的动物都是事先已知的。
其余的 图像嵌入 部分解释了如何从图 2.3 生成图形。你可以继续下一节, 2.2 集群性能 , 跳过如何生成图表的详细说明
**图 2.3 中如何生成图表的详细说明:
** 图 2.3 中的点代表动物 动物 10 托管在 Kaggle 上的数据集。登录后可从网站免费下载数据集。下载按钮在图 2.4 中突出显示。
Figure 2.4 — Animal-10 dataset on Kaggle with the download button highlighted.
将从 Kaggle 下载一个“存档”文件夹,其中包含一个名为 原始图像 和一个名为 翻译.py .采取 原始图像 文件夹 并将其放置在已知位置;见图 2.5。我们在代码 2.1 中定义了数据集的位置,以便以后可以访问它。
Figure 2.5 — Move the “raw-img” file into a known location. In this example, it is moved into the “Datasets/Animals/” folder. The location is referred to in code 2.1.
Code 2.1 — Define the location of the animal-10 folder
现在我们可以通过定义它们的名称和要提取的图像数量来提取每个动物组(即猫、狗、鸡和牛)的 16 幅图像。代码 2.2 使用此信息遍历每个动物文件夹,加载 16 张图像并使其大小相同。比较相同大小的图像更容易,并且是 LDA 等功能所必需的。
Code 2.2 — Load 16 images of Cats, Dogs, Chickens, and Cows.
我们现在可以为每只动物显示一个图像,以检查数据是否正确加载。为每只动物显示一张图像的代码可在代码 2.3 中找到。
Code 2.3 — Show one image per Animal
之后,图像可以转换为 2D 使用 线性判别分析 (LDA) 通过使用代码 2.4。在将图像转换为 2D 之前,必须“拟合”LDA。拟合是教 LDA 如何转换数据的过程。拟合是通过首先定义图像在转换完成后应该有多少维度,然后给出哪些图像属于同一类的 LDA 示例来完成的(即,给出 LDA 图像并说明其中有哪些动物)。它使用这些信息来确定如何转换这些和未来的图像。最后一步是使用 LDA 将我们的 16x4 图像转换为 2D。
Code 2.4 — Transform animal images to 2D
二维点可以使用代码 2.5 绘制在图 2.3 中的图形中。
Code 2.5 — Plot 2D points from multiple classes, each with unique colors. The graph should match figure 2.3.
2.2 集群性能
我们在 第1章 如何使用 K-Means 将 k-clusters 应用于无色数据(没有类别/没有预定义动物的数据)。 K-Means 专注于在数据中找到 K 组,并在每个组的中心放置一个点。该点放置在中心以最好地代表其组,因为它与所有点的距离最短。我们的案例与 K-Means 略有不同,因为我们已经知道这些组(相同动物物种的图像来自同一组)。但是,可以通过在每个组/动物的中心放置一个点来使用 K-Means 的想法来最好地表示它。图 2.6 使用公式 2.1 添加了新的中心点。代码 2.6 显示了如何添加集群并绘制新图。 OBS! 代码的输出不会突出显示带有黑色边框的集群。
Figure 2.6 — Center of each group/animal is marked with a new point highlighted with a black border. Orange: Dog, Red: Cow, Green: Chicken, Blue Cat:
Equation 2.1 — Calculating the center of a group
Code 2.6 — Find the centers of each animal group and plot them together with the remaining groups
棘手的部分是当我们得到一张新图像并想弄清楚上面是哪只动物时会发生什么。图 2.7 显示我们计算从新转换图像到每个簇的距离,因为每个簇代表一个动物组。距离越小,相似度越高;使用欧几里得相似度选择最接近的聚类作为最佳拟合。公式 2.2 显示了如何计算两点之间的相似度。
Figure 2.7 — Measure the distance to each center and choose the closest one as its group
Equation 2.2 — Formula for calculating the euclidean similarity score between two points
那么,我们如何计算我们的集群识别动物的能力呢?一个简单的方法是首先忘记每个点属于哪个组,然后使用公式 2.2 计算它们最接近/最相似的组。图 2.8 和代码 2.7 使用这种方法来更改每个点的颜色以匹配最近的集群(继续阅读,很快就会有意义!)。
Figure 2.8 — The points are redistributed so they now belong to the group closest to them
Code 2.7 — Distribute points by calculating which class they are closest to
当我们改变每个点的颜色以匹配最近的集群时,可能会发生四件事。给出了一个简单的例子来解释发生了什么。该示例使用 Corona 测试而不是集群来保持简单。电晕测试可以是 积极的 或者 消极的 .当测试呈阳性时,可能会发生两件事,它可以是真的,它是阳性的,称为 真阳性, 也可以是假的,称为 假阳性 .如果测试结果为阴性,也会发生同样的事情,也可以是阴性结果,称为 真阴性 ,也可以是假的,称为 假阴性 .当测试得到更多真阳性和真阴性时,我们会更加信任它。
我们的案例更复杂,因为我们有四个结果而不是两个(即四个集群/动物类型与 积极的 和 消极的 )。我们当时查看单个集群以确定它的性能如何。当我们确定它的表现如何时,可能会发生相同的四件事(真阳性、假阳性、真阴性和假阴性)。让我们关注蓝色簇:之前和之后都是蓝色的点被称为 真阳性 (TP) .以前是另一种颜色但现在是蓝色的点被称为 假阳性(FP) .以前是蓝色但现在是另一种颜色的点称为 假阴性(FN)。 最后,调用之前和之后都是另一种颜色的点 真阴性 (TN) .图 2.9 说明了关注蓝色集群时的每种情况。
我们必须对每个集群继续这个过程,以确定每个集群的性能如何。
Figure 2.9 — How well a cluster performs can be measured by looking at how many true & false positives and true & false negatives it has after redistributing the points
我们在图 2.8 中使用的方法是有问题的,因为我们只使用现有的点来评估性能。这些点用于创建/拟合 LDA,LDA 自然更擅长正确处理这些点。好消息是我们在 Animal-10 数据集中有更多的图像可供测试!代码 2.8 展示了如何从每个动物类加载和转换 128 个图像到 2D。
Code 2.8 — Load 128 images for each animal class and transform them to 2D with the functions defined in Code 2.2 and 2.4.
可以通过以下方式衡量集群的性能 精确度和召回率 [4]。 精确 测量真假阳性之间的比率——因此,集群仅在预测自己的点方面有多好。 记起 测量真阳性和假阴性之间的比率——因此,在预测时,集群在包含所有点方面有多好。精度方程如方程 2.3 所示,召回方程如方程 2.4 所示。代码 2.9 计算所有 512 幅图像(128 幅图像 pr.class)的每个集群的正面和负面以及精确度和召回率。
Equation 2.3 — Formula for calculating the precision of a cluster. It is the ratio between true-positives and false-positives
Equation 2.4 — Formula for calculating the recall of a cluster. It is the ratio between true-positives and false-negatives
Code 2.9 — Calculate the performance of each cluster with all 512 (128*4 classes) images in 2D
2D 图像的 Precision 和 Recall 的结果可以在表 2.1 中找到。平均精度是34%,平均召回率是33%,一点都不好!但是等等,我们只使用了两个维度?让我们尝试对所有 100.000 个维度进行相同的计算,看看它的性能是否比以前更好。
Table 2.1 — Precision and Recall when the points are transformed to 2D with an LDA
表 2.2 显示了所有 100.000 个维度的结果以及代码 2.10 如何获得它们。平均精度31%,平均召回率30%,比以前还要差! LDA 表现更好,因为它专注于分离每个组并使它们更加独特,即使只是一点点。
Table 2.2 — Precision and Recall when the points are used without any transformation
Code 2.10 — Code for calculating the cluster accuracy when using all dimensions without transforming the data
但是等等……LDA 只使用了两个维度……如果两者都转换数据并让它有更多维度呢? LDA 的最大维度数是“类数 - 1”,在我们的例子中是 4–1 = 3。表 2.3 显示了我们使用所有三个维度时的结果,代码 2.11 显示了如何获得它。平均精度为 38%,平均召回率为 38%,仍然不是很好,但比以前好!
Table 2.3 — Precision and Recall when the points is transformed to 3D with an LDA
Code 2.11 — Code for calculating the cluster accuracy when using transforming it to 3D with LDA
2.3 讨论
3D LDA 仅得分 38%,因为它每组仅使用 16 张图像来训练 LDA,并且与未转换的图像一样,它只查看像素颜色。
更多的图像在训练时为 LDA 提供了更多的上下文,因为它有更多的例子来说明图像可以在图表上绘制的位置。如果我们有 16 个图像而不是单个图像,则更容易判断来自同一组的未来点在哪里。同样,128 幅图像给我们的信息不仅仅是 16 幅。图 2.10 绘制了每组 128 幅图像;左图使用在 64 (164) 图像上训练的 LDA,右图使用在 512 (1284) 图像上训练的 LDA。该图说明了 LDA 在更多图像上训练时如何更好地分离点。代码 2.11 显示了如何绘制这两个图。
LDA 在转换图像时只查看像素颜色。该方法受到限制,因为它将像素的颜色优先于图像中的形式。这意味着棕色猫和棕色狗将比白色狗和棕色猫更相似!
Figure 2.10–512 animal images plotted with a LDA trained on 16 images per group (left) and 128 images per group (right)
Code 2.11 — Create a new LDA that transform the images to 2D and is trained with 128 images per group.
在第 3 章中, 自编码器简介 ,我们将利用我们所了解的图像嵌入和 LDA 的优缺点来提高我们的动物识别应用程序的准确性。
2.4 结论
我们现在完成了第 2 章以及图像嵌入和准确性的介绍。
第一部分, 图像嵌入, 解释了图像由像素组成,每个像素代表一种颜色。每种颜色都是一个维度,就像“人生旅程”和“小说”是第 1 章书籍的维度一样。我们使用了来自四个动物组(即猫、狗、鸡和牛)的 64 张图像来展示如何工作在 Python 中嵌入图像。使用线性判别分析 (LDA) 将每个图像转换为 2D,从而可以将它们绘制在图表中并显示它们的相似性。
第二节, 集群性能 ,看看我们如何通过在它们的中心放置一个点来表示每个动物组。这些点可以通过计算图像最接近哪个中心来帮助识别图像中的动物。精确度和召回率是确定方法识别正确动物的两种方法。 Precision 检查有多少图像被识别为正确的动物,Recall 检查每个中心在包括其物种的所有图像方面有多好。在没有转换的图像和使用 LDA 转换为 2D 和 3D 的图像上测试了性能。
精度和召回率显示 使用 LDA 转换的图像比未转换的图像更能识别正确的动物种类(38% 对 31%)。原因是 LDA 转换图像以使每个组更加不同。然而,图像和 LDA 只看颜色,而不看图像中的形式。这意味着两种方法都认为棕色猫和棕色狗比棕色狗和白色狗更相似。
第3章, 自编码器简介 ,使用我们从图像嵌入和 LDA 的弱点和优势中学到的知识来提高我们的动物识别应用程序的准确性。第 3 章利用变换的力量,解决了只看颜色的问题,达到了更好的精度。
参考
[1] 科拉多·阿莱西奥, 动物10 , Kaggle.com
[2] Casey Cheng, 用零数学直观地解释主成分分析 (PCA) (2022), Towardsdatascience.com
[3] YANG Xiaozhou, 线性判别分析,解释 (2020), Towardsdatascience.com
[4] 谷歌开发者, 分类:Precision and Recall (2022 年),developers.google.com
除非另有说明,所有图像和代码均由作者提供。
感谢您阅读这本关于自动编码器的书!分享我们的想法时,我们学得最好,所以请分享评论,无论是问题、新见解还是分歧。非常感谢任何建议和改进!
如果您喜欢这本书,并且对机器学习和数据科学的新见解感兴趣,请注册为中等会员以完全访问我的内容。当我发布新章节或帖子时,请关注我以接收电子邮件。
[
Mathias Grønne — 中等
图像嵌入和自动编码器的广泛介绍本书及其章节的介绍——他们说……
媒体网
](https://medium.com/@mathiasgronne/membership)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明