CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类

Lecture1 课程介绍 计算机视觉概述 笔记

这个课程CS231n,关于计算机视觉。计算机视觉,就是针对视觉数据的研究。计算机视觉的发展历程。

Lecture2 Image Classification pipeline

数据驱动方法

图像分类任务是一个计算机视觉中真正核心的任务。当你做图像分类时,分类系统接收一些输入图像,并且系统清楚了一些已经分类或者标签的集合,计算机的工作就是看图片并且给她分配其中一些固定的分类标签。
计算机呈现图片的方式其实就是一大堆数字,所以图像可能就是一些像800*600的像素,每一个像素由三个数字表示。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
我们想发明一种识别方法,可以拓展到识别世界上各种对象,所以基于此,我们想到用数据驱动的方法。我们不写具体的分类规则来识别一只猫或者鱼。一旦有了数据集,我们训练机器来分类这些图片,机器会收集所有的数据,用某种方式总结,然后生成一个模型,总结出识别出这些不用类的对象的核心知识要素,然后我们用这些模型,来识别新的图片,来看能不能识别出狗或者猫。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
我们会有两个函数,一个是训练函数,这函数接收图片和标签,然后输出模型;另一种是预测函数,接收一个模型,对图片种类进行预测。
主要讨论神经网络,卷积神经网络,深度学习等等,但是这种数据驱动的算法是比深度学习更广义的一种理念。对于一个简单的分类器,我们称为最近邻。在训练机器的过程中,我们只是单纯记录所有的训练数据,在图片预测的步骤,我们会拿一些新的图片,去在训练数据中,寻找与新图片最相似的,然后基于此来给出一个标签。这些很多所用到的属性,都是数据驱动的。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
对于数据集CIFAR10,给出10个不同的类别,每个类别会给出5万张训练数据图,1万测试集。最近邻分类器,在右边的大格里,最左边一列是CIFAR-10数据集的测试图片,在右边我们将训练图片进行分类,并显示对应测试示例的最相似的训练图片。看起来非常相似,我们知道这些最接近示例的标签。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
如果给出两幅图片,我们该怎样对它们进行比较,我们要将测试图片与所有训练图片进行比较,我们将有很多不同选择,来确定需要什么样的比较函数。我们使用了L1距离,有时我们称之为曼哈顿距离。只是对这些图片中的单个像素进行比较。假设我们的测试图片,只是4*4的小图片,我们只取测试图像左上角的像素,用它减去训练图像对应像素的值,然后取绝对值,得到这两幅图像这个像素的差别,将图像中所有像素的这个差值相加。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
最近邻分类器的完整Python代码,非常简明因为我们使用了Numpy提供的向量运算。训练函数:只需要存储训练数据;测试函数:我们将输入图像,然后使用L1距离函数,将我们的测试图片与训练实例进行比较,然后在训练集中找到最相似的实例。
简单分类器的问题:如果我们在训练集中有N个实例,训练和测试的过程可以有多快,最近邻算法训练速度快,测试速度慢。卷积神经网络和其他参数模型则正好相反,它们花很多时间在训练上,而在测试过程则非常快。
在实际运行中,最近邻算法到底表现如何,最近邻分类器的决策区域。我们的训练集包括二维平面中的这些点。点的颜色代表不同的类别,或不同的类标签。对于整幅图像的每个点来说,我们将计算这些训练数据中,最近的实例,然后在这些点的背景上着色,标识出它的类标签。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
因为我们只计算最近的点,所以在绿色区域的中间,这个黄色被分割成了独立的一块,这不太好也许那些事实上应该是绿色。像绿色区域像一根手指插入了蓝色区域,而这个点可能是噪声或者失真信号。由这个动机开始产生了K-近邻算法,它不只是寻找最近的点,我们会做一些特殊的操作,根据我们的距离度量,找到最近的K个点,然后在这些相邻点中进行投票,然后这些票数多的近邻点预测出结果。
所以当你使用最近邻分类器时,你总会给K赋予一个比较大的值,这样会使决策边界更加平滑,从而得到更好的结果。白色区域中没有获得K-最近邻的投票。

K-最近邻算法(KNN)

图片分类正确与否取决于它的最近邻值,可以看到KNN的表现效果不是很好,但如果我们使用一个更大的K值,那么投票操作的结果就可能会达到前三名或前五名,甚至包括到所有的数据范围,这样会对噪声产生更大的鲁棒性。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
L1距离是像素之间绝对值的总和,另一种常见的选择是L2距离,也就是欧式距离,即取平方和的平方根,并把这个作为距离。L1距离取决于你选择的坐标系统,所以如果你转动坐标轴将会改变点之间的L1距离,而改变坐标轴对L2距离毫无影响。L2距离是一个确定的,无论你在什么样的坐标轴下,如果你输入的特征向量,向量中的一些值有一些重要的意义,对于你的任务也许L1可能更适合,但如果她只是某个空间的一个通用向量,而你不知道其中的不同的元素,你不知道它们实际上代表的含义,那么L2可能更自然一些。
简单地通过指定不同地距离度量,我们便可以很好地应用这个算法,例如文本分类等。
像K和距离度量这样地选择,我们称之为超参数。因为它们不一定都能从训练数据中学到,要提前为算法做出地选择。设置这些超参数是依赖于具体问题的。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
我们关心的不是要尽可能拟合训练集,而是要让我们的分类器,我们的方法在训练集以外的未知数据上表现更好。把所有的数据分为两部分,一部分是训练集,另一部分是测试集,然后在训练集上用不同的超参数来训练算法,然后将训练好的分类器用在测试集上。再选择一组在测试集上表现最好的超参数,是错误的。机器学习系统的目的是让我们了解算法表现究竟如何。
常见的做法就是将数据分为三组,大部分数据作为训练集,然后建立一个验证集,一个测试集。我们通常所做的是在训练集上用不同的超参来训练算法,在验证集上进行评估,然后用一组超参选择在验证集上表现最好的。然后当完成了这些步骤以后,就完成了所有的调试,再把这组在验证集上表现最佳的分类器拿出来,在测试集上运行,也是你要写到报告中的数据。必须分隔验证集和测试集。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
设定超参数的另一个策略就是,交叉验证。这在小数据集中更常用一些,在深度学习中不那么常用。取出测试集数据,我们将把整个数据集,保留部分数据作为最后使用的测试集,对于剩余的数据,将训练数据分成很多份,我们轮流将每一份都当成验证集,例如在这里我们使用5份的交叉验证,用一组超参数来训练你的算法,现在前4份上训练,在第5份上验证,然后再次训练算法,在1235份上训练,在第4份上验证。然后对不同份进行循环,这似乎是一种黄金法则。如果在大数据集上,训练本身非常消耗计算能力,因此这些方法实际上不常用。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
通过交叉验证,你会得到这样一张图,这里X轴表示k近邻分类器中参数K的值,Y轴表示分类器对于不同K在数据上的准确率。这个例子里用了5折交叉验证,也就是对每个K值都对算法进行了5次不同的测试。我们可以观察算法在不同验证集上表现的方差,看到算法效果的分布,可以看出模型与各个超参数之间的关系,最后可以挑选出在验证集上表现最好的模型以及相应的超参数。可以看出k约等于7的时候效果最好。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
其实,KNN在图像分类中很少用到。一是它在测试时运算时间很长,二是在于像欧几里得距离或者L1距离这样的衡量标准,用在比较图像上实在不太合适,这种向量化的距离函数不太适合表示图像之间视觉的相似度,不能表示图像之间视觉感知的差异,还有是维度灾难。K近邻分类器像是用训练数据把样本空间分成几块,这意味着如果我们希望分类器有好的效果,需要数据能密集地分布在空间中,否则最近邻点地实际距离可能很远,也就是说和待测样本地相似性没有那么高。问题在于,想要密集地分布在空间中,我们需要指数倍地训练数据。颜色代表训练数据的类别,
我们借用KNN介绍了图像分类地基本思路,借助训练集的图片和相应地标记,我们可以预测测试集中数据的分类。

线性分类1

经常把神经网络比喻为玩乐高,你可以拥有不同种类的神经网络组件,可以将这些组件组合在一起,来构建不同的大型卷积网络。我们计划输入一副图像,然后输出用于描述图像的描述性句子,这类工作的方式是卷积神经网络只关注图像,而循环神经网络只关注语言,而且我们可以把这两个网络放在一起,就像乐高一样,再将其一块训练,最终得到一个超级厉害的系统。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
线性分类器是参数模型中最简单的例子,我们的参数模型实际上有两个不同的部分,一只猫在左边还有一组参数,我们通常把输入数据写成为X,也就是参数设置或是权重,通常叫W。函数,包含了输入数据X和参数W,这就会出现10个数字来描述。
在最近邻算法的设置中没有参数,取而代之的是,我们通常会保留所有种类的训练数据,并在测试时使用。但是现在,在一个参数化的方法中,我们将总结我们对训练数据的认识并把所有的知识,都用到这些参数W中。在测试的时候,我们不再需要实际的训练数据,只需要这些参数W。这使得我们的模型更有效率。所以在深度学习中,整个描述都是关于函数F正确的结构。可以发挥你的想象来编写不同的函数形式,用不同的复杂的方式组合权重和数据,这些可以对应于不同的神经网络体系结构。最简单的就是一个线性分类器,所以F(X)=W*X,如果你能把上述方程的维度解出来,前提是我们的图像是32*32*3的输入值,我们要取这些值然后把它们展开成一个3072项长列向量,现在我们想要得到10个类的得分,也就是说W是10*3072,X是3072*1的矩阵。因此一旦我们将这两项相乘,我们就得到了10个类的分数。有时,会添加一个偏置项,是一个10元素的常数向量。它不与训练数据相互,而只会给我们一些数据独立的偏好值,仅针对一类的偏好值。如果你的数据集是不平衡的,即猫比狗多,那么与猫对应的偏差元素就会比其他的要高。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
例子:左边是一个简单的2*2图像,有四个像素,所以线性分类器的工作方式是,我们把这2*2的图像拉伸成一个有四个元素的列向量,在这个例子里我们只是限制三类,即猫狗船,现在权重矩阵是要三行四列,我们有四个像素和三个类,现在我们又有了一个三元素偏差向量,它给我们提供了每个类别的数据独立的偏差项。
猫的分数将是我们图像的像素,和这个权重矩阵之间的输入乘积加上这个偏置项。线性分类几乎是一种模式匹配方法,这个矩阵的每一行对应于图像的某个模板,现在根据输入矩阵行和列之间的乘积或点积,从而得到图像的像素点。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
在这个类的模板和图像的像素之间,有一个相似之处,然后再一次,偏差给了你这个数据独立缩放比例以及每个类的偏移量。我们可以取那个权重矩阵的行向量,并且将他们还原回图像,实际上是将这些模板可视化成图像。下方是数据集中训练得到的权重矩阵中的行向量对应于10个类别相关的可视化结果。
CS231n-深度学习与计算机视觉-笔记-Lecture2 图像分类
线性分类可能出现的问题:要构造一个线性分类器完全失效,数据集样例并不难,左边,假设我们有一个两类别的数据集,蓝色类别是图像中像素的数量,这个数字大于0,并且是奇数。任何像素个数大于0并且为偶数的图像,都归为红色类别。
多分类问题,右侧,目前没有好办法可以在两个类别之间,绘制一条单独的线性边界。所以任何时候当你有多模态数据,比如一个类别出现不同的领域空间中,这是另一个线性分类器可能有困境的地方。
下一节,我们会讨论选择正确权重的策略和算法是什么,涉及到损失函数、最优化问题,甚至是卷积方面的问题。