(转)【2017CS231n】第二讲:图像的分类(KNN和线性分类器)

https://blog.csdn.net/poulang5786/article/details/79617924

开始学习CS231n课程了,记录一下,也希望对其他人有帮助,可能会有错误,希望大家指正。

一.如何让机器理解图像

    人看到猫的图片就知道这是猫,看到狗的图片就知道这是狗。但是电脑看到的呢?在计算机中图片的存储形式就是一个个的矩阵,代表了图片的像素值。所以在人看来很直观的图片,对计算机来说只是一个个矩阵。所以如何让计算机从这些像素中理解它们所表示的含义,这对计算机来说是个很难的问题。

    从像素到语义,还存在许多其他问题。如图片的旋转、光照变化、遮挡、变形等。可能对人来说那个猫还是那个猫,你二大爷还是你二大爷。但是对计算机来说,你二大爷可能就变成了隔壁老王。例如猫的图片发生了旋转,光照变化,遮挡,变形等,对于人理解这幅图片代表的含义可能没有任何问题,但是对计算机来讲,图片在计算机中所对应的矩阵可能就完全不一样了。这就给计算机理解图片带来和很大的挑战。

二.传统方法

    传统的方法,识别一个猫,就是提取猫的轮廓,尖尖的就是两个耳朵,长的是尾巴,四肢毛发等都有对应的规则。这样做会识别一些猫的图片,但是就如上述所说的,如果出现了遮挡,变形,光照等的变化,那么这些识别猫的规则可能就不起作用了。

 

三.数据驱动

    由于传统方法存在弊端,那么我们如何采用更好的方法来让计算机理解图片的内容呢?

    由此就引出了数据驱动的方法。具体来说就是我们不使用具体的规则(例如尖尖耳朵花纹皮毛就是猫)来对图片进行分类,而是用大量猫的图片来训练出一个可以自动分类的函数。这个训练好的函数接受图片,然后输出一个标签(也就是图片的分类是什么,到底是阿猫还是阿狗)。这个分类的函数代码像下面这样:

def classify_image(image):
#some magic here?
return class_lable

    但是实际用到的,应该是两个函数,一个训练函数,一个预测函数。训练函数接收图片和图片所属的分类(也就是标签),经过训练后返回一个模型;而预测函数就是接收训练好的模型和待分类的图片,经过运算返回预测的分类标签。代码像下面这样:

def train(images, labels):#训练函数
#Machine Learning
return model
def predict(model, test_images):#预测函数
#Use model to predict labels
return test_labels

    那么下面的问题就是,这两个函数是什么样子的?是怎么得来的? 

    这一讲介绍了两种方法:K-NearestNeighbor(kNN)和线性分类器。

3.1 KNN:最邻近算法

    kNN思想:计算一个点A与其他所有点之间的距离,取出与该点最近的k个点,然后统计这k个点里面所属分类比例最大的,则点A属于该分类。通俗点讲,如果离点A最近的几个点都是二狗,那么也A也是二狗。

    kNN在代码里如何实现的呢?其实很简单,训练过程就是单纯记忆了所有训练的图像和每一个图像对应的类别标签,当有一个待分类的图像进来时,从存储的图片中取出k个图像,跟这k个图像比较相似性,这个过程可能会比较好几组,每一组都是k个成员。与哪一组的k个图像最相似(在knn中就是距离最近),然后在这个最相似的组中,看看组中大部分都属于哪个分类,那么待测图片的分类就确定了。

    那么这个相似性如何判断?也就是两个图像距离的远近。

3.1.1  L1距离和L2距离

    L1距离也是曼哈顿距离,思想就是对两幅图像对应的每个元素做差,取绝对值,然后求和。看下式子:

    L2距离也叫欧式距离,就是在对像素做差后再平方,累加后的结果在开方,下面是L1和L2的式子:

3.1.2超参数

    超参数是在训练之前设定好的参数,在kNN中就是k值和距离distance。

    通过选择合适的k和d,能使分类效果更好。参数该怎么选择,试出来。

3.1.3 训练集和测试集

 

1.用所有数据来训练,模型会拟合所有数据,但是并不会对预测数据有帮助(过拟合问题)
2.数据集分成两部分,训练集和测试集。使用不同的超参数在训练集上训练模型,将训练好的分类器用在测试数据上,在测试集上选择一组表现最好的超参数。
但是这样只会使得我们选择的超参使模型在这组测试集上表现良好,并不代表在其他数据集上我们的参数也是好的
3.训练集,验证集,测试集

在训练集上用不同超参来训练模型;在验证集上进行评估,选择一组在验证集上表现最好的超参;最后在测试集上跑一遍模型和选择的超参。最后的结果才是超参和模型在未知数据集上的表现(也是你写到论文和报告中的结果)。

4.交叉验证

交叉验证将数据集分出一部分做测试集,剩下的部分分成几个小份,每一小份轮流做验证集,而其他的部分轮流做训练集。

从中选择表现较好的超参。

3.1.4 KNN局限性

1.训练时间短,测试验证时间长(与我们的需求正好相反)

2.不太适合比较两幅图像的相似性

3.维度灾难

我们需要数据集密集地分布在空间中,这样才能更好的判断利用KNN判断距离。由此产生的问题就是需要指数倍的数据

一维空间:可能只需要4个点就可以充满整个空间
二维空间:可能就需要16个数据才能充满空间
三维空间:64
 

空间维度越高,数据量指数倍增加

3.2 线性分类器(Linear Classification)

3.2.1 线性分类器介绍

x:输入的图像
w:权重
对应的输出是10个分类所对应的分数,也就是分类可能性的大小。

knn需要保留训练数据,而线性分类器只需要保留训练好的权重w即可,线性分类器可运行在小型设备上。

对线性分类器来说,所有训练的过程都体现在了w矩阵中。

w通过训练得到。

 

例如:2*2的图像,三分类问题

把图像拉成一个4*1的列向量,与权重矩阵w相乘,w为3*4矩阵(4个元素3个分类),相乘后再加一个偏置,最后得到各个分类对应的分数。w*x+b=c。

其实线性分类器就是对所有像素做加权和。

 

总结:

这一讲首先介绍了在理解图像方面,传统方法的局限性,然后引出了数据驱动的方法。接着又介绍了数据驱动的两种方法:

KNN和线性分类器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值