一、数据驱动方法
a data-driven approach:
1、collect a dataset of images and labels
2、利用机器学习to train a classifier
3、evaluate the classifier on new images
有两个函数:
1、训练函数:输入图片和标签,输出是一个模型
2、预测函数:输入一个模型,make predictions for the images
二、最近邻算法nearest neighbor
一个简单的数据驱动的例子是找到所有图片里与测试图片最相近的那一个:
要找到最相近的图片,要先比较所有图片,
如何比较两张图片????一个比较函数:
-
L1 distance(曼哈顿距离):
-
利用numpy完成的简单版classifier的代码:
-
但这个nearest neighbor classifier存在一些问题:
1、 训练函数的时间为O(1),因为仅做了简单的记忆;而预测函数的时间为O(n),因为需要将被测图片与训练集种所有n个图片进行比较。这与我们所希望的相反:我们希望训练的时间久一点,这样可以得到一个更好的classifier;而预测的时间尽可能的短。
2、这种临近算法的结果也不是很好,如中间那个黄色的点点,还有绿色部分上方凸出去的那一块,可能是受到噪声影响。
三、k-最近邻算法
1、定义:对最近邻算法的一种改进,可使分类更平滑,更有鲁棒性。选取k个距离最近的点,根据某种权值规则获得它们的majority vote,用多数投票的结果来分类。
2、L2距离(欧式距离):
方形/圆周上的点到原点的“距离”都是相同的。对于L1距离,坐标轴的转动会改变这个方形的位置;但对L2距离,无论如何转到坐标轴,圆周都还是那个圆周,它不会动。L1适用于输入向量有特殊意义的情况,而L2更适用于通用情况。
3、超参数Hyperparameters:一些参数,它们并不能通过训练数据得到,必须要提前对它们进行人为的设置。如计算距离时是选用L1距离还是L2距离,又如k邻近算法中的k到底取几。very problem-dependent,有时需要尝试多组参数的设置,选好的那种。
4、选择超参数的策略:
(1)choose the ones that work best on the data: NNNNNO!!!
在深度学习中,在意的并不是fitting当前的数据集,而是fitting一些unknown的数据集!
(2)将数据集分为train data和test data,选择能在test data上更好的预测的超参数:NNNNNO!!!
因为模型在test data上的表现并不能代表模型在其它所有data上的表现!
(3)将数据集分为train data,validation(验证)data和test data,选择在val上最好的那种参数,并在test上测试一遍。这种更好!必须要把验证集和测试集完全分离,这样才能验证模型的正确性!
(4)交叉验证:轮用验证集,不适用于大型数据集。
对于5交叉验证方法,可以得到一个如下图的结果。所有深度学习最后都要得到一个这样的结果,它能表示accuracy与超参数之间的分布关系,还有accuracy的方差和平均值。
记得写!!!!!
KNN的课程文档:https://cs231n.github.io/classification/
代码:https://github.com/Halfish/cs231n/blob/master/assignment1/knn.ipynb
四、线性分类Linear Classification
1、参数模型
在这种参数模型中,我们相当于把所有的训练数据中得到的知识都融入到了参数W里面,也就是融入到了参数模型f里。这样当我们在测试时,就可以不用再管训练数据了,直接把测试数据输入到参数模型里就可以得到预测结果了。不像之前的k最近邻算法,训练时只是把训练数据记忆一下,在测试时还得那测试数据和训练数据一个一个去比较,在测试时的时间远超过了训练的时间。
参数模型最终会给出每个类别对应的分数,分数最高的就是答案。
2、线性分类模型
线性分类的公式即为最简单的线性关系,其中W是权重,它的维数取决于输入数据的维度和输出结果的维度;b是偏置值,可有可无。
如以CIFAR10数据集作为输入,由于共有十个类别,需要输出每个类别的得分,因而我可以确定f(x,W)是101的。又由于每张图片都是32323的维度(3代表RGB),我要先把它压成一列,即30721的维度。这样我就可以判断出W的维度是多少了。
下面是一个实例:
从以上实例,我们知道W矩阵的每一行都对应一个类别,相当于W为每种类别都提供了一个模板,然后将我们输入的像素x与这个模板进行了点积的运算,相当于在比较它们的一个相似度。如果把W理解成模板的意思template,那么可以通过以上公式将对应的模板x还原出来,结果如下:
最下面一行为每个类别的模板,可以看出这些模板并不是特别的正确,比如horse里的马似乎有两个头。这是因为我们只有一个参数W,即给每种类别都限定了一个模板。但每种类别的样例可能有较大的variation,因而在视图用一个模板概况所有数据时,会出现一些诡异的模板。
3、线性分类的问题
线性分类的实质是在输入图像的高维空间中,尝试用若干直线(n-1,n为类别个数)对整个空间进行一个线性划分。
但这很容易遇到问题,比如同一类别涉及两个相对的象限,或者类别的边界是圆弧而非直线,或者多模态数据(如头朝向不同方向的马们),那么线性划分就没办法很好的工作了。例如如下这些分类划分问题就没有办法用一条直线划分,即线性分类器没有办法解决: