Stanford cs231n笔记(一)KNN和线性分类器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sxf1061926959/article/details/58672250

author:DivinerShi

学习cs231n的笔记,之前一直手写保存在笔记本上,现在准备面试复习下,就顺便过一遍,放到博客上,方便日后再看。
这个英文笔记很不错,我的博客写得比较乱,只适合自己看,大家可以看这个:http://cs231n.github.io/

K最近邻和线性分类器

K最近邻

从图像分类入手:将图像表示成一个向量,进行分类(文中以猫为例)
图像一般比较复杂,会产生旋转、缩放、平移、聚集点不同等,如何让图片样式不同,还有亮度的影响都要有鲁棒性,还有形变、判别类别不全、背景纹理相似不用的猫等———-这些都是希望去解决的问题。

图像处理初期:通过检测并勾画出图片的边界,按照边界形状与连接方式进行分类。这会让你学习到这类东西的‘样本集合’,我们可以尽量去找到他们的各种形态,比如看到任何像猫的耳朵(猫的某些结构),便可以认为检测到猫了。
但是如果要去分类船只,那又要去找船的特征,所以并没有扩展性。

L1距离度量差异

用数据训练模型,把很多图片输入模型,让模型记住这些图片,对新来的图片进行比较,看和哪一类的图片最像。最简单的相似度度量是L1距离算法,又叫曼哈顿算法,其实就是绝对差,之所以叫曼哈顿算法好像当时是用曼哈顿街区到街区之间距离计算来表示的,所以就取了这个名字。如下图所示:
这里写图片描述
直接比较图片和图片直接的绝对差,最后将差值直接相加,即:
50+7+26+31+20+12+4+54+20+7+11+59+1+8+40+9=359,这就是用L1计算得到的相似度,当图片相同时就是0。

因此最近邻算法是一个及时的训练方法,但同时他又是一个昂贵的测试方法:
训练阶段大量计算

这里写图片描述
测试的性能非常有效,对于每一张测试图像它将进行数量恒定的计算
这里写图片描述
让近邻算法中有相似性的合并为一个,这就变成了K近邻。

那么为了提高准确率,K要多大?假如:K的值为5,K最近邻分类器在训练中的准确率是多少呢?
其实K最近邻是有很大的局限性的,就算K为全部的训练数,测试图片也可能在其附近的其他点。这样还是会有误差,影响准确率。

超参数K选择

K这个超参数的两种选择方法
1、从1开始测试,然后训练集训练,测试集测试找出最后的参数,但是测试集测试结果好,不一定其它地方效果好,泛化能力不佳,就是说对测试集过拟合。
2、将我们的训练集分成‘折’,比如我们用一个‘5折验证’,把训练数据分成5等份,也就是说我们会使用训练数据中的20%来作为想象中的验证集来调整超参数。在另外4折中进行训练,取不同数量的近邻值做多数投票,通过对比不同K值下验证集的平均正确率,来得到究竟取多少个近邻值才能得出最准确的结果。如果由于你的训练数据点太少而感到不太满意,有时可以使用交叉验证法。如果由于你的训练数据点太少而感到不太满意,有时可以使用交叉验证法,在使用交叉验证法的过程中,就是反复选择测试验证折,首先使用1到4折训练,测试第5折,然后循环,用2到5折训练,测试第1折;3到1,4到2,5到3,在所有可能的测试折的选择中选出效果最好的。这就是交叉验证法。如下图:
这里写图片描述

每个K值有5个点,就是5个折分别为测试折时的准确率。折线为平均值,可以找出最好的K为4。

但是KNN现在很少用了,因为
1、效率低
2、当图片发生平移,部分缺失,亮度变化等后差值(误差很大),无法识别出来。所以想通过距离来进行高纬度物体的判断,就会有不直观的结果出现。

总结

通常用交叉验证法来得到超参数,但是大多时候,不完全使用交叉验证集,它们只用一个单一的验证集(validation set)从中得到最合适的超参数。

(Linear Classification)线性分类

这里写图片描述
如上图所示:,图像大小为32*32*3,把像素值组成一个3072维的列向量

线性分类器的输入为一个3072*1的列向量,W为一个10*3072的矩阵,经过函数f变换f(X,W)即可得到10*1的向量,分别表示十个类别的分数,从中选择出分数最大的值表示为判断为该值的分数最大。

有时会加10个b,作为一个偏置项,因为有时W不是最优的,可以通过b来来权衡10种类别,使分类更准确。表示为WX+b

线性分类器过程

下面走一遍线性分类器的过程:

假设:现在输入图像x为一只猫,用一个2*2的图片表示,那么x就是一个4个值的向量。这里要分类的全部类包括三类,猫或船或狗三种类别。
那么W就是一个3*4的矩阵,因为只有让W是3*4的矩阵才有可能Wx为一个3*1的向量来表示三个类的分数。
按如下计算X的分数:
这里写图片描述
那么分数为:
这里写图片描述
这样就可以分别计算出这个x属于cat dog ship的分数,可以看出猫的分数很低,所以W不是很好。所以就需要去训练调整W,这里其实对于每个类的分数得到的结果对其他类别来说都是相互独立的,这里的矩阵计算之间,在计算过程中并没用相互干预。Cat类只由W的第一行进行计算,dog只有W的第二行进行计算,ship只有第三行。
W矩阵由许多类似与这些不同种类的分类器组成,每个分类器分别位于W矩阵的每一行,如图片通过所有分类器然后给出每个类别的分数。
Wx:
W有关注或不关注空间上点的能力,图片上每个点x都有权重(Wi),如果权重重设为零,则W不会关注那部分图片,W中0的项对计算没有影响,有值就会产生分数。也可以理解为从图片空间映射到标志空间。

问:如果图片大小不一样,如何把图片转化成大小一样的向量?

答:把图片改变到一个相同的大小,我们没有办法去应对不同大小的图片,但是我们可以做到最简单的事是把图片变成大小一样的。现在最好的方法是改变为统一大小的方形,如果是一条长的数据,效果会很差,所以我们大多数选择压缩它,而且效果好。

这里要注意一点,实际上Wx是在做全部像素的颜色加权和。
我们将每个分类器,也就是W的每一行取出来,重新拼成一张图片,(一行的长度和图片向量长度一样)其实就是比较模糊的图片,一辆模糊的车或者一只青蛙等。但是如果训练集中有一些车,车头朝左,一些车头朝右,而这个分类器的功能呢又不是很强大,就会结合这两种状态,它因为需要去同时做这两件事情所以最后会出现双头车。而神经网络没有这个缺点,所以线性分类器有局限性。

注意一点:线性分类器没有能力同时获取所有的模型。

线性分类器解释

可以把图片看成很高维度的,由很多像素点组成的点,而每一个分类器都在描述高维空间上(比如3072维度)上的梯度,而这个分数就是在取样空间中负点指向正点方向的梯度。
这里写图片描述

如上图所示,每条线代表一个分割,我们要做的就是找出这些线。
问:对于线性分类器来说,哪种图片很难分类

答:
1、在各个分类器的交点处,如上图红色标记处。
2、如果你只有一个灰度图像集,分类器会工作的不是很好,因为不能得到必需的用来得出纹理,寻找细节用的颜色,无法定位。

损失函数定义:

损失函数:损失函数表达的是一个可以定量的测定分类器工作的好还是坏的函数。
之前我们通过肉眼观察分数来判断哪些分类器工作好,哪些不好。通过这个函数,我们能够得出一个数学表达式,用来确切的告诉我们对于一个确定的分类器W,在我们的测试中得到的结果有多坏,可能是10,可能是1000。
根据损失值改变权值W,然后一点点优化到最优。

下一篇复习线性分类器损失函数与优化

猜你喜欢

转载自blog.csdn.net/sxf1061926959/article/details/58672250