CS231n 图像分类笔记

1. 图像分类的任务,就是对于一个给定的图像,在一个固定的分类标签集合中,预测它属于的那个分类标签(或者给出属于一系列不同标签的可能性)。

2. 图像是3维数组,数组元素是取值范围从0到255的整数。数组的尺寸是宽度x高度x3,其中这个3代表的是红、绿和蓝3个颜色通道。也就是是图像数组包括了:宽度x高度x3这么多个数字,我们的任务就是把这些上百万的数字变成一个简单的标签,比如“猫”。

3. 数据驱动方法:图像分类不像简单地排序数字列表那样,它没有明显的硬编码算法识别猫或其他类。不再写具体的分类规则来识别,而是在网上抓取大量猫等种类的图片数据集,然后训练机器来分类这些标记图片,了解每个类的视觉外观,机器会收集所有数据用某种方式总结,然后生成一个模型,总结识别出这些不同类的对象的核心知识要素,然后用这些模型来识别新的图片,看是否识别准确,可以进行分类器的评估。

4. 图像分类流程:图像分类就是输入一个元素为像素值的数组,然后给它分配一个分类标签。完整流程如下:

  • 输入:输入是包含N个图像的集合,每个图像的标签是K种分类标签中的一种。这个集合称为训练集
  • 学习:这一步的任务是使用训练集来学习每个类到底长什么样。一般该步骤叫做训练分类器或者学习一个模型
  • 评价:让分类器来预测它未曾见过的图像的分类标签,并以此来评价分类器的质量。我们会把分类器预测的标签和图像真正的分类标签对比。毫无疑问,分类器预测的分类标签和图像真正的分类标签如果一致,那就是好事,这样的情况越多越好。

5. 如何比较两张图片呢?

   在本例中,就是需要比较32x32x3的像素块。最简单的方法就是逐个像素比较,最后将差异值全部加起来。换句话说,就是将两张图片先转化为两个向量和,然后计算他们的L1距离 、L2距离。

    1. L1距离(曼哈顿距离)

    取像素差绝对值之和,只对图像的每个像素做对比,对应像素相减取绝对值,再将这些差值相加就是距离。

distances=np.sum(np.abs(self.Xtr-X[i,:]),axis=1)   #使用L1距离:计算每一像素向量差的绝对值的和 axis=1,对列进行运算

     2. L2距离(欧几里得距离)取像素差平方之和的平方根。

distances=np.sum(np.sqrt(self.Xtr-X[i,:]),axis=1) #使用L2距离:计算每一像素向量差的平方的和 再求平凡根

        在L1方形或L2圆形上的点分别与原点是等距的,L1距离取决于你选择的坐标系统,所以如果转动坐标轴时将会改变点之间的L1距离,而对L2无影响。当输入特征向量,对于向量中一些特殊意义的值或许L1更适合。但若它只是某个空间中的通用向量,不知道他的含义,L2更自然一些。

6. 超参数(hyperparameter)

       k-NN分类器需要设定k值,那么选择哪个k值最合适的呢? 我们可以选择不同的距离函数,比如L1范数和L2范数等,那么选哪个好? 还有不少选择我们甚至连考虑都没有考虑到(比如:点积)。所有这些选择,被称为超参数(hyperparameter)

7. 决不能使用测试集来进行调优

如果你使用测试集来调优,算法实际部署后,性能可能会远低于预期。这种情况,称之为算法对测试集过拟合。

如果使用测试集来调优,实际上就是把测试集当做训练集,由测试集训练出来的算法再跑测试集,自然性能看起来会很好。

8. 不用测试集调优的方法? 验证集(validation set

其思路是:从训练集中取出一部分数据用来调优,我们称之为验证集(validation set)。训练集分成训练集和验证集。使用验证集来对所有超参数调优。最后只在测试集上跑一次并报告结果。

9.交叉验证

交叉验证。有时候,训练集数量较小(因此验证集的数量更小),人们会使用一种被称为交叉验证的方法,这种方法更加复杂些。还是用刚才的例子,如果是交叉验证集,我们就不是取1000个图像,而是将训练集平均分成5份,其中4份用来训练,1份用来验证。然后我们循环着取其中4份来训练,其中1份来验证,最后取所有5次验证结果的平均值作为算法验证结果。CS231n 图像分类笔记_第1张图片

       

你可能感兴趣的:(CS231n 图像分类笔记)