时间:2019/3/24
内容:
1.数据驱动方法 2.KNN
任务:
- 完成Assignment1 Q1
https://cs231n.github.io/assignments2018/assignment1/
课时4:数据驱动方法
numpy教程:
http://cs231n.github.io/python-numpy-tutorial/
Google Cloud教程:
http://cs231n.github.io/gce-tutorial/
图像分类任务
分类系统接受一些输入的图像,且系统清楚了一些确定了分类或标签(语义标签)的集合和一些固定的类别标签集合。任务是看图片,并且给让分配其中一些固定的分类标签
困难点
- semantic gap
- viewpoint variation
- illumination
- deformation
- occlusion
- background clutter
- intraclass variation
下面开始讲数据驱动
基本思想
虽然利用上一讲中的计算图像边缘,把边角各种形状分类好,写一些规则识别,但这不是一种可推演的算法,效果也并不好。
实际处理上,我们并不写一些分类规则,而是在网络上抓取各种分类大量图片数据集或者直接利用一些建好的数据集,训练机器来分类这些图片,机器会接受所有数据,用某种方式总结,然后生成某种模型,总结识别出这些不同类的对象的核心要素。
核心两个函数
-
训练函数
接收图片和标签,输出模型 -
测试函数
接受模型,预测图片分类
第一个分类器:Nearest Neighbor
注: 训练集只是单纯记录所有训练数据
那么给出两幅图片,我们应怎样对它们进行比较呢?需要确定使用什么样的比较函数。以下是其中一种方式。
-
L1 distance(Manhattan distance)
原理:
对这些图片中的单个像素进行比较,测试集与训练集图片对应位置像素值相减取绝对值,最后将所有像素的差值相加
代码实现:
Nearest Neighbor特点:
训练过程O(1),测试过程O(N),测试过程很慢,较为落后的方法
NN的改进方法:KNN
特点:
通过从K个最近的点获得多数选票,来取代之前NN复制最近邻居的标签的方式.
以下是参照网上和一些书中的解释:
卷积网络和其他参数模型
特点:它们会花很多时间在训练上,测试过程很快
课时5:KNN
关键点
确定我们应该如何比较相对近邻数据的距离值(距离度量)
- L1 distance (见课时4)
- L2 distance(欧氏距离)
把平方和的平方根作为距离
改变坐标轴对L1有影响,对L2无影响
如果输入的特征向量中的一些值对你的任务有一些重要意义,L1可能更好;但如果它只是某个空间中的一个通用向量,并不知道它们实际上代表的含义,这种情况下L2更自然
超参数
K值和距离度量都是超参数(它们不一定都能从训练数据中学到,需要人为设定)。那么该如何根据自己的问题和数据来选择超参数呢?在机器学习中,我们关心的不是尽可能拟合训练集,而是要让分类器在训练集以外的未知数据上表现更好
注意:
idea#2不好的原因是,所选择的超参数可能只对这一组测试集表现好,但这组测试集无法体现模型在全新数据上的表现;idea#3的思路是,在训练机上用不同超参数来训练算法,在验证集(它的标签不用于训练,而用于评估)上进行评估,然后选择在验证集上表现最好的那组超参数,在所有调试等过程都结束后,把表现最佳的分类器拿出来在测试集上跑(这样跑出来的结果才会告诉你你的算法在未见的新数据上的表现如何),注意往往最后才会接触测试集数据
注意:
idea#4思路是,我保留部分数据作为测试集,对于剩余的数据,不是把它们分成一个训练集和一个验证集,而是分成很多份,轮流把每一份当做验证集;由于训练成本过高,因此大数据量不适用
注意:
KNN并不适用于图片分类