[cs231n之第二课]Image Classification
课程地址:
http://write.blog.****.net/mdeditor
课件地址:
http://cs231n.stanford.edu/slides/2017/
本节课程内容简介:
图像分类的
图像分类对于人来来说是很容易的事情。但是对于机器来说却很困难,这是因为对机器输入一幅图片,它不是看到一幅图像,而是得到一个具有不同数值的巨大矩阵(网络),比如800x800像素的图像,它接受到的是800x800个像素,RGB通道的各个值构成的三维矩阵。根据这个矩阵,机器要输出一个类别,与图像的标签进行对比,相同则分类正确。
(语义差距)
语义上的标签与输入的像素值存在巨大的差别。
有很多因素会导致图像的像素矩阵会完全改变,比如拍照的角度移动一点点,那图像像素矩阵的值都会改变,但这个图像代表的仍然是猫。另外一些因素有光照、不同形态、遮挡、背景干扰、猫的种类不同等。
以上图片的类别都应该输出猫,尽管它们的图像矩阵区别可能很大。
编写分类程序的思想:
最简单的分类器:KNN
在CIFAR-10数据集上训练模型并验证。
KNN的思想是,输入一个图像,找到与它最相似的K个图片集合,然后选择这个图片集合中类别最多的一个类别。那么,图像类别预测的问题就转化为,如何把两幅图像进行比较。这里用的是L1距离,又称曼哈顿距离。
使用python实现这个KNN的程序代码如下:
因为图像的分类过程会与数据集中的每一幅图做比较(曼哈顿距离),假设图像数据集的容量为N,则要计算N次,时间复杂度是O(N).训练时间复杂度是O(1),预测时间复杂度O(N)。
图像分类的速度与数据集的大小成线性函数。(然而我们希望在训练时花费时间没有关系,关键在测试的时候要快啊。)
在实践中,测试时间表现非常重要。
距离矩阵还可以选择L2距离,又名欧几里得距离。
L1取决于你选择的坐标系,如果你改变了坐标系,也会改变两个像素点的L1距离。L2则不论在什么坐标系,都不会改变两个像素点的距离。所以如果你的输入特征,单个的向量有重要的意义,那么选择L1比较合适。如果你不知道各个输入的向量代表什么,那就选择L2。通过选择不同的距离矩阵,我们可以将KNN应用于各种类型的数据,不止向量,不止图像,还可以用于文本等。
KNN的分类效果如下:
不同颜色的点为不同类别。
选择超参数的方法:
使用K折交叉验证来验证模型的性能。
(在深度学习中,K折交叉验证的代价太大了,一般不会这么做。)
KNN在图像分类上的表现不佳,且它的距离矩阵(L1 OR L2)计算图像之间的差别都不合适。
比如在上图中显示的,这四幅图像(orginal,shifted,messed up,darkened)的L2距离都相同(刻意制作的),然而KNN无法很好的捕捉图像的这些特征。
神经网络搭建者~底下几层的卷积层,顶层的线性分类器。
对于一个模型,我们输入一幅图像,想要得到一个句子来描述它。
为了达到以上的效果,我们需要让一个卷积神经网络(CNN)“看着”这幅图,然后再让一个循环神经网络(RNN)输出这个描述。然后我们就像搭积木一样,把这些网络结构叠在一起。深度学习就像搭建积木,而线性分类器就是那一个个积木
回到CIFAR-10数据集
最简单的分类过程: