CS231n学习笔记目录(2016年Andrej Karpathy主讲课程)
- Lecture1:Introduction(介绍)
- Lecture2:Image Classification Pipeline(数据驱动的图像分类方式) (上)
- Lecture2:Image Classification Pipeline(数据驱动的图像分类方式) (下)
- Lecture3:Loss functions and Optimization(线性分类器损失函数与最优化)
- Lecture4:Backpropagation and Neural Networks(反向传播与神经网络)
- Lecture5:Training Neural Networks(神经网络训练细节) Part 1
- Lecture6:Training Neural Networks(神经网络训练细节) Part 2
- Lecture7:Convolutional Neural Networks(卷积神经网络)
图像分类的基本任务就是区分图片的种类,例如识别猫、狗、汽车等,在这之前需要将图片转换成一张巨大的数字表单,然后从所有种类中给这个表单选定一个标签。
分类问题的难点
semantic gap(语义鸿沟问题)
在计算机中,例如一张猫的图片,大致由一个300*100*3的三维数组表示,3表示RGB通道,因此表单中的数字都位于0~255之间,反映的是亮度以及每个单点三基色的权值。因此图像分类的难点在于想要处理这些表单中数以百万计的数字并对其进行分类是很困难的。
Viewpoint Variation(视角变化)
相机是可以进行旋转、缩放、平移等操作的,这些变换都能让图片具有不同的样式。
Illumination(光源)
光线对图片的亮度有很大的影响。
Deformation(形变)
例如猫的而图片也会有许多不一样的形状、姿势的改变。
Occlusion(遮挡)
例如躲在窗帘后的猫、藏在沙发里的猫。
Background Clutter(背景干扰)
检测物体可能融入背景中。
Intraclass Variation(类内差异)
一类物体的个体之间的外形差异很大,比如猫有420种类别。这一类物体有许多不同的对象,每个都有自己的外形。
An Image Classifer
在CV发展初期,人们尝试通过特征feature来识别物体,例如我们想要识别一只猫,就要找到猫的耳朵,需要检测并勾画出图片的边界,按照边界形状与连结方式进行分类。但是,如果我们要识别其他的东西,比如人或者船,就需要重新去构造特征。因此这种分类方法无法扩展。
随着互联网的发展和数据驱动的到来,我们很容易获得海量的数据,我们可以实现:
1、收集带有标签的图像数据集;
2、使用机器学习模型去训练一个图像分类器;
3、在测试集或者验证集上评估模型。
First Classifier:Nearest Neighbor Classfier
NN分类器,工作方式是高效的得到本联合训练集,在一段训练时间内,我们只需要记住所有的训练数据及其标签,对于一张新的图片,我们要做的就是对测试图像和之前看过的每一张训练集中的图像进行一一对比,然后传送相应的标签。
案例:CIFAR-10数据集
包含10个类别,50000张训练图片,10000张测试图片。
NN的速度取决于训练数据集的大小吗?
事实上,当训练集的数据量增加时,训练的速度是线性增加的(slower),因为在训练的过程中是独立地比较每一个训练样本。但在实践中,测试时间性能通常更为重要。因为真正在乎的是实际应用的过程,我们需要权衡投入到训练过程和测试过程中的计算量。NN算法在训练上是instant(即时的),但在测试时是expensive(昂贵的),CNN却完全相反,它在训练上是昂贵的(expensive training),但在测试上是廉价的(cheap test evaluation),因为每一张测试图像的计算量都是恒定不变的。
提高分类器速度的方法
近似最近邻搜索ANN(Approximate Nearest Neighbor)
KNN(k-Nearest Neighbors)
超参数的选择
距离度量的方法
曼哈顿距离:
欧氏距离:
K值的选取
KNN算法,将找到K个最邻近的images,然后将他们在类别中进行投票,将多数的作为该测试实例的类别。一个好的KNN算法要做的是,在训练集中检索到K张最相近的图像,然后对他们的标签进行投票。
例如在一个二维的共三个类别的数据集中(下图左),用NN进行分类,计算每一个点所属的类别(下图中),图中蓝色区域中有一部分属于绿色的,当K变大时(如K=5),则会发现分界线开始变得平滑(下图右),绿色区域也被蓝色区域覆盖,泛化能力更强。这里有一个问题,K=1的时候就是NN算法吗?
Accuracy
NN on training data:理论上100%(欧氏距离),因为在所有训练集中我们总能找到距离为0的点。
KNN on training data:可能不会是100%,因为即使有着最好的样本,附近的点也可能被其他类别覆盖(与超参数有关)
事实上无法确定最优的参数组合。有一个思路是对大量不同的参数进行试验,然后选取最好的。一个错误的想法是:认为测试集是算法泛化程度的代表。我们不应该只相信测试集,事实上,应该忘记所测试过的数据,假装没有这些数据,然后获取算法对于其他数据的泛化程度,也就是获取算法能够扩展到其他的适用范围、运用到实际工作中的表现(不仅仅是在训练和测试当中)。有时候算法在训练中的表现很好,但在测试集上不好,这就意味着泛化能力不够,也就是过拟合(overfitting)。拟合程度的选择会影响到分类器的泛化能力。
交叉验证
将训练数据平均分成n份,将其中的某一份当作验证数据来调整参数,其余部分作为训练数据,最终对比不同K值下验证集的平均准确率,来得出K的最好结果。如果训练数据很少,可以使用n折交叉验证。也就是将n份数据集分别作为验证集,进行n次训练,选最好的。
下图是5折交叉验证中K值确定的过程,横坐标为K,纵坐标为准确率,因此每一个K对于了5个准确率。图中画了一条线连接每一个K对应的平均准确率,竖线表示标准偏差。一开始随着K的增加,平均准确率开始上升,但在某些点之后就开始下降,在K=7时达到最大。
Problems
不同的数据集所适合的分类方法都不同,KNN在实际中一般不会被采用,因为:
- 测试效率很低;
- 距离指标(distance metrics)在高维物体判断上会非常不直观(unintuitive)。
比如下面的高维图片,第二张图片在原始图片的基础上有所偏移(往左和往下移动了),因此这张图片和原始图像在像素上完全不匹配,这在距离计算上就会产生误差;第三张图片将重要的部位剔除了,第三张将图像整体变暗,KNN无法将这些变化分辨出来。因此在这种情况下想要通过距离来进行高维物体判断,就会很不直观。
(纯学习分享,如有侵权,联系删文)