cs231n-(1)图像分类和kNN

图像分类

图像分类是把一副图像赋予一个标签的,标签范围已知。图像分类问题是计算机视觉的核心;其他计算机视觉问题,例如物体检测、分割等,最终都可以看做是图像识别问题。

下面是一副图像,高和宽分别为400和248,包括3个通道RGB。这意味着图像包含 400×248×3=297,600 个像素,分类过程就是把这么多像素转换为一个标签。

cs231n1_01.png
图像分类面临着以下挑战
1、视角变化:同一个物体在不同角度拍摄的图片不同。
2、比例变化:物体在图片所占比例可能不同。
3、变形:同一个物体,形状会发生有时会改变。
4、遮挡:目标物体有时会被遮挡,仅仅能看到部分物体。
5、光照:光照会影响像素值的大小。
6、背景:目标物体可能混乱在背景噪声中。
7、对象内部差异:一类对象范围很广,例如椅子,有各式各样的的椅子,外表各不相同。

下图是这些挑战的实例。优异的图像分类模型应该能够应对上面这些变化及其组合。
cs231n1_02.jpeg

数据驱动

写一个图像分类算法和写一个数字排序算法并不相同,前者不像后者那么直观。像教小孩一样,我们需要大量的有标签的图像来训练一个图像分类算法。这种方法叫做数据驱动。下图就是用来供算法学习的训练集。
cs231n1_03.jpeg

图像学习流程

图像分类的任务就是输入一组像素数据,输出一个标签。其流程吐下:
输入:N个有标签的图片,标签总类别为K。这些训练数据称作训练集。
学习:学习每一类图片的特征。这一步叫做训练或学习模型。
评估:用一个不同于训练集的有标签的集合来评估学好的模型。

最近邻分类器

最近邻分类器和卷积神经网络并不相关,但是它可以让我们学习了解图像分类的一些问题。

图像分类数据集CIFAR-10

CIFAR-10是很流行的小的图片集,它包含60,000张32x32的图片,总共有10个类别,每张图片属于其中一个类别。这60,000张图片分类训练集(50,000)和测试机(10,000)。下图在10类中随机挑选了一些:
cs231n1_04.jpeg

如果使用最近邻分类器,具体做法就是把测试机的每张图片和50,000张训练集的图片做对比,找出距离最小的图片就其类别。

怎么对比图片的距离,一张图片有32x32x3个像素,最简单的办法就是对比每个像素值。即,给定两个向量 I1,I2 ,来计算他们之间的L1距离

d1(I1,I2)=P|Ip1Ip2|

下图是计算过程的可视化
cs231n1_05.jpeg

这样的算法,只能达到38.6%左右的识别率,和最优的识别率95%差别很大。

如何选择距离:计算向量之间的距离有很多方式,另外一个常用的就是L2距离,它是计算两个向量之间的高斯距离:

d1(I1,I2)=P(Ip1Ip2)2

使用这个距离,大概可以达到35.4%左右的识别率,比L1距离略低。

L1 vs L2:在对比两个向量的差异时,相比之下, L2 L1 更加不能容忍这些差异。相对于一个大的差异, L2 能更加容忍几个中等的差异。
这里需要理解,例如3个向量:
[1,3],[4,6],[2,8] ,比较第一个向量和第二三个向量的 L1,L2 距离
L1 距离为: 41+63=6 21+83=6
L2 距离为: 32+32=18 12+52=26
L1 距离相同时, L2 距离却不同, L2 加上了平方,在 L1 相同时,即差异和相同时,各个差异比较平均情况下, L2 更小。

k-Nearest Neighbor分类器

上面例子中,只使用了距离测试图像最近的图片。kNN是使用了k个最近的图片,让k个图片来投票决定测试图片的标签。显然当k=1是就退化为上面的情况了。可以想象,更高的k值可以是分类结果更加平滑。
cs231n1_06.jpeg
在实际问题中,图和选择k值,下面就来说明。

验证集用来调优超参数

在使用kNN分类时,k选择多少是最优?在计算距离时, L1 还是 L2 ,或者其他。这些参数叫做超参数hyperparameters,在机器学习的算法中会经常提到超参数这个概念。

在调参时,绝不应该使用测试集。测试集只是用来最后验证算法性能的,如果使用测试集调参,训练的模型在测试集上的表现会过于乐观,可能会造成在测试集的过拟合。

一个正确的做法是把训练集一分为二,一个小的训练集叫做验证集。以CIFAR-10为例,可以ongoing49,000张来训练,1000张当做验证集,在验证集上调参。当训练集比较小时,可以考虑使用交叉验证。

交叉验证,交叉验证是把训练集等分为几份,选择其中一份当做验证集,其余的当做训练集来训练。例如,下图是把数据分为5份,是5折交叉验证。
cs231n1_07.png
可以看书k=7是最优。5折交叉验证过程如下
cs231n1_08.jpeg

实践,在实践中并不经常使用交叉验证,而是单独使用一个验证集,因为交叉验证带来了巨大的计算代价。常常把训练集的50%~90%当做训练集,其余当做验证集。如果验证集图片数量太少,最好还是使用交叉验证,常用的有3折、5折、10折交叉验证。

NN的优缺点

NN十分简单,容易实现和理解,且不需要训练,它需要存储所有训练数据在预测时进行计算。我们常常更加关心预测花费的时间,而不十分关心训练所用时间。实际上,深度卷积网络训练时花费很多时间,但是预测时间很短。

计算复杂度也是一个研究领域,几个Approximate Nearest Neighbor(ANN)算法和一些库可以用来加速。这些算法把精确度和复杂度做了一些trade off,例如预处理或索引建立kdtree,或者使用k-measn。

NN分类器更加适合低维度的数据,在图像分类中很少使用。图像是高维度数据,包含许多像素,高维数据的距离不符合直觉。下面图像的 L2 距离相似,但是图像语义差别很大。

cs231n1_09.png

下面这种图更加能说明这一点,相邻紧的图 L2 距离小,可以看出,邻近的图主要是背景或颜色相近,不是语义上的相近。
cs231n1_10.jpeg

总结

本节介绍了图像分类、最近邻分类器(提出了超参数概念)。设置超参数的方法是设置验证集。在训练集样本比较少时,可以使用交叉验证方法。介绍了 L1,L2 距离概念。

kNN实践总结:

1、预处理数据:对数据进行进行归一化处理,使数据均值为0,方差为1。
2、如果数据维数很高,使用PCA等降维。
3、分割训练集,要有验证集。如果训练集样本比较少,考虑使用交叉验证。
4、测试不同的 k 值以及距离度量L1,L2
5、如果预测时间过长,考虑使用近似NN库(Approximate NN library)。
6、记录超参数。不应该使用验证集来训练(最后的模型再用验证集训练),因为这样可能会导致超参数发生变化。正确的做法是使用测试集来评估超参数的效果。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值