超详细斯坦福CS231n课程笔记(第二课)——图像分类

图像分类

1. 概述

关于图像分类的任务,这是一个计算机视觉中真正核心的任务,准确来说,就是我们怎么研究图像处理的任务

更具体的说,当你做图像分类时,分类系统接收一些输入图像,比如说可爱的猫咪,并且系统已经清楚了一些已经确定了分类或者标签的集合,并且这些标签可能是 一只狗狗或者一只猫咪,也有可能是一辆卡车,那计算机的工作就是看图片,并且给它分配其中一些固定的分类或标签。

这听起来是一个很简单的问题,因为大家大脑里的视觉系统,天生就是来做这些视觉识别任务,但是对于机器来说,这是一个非常非常困难的问题。

当一个计算机看着这些图片的时候,它看到的是什么,计算机呈现图片的方式其实就是一大堆数字

超详细斯坦福CS231n课程笔记(第二课)——图像分类

 

你可以用很微小,很微妙的方式改变图片,这将导致像素网格整个发生变化,但是它还是一只猫,同时我们的算法需要对这些变化鲁棒

超详细斯坦福CS231n课程笔记(第二课)——图像分类

 

但是,不仅仅只有视角问题,还有照明问题,在场景中会有不同的照明条件,无论猫咪出现在这样的漆黑、昏暗的场景中,还是像这样非常明亮、阳光照射的场景中,它始终都是一只猫

超详细斯坦福CS231n课程笔记(第二课)——图像分类

 

目标可变,猫咪可以有千奇百怪的姿势和位置,对于不同的形变情形,我们的算法也应该是鲁棒的

超详细斯坦福CS231n课程笔记(第二课)——图像分类

 

当然可能也有遮挡的问题,不如你可能仅看到猫咪的一部分,但是作为一个人,在上述情况中,你非常容易去意识到这可能是一只猫咪,你还依然把这些图像看作猫咪,但是我们的算法依然要对这种情况作出鲁棒,这是一件非常难的事情

超详细斯坦福CS231n课程笔记(第二课)——图像分类

 

2. 最近邻算法

超详细斯坦福CS231n课程笔记(第二课)——图像分类

 

使用了曼哈顿距离(L1 distance)

超详细斯坦福CS231n课程笔记(第二课)——图像分类

 

 

超详细斯坦福CS231n课程笔记(第二课)——图像分类

这是一个简单易行的比较图片的方法,我们只是对图片中的单个像素进行比较,假设我们的测试图片只是4*4的小图片,我们只取测试图像左上角的像素,用它减去训练图像对应像素的值,然后取绝对值,得到这两幅图像整个像素的差别,将图像中所有像素的差值相加,虽然这种比较图片的方法看起来有点笨,但有些时候却也有它的合理性。

超详细斯坦福CS231n课程笔记(第二课)——图像分类

 

problems:

  • 如果我们在训练集中有N个实例,训练和测试的过程可以有多快,当然,训练是连续的过程,因为我们并不需要做任何事情,我们只需要存储数据,但在测试时,我们需要停下来,将数据集中N个训练实例与我们的测试图像进行比较,这是一个很慢的过程。

  • 在实际使用中,我们希望训练过程比较慢,而测试过程很快,你可以想象,训练过程是在数据中心中完成的,它可以负担起非常大的运算量,从而训练出一个优秀的分类器,然而,当你在测试过程中部署分类器时,你希望它运行在手机上,或者浏览器或者其他低功耗设备,但你又希望分类器能够快速地运行,由此看来,最近邻算法有点落后了。

  • 我们在看看卷积神经网络和其他参数模型,它们则正好相反,它们会花很多时间在训练上,而在测试过程则非常快。

  •  

    超详细斯坦福CS231n课程笔记(第二课)——图像分类

 

 

最近邻算法缺点:边界不平滑,起伏很大,会导致效果不好,所以采用了K-Nearest Neighbors,不单单和一个最近邻来进行比较,而是K个最近邻投票决定。

k-Nearest Neighbor on images never used.

  • Very slow at test time(慢)

  • Distance metrics on pixels are not informative(距离度量用在图片上是在不太合适)

  • Curse of dimensionality(维度灾难)

3. 超参数(Hyperparameters)

超详细斯坦福CS231n课程笔记(第二课)——图像分类

像K和距离度量这样的选择,我们称之为超参数。因为它们不一定都能从训练数据中学到,你要提前为算法作出选择,并且这是没有办法直接从数据中学习到的。

 

超详细斯坦福CS231n课程笔记(第二课)——图像分类

在什么情况下L1距离比L2距离好?

这主要和要解决的问题相关,因为L1有这种坐标依赖,它实际上依赖于数据的坐标系统,如果你知道你有一个向量,向量的各个元素可能有意义,比如你也许出于某种原因要对员工进行分类,向量的不同元素对应着员工的不同特征,例如,薪资或工作年限,所以我认为如果向量中的各个元素有着实际的意义,那么L1可能更加好一点 。

 

超详细斯坦福CS231n课程笔记(第二课)——图像分类

关于超参数的选择:

  1. 1. (❌)选择能对你的训练集给出最高准确率表现最佳的超参数,这其实是一种非常糟糕的想法,例如在K近邻算法中,K=1我们总能完美分类训练集数据,但是在实践中让K取更大的值,尽管会在训练集中分错个别数据,但对于在训练集中未出现的数据分类性能更佳,归根结底在机器学习中,我们关心的不是要尽可能拟合训练集,而是要让我们的分类器,在训练集以外的未知数据上表现更好。

  2. 2. (❌)把所有的数据分成两部分,一部分训练集,一部分测试集,然后在训练集上用不同的超参数,来训练算法,然后将训练好的分类器,用在测试集上,再选择一组在测试集上表现最好的超参数,这实际上也非常糟糕,因为同样机器学习的目的,是让我们了解算法究竟表现如何,所以测试集的目的,是给我们一种预估方法,即在没遇到的数据上算法表现将会如何,如果采用这种不同的超参数,训练不同算法的策略,然后选择在测试集上表现最好的超参,那么很可能,我们选择了一组超参数,只是让我们的算法在这组测试集上表现良好。无法代表在全新的未见过的数据上的表现。

  3. 3. 更常见的做法,就是将数据分为三组,大部分数据作为训练集,然后建立一个验证集,一个测试集,我们通常所做的就是,在训练集上用不同超参来训练算法,在验证集上进行评估,然后用一组超参数,选择在验证集上表现最好的,拿到测试集中跑一跑。非常重要的一点,必须分隔验证集和测试集。

  4. 4. 交叉验证。它的理念是,我们取出测试集数据,和往常一样,保留部分数据作为最后使用的测试集,对于剩余的数据,我们不是把它们分成一个训练集和一个验证集,而是将训练数据分成很多份,在这种方法下,我们轮流将每一份都当作验证集。

  5.  

    超详细斯坦福CS231n课程笔记(第二课)——图像分类

超详细斯坦福CS231n课程笔记(第二课)——图像分类

超详细斯坦福CS231n课程笔记(第二课)——图像分类

4. 线性分类

引言:我们将要实现一种更强大的方法来解决图像分类问题,该方法可以自然延伸到神经网络和卷积神经网络上。

这种方法主要有两部分组成:

  • 一个是评分函数(score function),它是原始图像数据到类别分值的映射

  • 一个是损失函数(loss function),它是用来量化预测分类标签的得分与真实标签之间的一致性的。该方法可以转化为一个最优问题,最最优化过程中,将通过更新评分函数的参数来最小化损失函数值。

  •  

    超详细斯坦福CS231n课程笔记(第二课)——图像分类

超详细斯坦福CS231n课程笔记(第二课)——图像分类

还是以CIFAR-10为例,xi 就包含了第i个图像的所有像素信息,这些信息被拉成为一个[3072 x 1]的列向量,W大小为[10x3072],b的大小为[10x1]。因此,3072个数字(原始像素数值)输入函数,函数输出10个数字(不同分类得到的分值)。参数W被称为权(weights)。b被称为偏差向量(bias vector),这是因为它影响输出数值,但是并不和原始数据xi 产生关联。在实际情况中,人们常常混用权重和参数这两个术语。 需要注意的几点

  • 首先,一个单独的矩阵乘法Wxi就高效地并行评估10个不同分类器(每个分类器针对一个分类),其中每个类的分类器就是W 的一个行向量

  • 注意我们认为输入数据(xi,yi)是给定且不可改变的,但参数W和b是可控制改变的。我们的目标就是通过设置这些参数,使得计算出来的分类分值情况和训练集中图像数据的真实类别标签相符。

  • 该方法的一个优势是训练数据是用来学习到参数W和b的,一旦训练完成,训练数据就可以丢弃,留下学习到的参数即可。这是因为一个测试图像可以简单地输入函数,并基于计算出的分类分值来进行分类。

  • 最后,注意只需要做一个矩阵乘法和一个矩阵加法就能对一个测试数据分类,这比k-NN中将测试图像和所有训练数据做比较的方法快多了。

超详细斯坦福CS231n课程笔记(第二课)——图像分类

为了便于可视化,假设图像只有4个像素(都是黑白像素,这里不考虑RGB通道),有3个分类(红色代表猫,绿色代表狗,蓝色代表船,注意,这里的红、绿和蓝3种颜色仅代表分类,和RGB通道没有关系)。

首先将图像像素拉伸为一个列向量,与W进行矩阵乘,然后得到各个分类的分值。需要注意的是,这个W一点也不好:猫分类的分值非常低。从上图来看,算法倒是觉得这个图像是一只狗。

将图像看做高维度的点:

既然图像被伸展成为了一个高维度的列向量,那么我们可以把图像看做这个高维度空间中的一个点(即每张图像是3072维空间中的一个点)。整个数据集就是一个点的集合,每个点都带有1个分类标签。

既然定义每个分类类别的分值是权重和图像的矩阵乘,那么每个分类类别的分数就是这个空间中的一个线性函数的函数值。我们没办法可视化3072维空间中的线性函数,但假设把这些维度挤压到二维,那么就可以看看这些分类器在做什么了:

图像空间的示意图

超详细斯坦福CS231n课程笔记(第二课)——图像分类

其中每个图像是一个点,有3个分类器。以红色的汽车分类器为例,红线表示空间中汽车分类分数为0的点的集合,红色的箭头表示分值上升的方向。所有红线右边的点的分数值均为正,且线性升高。红线左边的点分值为负,且线性降低。

从上面可以看到,W的每一行都是一个分类类别的分类器。对于W数字的几何解释是:如果改变其中一行的数字,会看见分类器在空间中对应的直线开始向着不同方向旋转。而偏差b,则允许分类器对应的直线平移。需要注意的是,如果没有偏差,无论权重如何,在xi=0时分类分值始终为0。这样所有分类器的线都不得不穿过原点。

 

参考:https://blog.csdn.net/weixin_38278334/article/details/82831541