video:https://study.163.com/course/courseMain.htm?courseId=1004697005
slides:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture2.pdf
course notes:http://cs231n.github.io/
文章所有内容来自Stanford university 课程 CS231n 2017 spring
图像分类(Image Classification) 是计算机视觉中的核心任务,即输入一张图片,给出这张图片的标签。但问题是图像分类具有巨大的语义鸿沟(Semantic Gap),即计算机所看到的图片仅仅是一些范围在[0, 255]之间的数字,需要将其转化为对应的标签。图像分类同样有很多的挑战,如下:
一个图像分类器:
def classify_image(image):
# 一些神奇的操作
return class_label
不像平常写的算法,如排序,图像分类器无法通过探寻所有特定的路径,得到一个确切的类标签。没有一个明显的方式去硬编码一个算法来识别猫或其它类别。但是研究者也作出了一些尝试。
通过找到边缘或者角落信息来总结一类图像的特征,然后来识别图像中的对象。但是这样的方法有致命的两个缺点:一个是 图片分类器容易出错,得不到正确的结果;第二个是 ,该方法无法移植到其他对象识别应用上去,一旦用于其他对象识别,该方法不在适用,需要重新设计特征选取的方法。
由于图像分类无法使用传统算法如排序算法这样的硬编码模式,所以需要使用数据驱动方法,即:
以最邻近算法为例,首先训练一个分类器模型来记忆所有的数据和标签:
def train(image, labels):
# 机器学习算法
return model
然后使用训练好的模型来预测新图像与训练图像最相似的标签:
def predict(model, test_images):
# Use model to predict labels
return test_labels
如何衡量两个图像之间的距离呢?这里以L1 距离(曼哈顿距离)为例,即:
d 1 ( I 1 , I 2 ) = ∑ p ∣ I 1 p − I 2 p ∣ d_1(I_1, I_2) = \sum_p \left\lvert I_1^p - I_2^p\right\rvert d1(I1,I2)=p∑∣I1p−I2p∣
上图是一个最邻近算法的简单实现。可以看出,该算法在训练时的时间复杂度为O(1),在预测时的时间复杂度为O(N)。但实际应用中,我们希望在训练时花费相对长的时间,在预测时用最短的时间。
上图是二维空间中画出决策边界后的结果,可以看到,有些点的位置被分类的不够理想,如绿色部分的中间出现一个黄色点,其实它应该属于绿色。还有其中一个绿色的点插入到了蓝色区域,其实它属于蓝色。针对这样的问题,提出使用KNN的方式。
从K个最近的点中选择主要点的类别,其中K=1就是最邻近算法。如上图所示,当K=3或5时,边界变得更佳光滑,而且之前的K=1时的异常点问题被有效的解决了。
除了使用L1 distance,还可以L2 distance(欧几里得距离)。由上图可以看出,L1距离会坐标依赖,即L1距离会依赖数据的坐标。下面链接是一个KNN的Demo:
http://vision.stanford.edu/teaching/cs231n-demos/knn/
针对前面的KNN问题,如何选择 K 和距离度量方式?这些都叫超参,即选择算法中这些我们设置的而不是学习的参数。
如上图所示,我们有很多方法进行超参的选择,最简单的方式是选择那些在所有数据上表现最好的超参,显然是不合理的。其次将数据分为train 和 test set,选择在test set上表现最好的超参,但是无法评价算法在新的数据上的表现。最好的方式,是将数据分为train、validation、test set,即在validation集上评估多个算法的性能,然后选择最优的算法在test set上进行测试。
还有一种方法是交叉验证(cross validation),即将数据分为几个folds,然后将每一个fold作为验证集,最后平均所有结果。
最终你会得到如上图中图表结果,横轴是K的选择,纵轴是5次交叉验证的结果。
KNN似乎是有分类的效果的,但它在对图像问题不会被使用,主要是因为:
线性分类其实是之后主讲的CNN的基础。
通过一个参数矩阵 W W W乘以数据矩阵 X X X再加上偏置 b b b 得到预测结果,即:
f ( x , W ) = W X + b f(x, W) = WX + b f(x,W)=WX+b
其实参数 W 的每一行对应的是一个类别的分类器,改变 W 的一行相当于向不同方向旋转在像素空间的线,改变 b 相当于对这条线做平移。