Eden寒假日更_02———图像分类(数据驱动、科学调参、线性分类)
数据驱动方法
在基于数据驱动的图像分类方法出现之前,计算机视觉领域最常用的方法是基于特征描述和具体分类规则的图像分类算法。这一类算法在针对某一特定对象并发展完备之后,会有着不错的识别成功率,但是问题也会非常明显,那就是如果需要转换识别对象,就需要从头到尾重新构建新对象的特征描述和分类规则,显然它不具备不断推演泛化的能力。
随着时代的进步,人们对于那种能够自动识别所有对象的算法的需求变得越来越高。这种算法可以不依赖于具体的分类规则来识别一种物体,取而代之的是,我们从网上抓取大量该物体的图片数据集,然后训练机器来分类这些图片。机器会针对这类数据集用某种方式总结,并生成一个分类模型,包含着识别这些不同种类物体的核心要点。我们通过这些模型,就可以实现对不同物体的分类识别功能,这就是数据驱动方法。
数据驱动类的算法是比深度学习更广义的一种理念。
科学调参
无法通过数据训练得到,必须由训练者手动添加的模型参数叫做超参数。如K近邻算法中的K值大小,就代表每个分类点要和它们最近的K个进行归类,这种值是人为设定的,其大小会直接影响模型的分类效果,那么该如何进行这种超参数的调整呢?
设置验证集
这里直接贴出一张图:
简单来说就是把数据集的整体划分为训练集、测试集和验证集,在训练集上分别对一系列超参数进行选择并生成模型,在验证集上比对它们的准确率,将表现最好的一组超参数用于测试集中,测试集上的表现就代表着该问题的最优解情况。值得注意的是,在这个过程中,验证集和测试集一定要严格保证分开,且选择超参数到测试集上运行后不能再次修改,否则最终模型将不再具有说服力,这也是学术造假的一种。
交叉验证
选择超参数除了一开始给数据划分训练验证测试集之外,还有一种叫做交叉验证的方法。它的具体做法先和往常一样,拿出一小部分数据作为最后使用的测试集,对于剩余的大部分数据,我们不是把其分成训练集和验证集,而是我们把它们分成很多份,将每份数据轮流作为验证集。经过轮流的训练和验证,每组超参数有着不同的表现机会,这对于超参数的选择会有更全面的取舍依据。如下图就是一个5折交叉验证(未画完)
值得注意的是,训练模型时使用交叉验证通常有一般流程的数倍计算量,所以它只在数据规模较小的简单机器学习任务中有用武之地,大型的深度学习任务中一般还是采用划分训练验证测试集的方式进行超参数的调整。
线性分类器
线性分类器原理
线性分类器最简单的形式是这样的:
F
(
x
,
w
,
b
)
=
w
∗
x
+
b
=
y
F(x,w,b) = w*x+b=y
F(x,w,b)=w∗x+b=y
在这样一个公式中,x代表的是输入分类器的变量,w表示分类的权重模板(通过训练得到),b表示分类器*以调整效果的偏置,y代表着分类器的输出结果。
举个具体的例子,假如我们正在使用线性分类器进行CIFAR-10数据集(总共包含10个类别的图片)的分类识别任务。每张图片格式为32x32x3,总计为3072个像素数据,可以拉伸为3072x1的向量,根据矩阵相乘的原理,我们将w和b的格式确定下来,分别为10x3072和10x1,输出结果y将会是一个10x1的向量,这10个值分别对应着每个类别的匹配值,通过比较最终完成分类任务。
在上面的例子中,权重矩阵w的每一行代表着任务中每一个种类的分类算子,通过行列相乘,可以对输入变量x进行并行分类(同时得到每一个种类的匹配值)。而偏置b同样也是通过训练得到的,它代表着所有分类器对最终结果的一个妥协或者说修正,和权重矩阵w一样,它们都是并行工作的(行)。
在使用线性分类器的任务中,我们所需要做的是通过训练得出权重矩阵w和偏置b的具体数值,之后在测试集进行使用。得到w和b后可以直接丢弃庞大(可能)的训练数据集,模型构成十分简洁。
这里贴出一张给猫图片做三分类的例图:
如上述的例子,我们将输入的变量x进行了拉伸(3072x1),则可以将其看作一个3072维的点(列向量)。3072维空间我们根本无法绘出,但如果我们将这样的线性分类看作是在二维空间上进行的,那么可以将其分类过程描述为下图:
结合我们的公式:
F
(
x
,
w
,
b
)
=
w
∗
x
+
b
=
y
F(x,w,b) = w*x+b=y
F(x,w,b)=w∗x+b=y,权重矩阵w中每一行(对应每个类别)的数据如果改变,那么每一类的划线就会发生旋转,而偏置b中每一行的数据如果改变,则每一类的划线就会进行平移,这个结合中学时代学的线性函数的图形变化就很好理解了!
线性分类器局限
我们还是把问题抽象在二维空间中,这里贴出线性分类器不能解决的例图:
抽象成二维空间后,我们可以把权重矩阵w中的每一行就看作划一条分类线,但是上图中所示的红蓝区域(奇偶约束、双约束、特定约束等)显然不能通过这样划两条线完成两种类型的分类,这就体现了线性分类器的局限性。
通常情况下,自然界中的绝大部分数据只靠线性分类器是无法进行分类的,所以为了完成不同的分类任务,我们还需要非线性分类器,这就是神经网络处理方法中大名鼎鼎的激活函数了,这部分的内容以后再细细梳理吧!
PS:诶,自己还是太菜了,日更系列从明天开始会加入每日一题(葫芦书)和每日一练板块(重学Python数据整理),多学多练吧!