斯坦福大学cs231n (图像分类)

1.介绍

当作图像分类时,分类系统接收一些分类图像,比如猫咪。并且系统清楚了一些已经确定了分类或者标签的集合。那么,计算机的工作就是根据图片,给他分配一些固定的分类或者标签。

对于一个计算机来说,这是一个非常困难的事情。当一个计算机看到这些图片时,他看到的是一大堆数字。比如,这个图片是800*600的像素,每一个像素由三个数字表示,用来表示像素的红、绿、蓝三个值,这将是一个巨大的数字阵列,这很难提取猫咪的特性。我们把这种问题成为语义鸿沟。

一只猫咪的语义概念和计算机实际看到的像素值之间有着巨大的差距,图像稍微一点的变化,都会导致数字阵列完全不同。然而,我们希望我们的算法是鲁棒的。

再进行图像分类时,图片可能发生以下变化:

  • 摄像机从多个角度拍摄
  • 照明情况有亮有暗
  • 形状会发生变化
  • 有遮挡物遮挡
  • 图片中的物体与背景较为相似,难以辨认
  • 每一类物体多种多样

2.数据驱动

2.1 硬编码

首先,根据所给图像,提取出边缘线条。然后,设定一些规则(比如:什么样的线条代表什么特征),去判断该图像中的物体是什么类别。然而,这种硬编码的方式效果并不是很好。

2.2 数据驱动算法

我们不写具体的分类规则来识别一个物体,我们采取的方式是,抓取大量猫的图片数据集,接着,训练机器来分类这些图片。(机器会收集这些数据,用某种方式总结,然后生成一个模型,总结识别出这些不同类的对象的核心知识要素),然后,我们用这些模型识别新的图片。

因此,这种方式一般包含两个函数。一个是训练函数,根据输入的数据集,得出一个模型。另一个是预测函数,根据输入的数据集进行预测。

3 最近邻算法

这种方法只是单纯的记录数据,在图片预测时,我们会拿一些新的图片,去在训练数据中,寻找与新图片最相似的,基于此,给出一个标签。

3.1 CIFAR-10数据集

CIFAR-10是一个很常用的数据集。数据集CIFAR-10会给出10个不同的类别,比如,飞机、汽车、鸟、猫等等。每个类别会给出五万张训练数据图,另外有一万个额外的测试数据图。

在该图中,右半部分表示对一个测试图片,找到和它最接近的十个训练图片。

比较两个图片是否相似时,可以用到一些距离度量计算方法。

3.2 L1距离(曼哈顿距离)

  • p为像素点,表示第p个像素点

假设我们的测试图片是4x4的小图片,将测试图片与训练图片对应位置的值相减取平均值,再将这些差值进行相加。

实现方式很简单,如下图所示。

因为我们在做预测时可能希望它发生在手机上或者浏览器上等等,不具有较强大的计算能力,所以,我们希望一个模型训练时可以慢一些,在测试时要尽量快一点。从这一点上看,最近邻算法并不是一个很好的算法。

并且该算法的准确率较低,因此后面还会介绍其他算法。

3.3 L2距离(欧式距离)

该方式是先计算对应像素值的差,再将差值平方相加取根值。

L1距离取决于你选择的坐标系统,如果转动坐标轴,将会改变点之间的L1距离,而改变坐标轴对L2距离毫无影响。

如果输入的特征向量中的一些值具有重要的意义,那么建议选择L1距离,二u过输入的特征向量只是普通的向量,那么建议选择L2距离。当然,在解决实际问题中,更建议分别使用两种距离度量的方法,比较选出较为合适的一种方式。

3.4 K最近邻分类器

只是用最相似的一张图片的标签作为测试图片的预测,往往效果并不好。因此,我们可以使用KNN算法:选取相似的K个图片,选择其中数量最多的标签,作为对测试图片的预测。

特例:K=1即最近邻算法。

上图分别展示了原始数据,K=1的KNN算法以及K=5的KNN算法。我们可以发现K变大后,分类边界线趋于平滑。其中,中间的白色区域,表示不确定为何种分类。

3.4.1 超参数

像K值的选取与度量方法的选择都不是通过训练学习可以得到的,而是需要我们提前设置好的参数,称为超参数,那么超参数的选择就格外重要,可能直接影响一个模型效果的好坏。

  • 首先,不可以使用训练集进行超参数调优。如果在训练集上调优,我们可以发现K=1时,效果总是很好。但是正如前面所说,K变大后,曲线更趋于平滑,即使其中可能个别数据出现错误,但是对于位在训练集中出现的数据往往会得到较好的效果。
  • 其次,也不可以使用测试集进行超参数调优。如果使用测试集调优,使用在测试集中表现最好的K值后,在使用测试机进行预测,那么相当于测试机过拟合,往往预期的性能好于实际的性能。

解决方式:

  1. 将数据划分为训练集、验证集和测试集。在验证机上对不同的K值进行比较,选择效果最佳的K值,然后,使用测试集对算法进行评价。
  2. 交叉验证。使用交叉验证时,将训练集划分为五部分,其中四份用来训练数据,另外一份用来验证数据。我们将每一份数据集以此作为验证集,最后取5次验证结果的平均值作为验证结果。

如下图所示,针对不同的K值,产生了五个验证结果,取其平均值,作为最终验证结果。我们可以在图中发现,当K=7时,模型效果是最好的。

但是,在很多图像分类的问题上,我们并不建议使用KNN算法,原因如下:

  • 测试花费大量时间。因为需要将测试图片与每一个训练图片进行比较,所以花费时间较多。
  • 使用像素差异来比较图片是远远不够的。使用像素差异进行比较的话,往往最终结果的好坏依赖于背景,背景相似的图片可能相差距离都比较小。举例:将原始图片向下移动两个单位距离,可能像素差异会非常大,但是显而易见,这两张图片应该属于一个类别。
  • 维度灾难。KNN算法有点类似训练数据将样本空间分成几块,如果我们希望分类器有较好的结果,那么就需要训练数据能密集地分布在空间中,否则最近邻点的实际距离可能很远,也就是说,和待测样本的相似度没有那么高。然而问题在于,想要密集地分布在空间中,我们需要指数倍的训练数据,这会导致训练数量猛增。

4 线性分类

4.1 线性分类介绍

KNN模型所做的就是把训练数据存储起来,并且在训练过程中不会产生参数(K为人为设定的,是超参数,不是这里提到的参数概念)。在预测时,将测试图片与训练图片进行比较,然后预测。

与之不同的是参数模型,其中,线性分类就是最简单的参数模型。参数模型通常指根据输入的训练数据,得到权重W或者,在之后的预测中,将不会在使用训练数据,而是与这组权重参数进行某种运算做出预测。

线性分类模型:

其中,参数W表示权重矩阵,参数b是偏置项。

在该例子中,将图片的像素值拉成[3072x1]的列向量,W大小为[10x3072],B的大小为[10x1],最后输出为[10x1]的列向量,分别对应了不同分类得到的分值。

参数矩阵W相当于多个分类器的组合,每一行代表一个分类器。

线性分类器在利用学习到的模板,和输入图像做模板匹配。我们设置可以把其视作一种高效的KNN,不同的是不再使用所有的训练集的图像来比较,而是每个类别只用了一张图片来表征(这张图片是我们学习到的模板,而不存在训练集中),而且我们会更换度量标准,使用(负)内积来计算向量间的距离,而不是使用 L1 或者 L2 距离。

如果我们将3072维空间假设为二维空间,我们可以看到效果如上图所示。每输入的一张图片代表一个点,三个颜色的直线,代表三个分类器。

线性分类并不能解决所有的问题。比如上图展示的三种情况,都无法使用线性将其分类。

相关推荐
galileo201616 分钟前
LLM与金融
人工智能
DREAM依旧32 分钟前
隐马尔科夫模型|前向算法|Viterbi 算法
人工智能
GocNeverGiveUp1 小时前
机器学习2-NumPy
人工智能·机器学习·numpy
B站计算机毕业设计超人2 小时前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
学术头条2 小时前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
18号房客2 小时前
一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·sklearn
feifeikon2 小时前
机器学习DAY3 : 线性回归与最小二乘法与sklearn实现 (线性回归完)
人工智能·机器学习·线性回归
游客5202 小时前
opencv中的常用的100个API
图像处理·人工智能·python·opencv·计算机视觉
古希腊掌管学习的神2 小时前
[机器学习]sklearn入门指南(2)
人工智能·机器学习·sklearn
凡人的AI工具箱2 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite