cs231n assignment1

   cs231n的assignment1主要是通过使用numpy库,来构造三个:KNNMulticlass SVM以及Softmaximage classification pipeline;而且在构造pipeline的同时,尽可能编写出vectorvized的代码。最后还要求实现一个两层神经网络的图像分类器,同样也会涉及如何从图像中提取更高层次的图像特征,来提高分类器的效果。
   在assignment1中使用的是CIFAR-10数据集;CIFAR-10数据集里一共有10类,包含60000张图片,50000张用了训练,10000张作为测试;每张图片的大小为3 x 32 x 32。而assignment1已经提供了数据读取以及预处理的函数(主要读取数据,然后做reshape与transpose处理)。在这次作业中,需要将图片做为向量输入,所以会看到对数据的预处理,是将其flatten()展开成向量。


KNN(K-NearestNeighbour)

   KNN是机器学习算法中的一种,主要流程:

  1. 将测试集(个向量)的数据输入
  2. 计算测试集中各个数据与训练集(个向量)中各个数据的距离,得到结果为,其大小
  3. 对按行进行从小到大的排序,然后选择排序后的前K列做为候选
  4. 统计K个候选所对应的类别,数量最多的,则为该测试数据所对应的类别
       KNN分类器比较特别的一个地方在于,并不需要对分类器进行训练,只需加载训练数据集合;而在测试阶段,需要计算测试数据与训练数据的距离,因此训练数据必须保存在模型,不能丢弃。而KNN分类器的hyperparameter也仅有“K”,因此在调参方面来看,相对方便。
       在assignment1中,计算矩阵时的实现方式,会影响模型的性能;在assignment1中,分别渐进地实现两个循环到一个循环到无需循环来计算矩阵。前两种实现方式较为简单,而对于compute_distances_no_loops的实现,只需利用和numpybroadcast机制即可完成(由于作业中的距离要求为欧氏距离)。

SVM

   assignment1的第二部分是实现线性SVM分类器,SVM的整个流程如下:

  1. 先计算,得到数据关于C个类别的分数,其中
  2. 选择得分最高的作为该数据的所属类别

在模型训练的阶段,其loss functionhinge loss具体是:

那么关于整个训练集的loss function就是:

   关于的梯度推导的情况如下:

那么可以推导出


softmax

   assignment1的第三部分,构造softmax分类器。整个流程与SVM的一样,先计算数据关于10个类别的分数,然后选择分数最高的作为其归类;而不同的地方在于,loss function改为:

关于softmax的梯度推导,可以参考一下博主蜗牛一步一步往上爬的推导讲解,写得很详细清晰,剩余的步骤与上述的SVM一样。
   从上面两部分可以看到,主要都是先通过线性模型算出关于10个类别的得分,然后得分高者则将其归于其中一类;分类器的训练就是是希望使正确类的得分可以上升,错误类的得分降低;上述的softmax functionSVM function其实就是分类器的训练目标、优化目标,而定义不同的loss function则会训练成不同的分类器。其实线性分类器,主要是指其决策边界是线性的,而其决策边界为:。当分数大于0则为边界的一侧,由于所有边界会将整个空间分成很多部分,因此在哪一侧的分数较高,则被划分为其中归属。


Two Layer Network

   assignment1的第四部分,构造两层神经网络的分类器,网络结构:

  1. FC (3 * 32 * 32, 50)
  2. ReLU
  3. FC (50, 10)

而使用的loss functionsoftmax loss funtion,使用的训练方法是SGD。这部分需要调整的hyperparameter不仅仅是learning rate,还有模型结构、训练方法等等;开始有炼丹的味道。


Img Feature Extraction

   在前面的部分,分类器都是直接将图片每个像素展开成一个向量,然后将改向量作为输入。而这部分,会首先从每张图像中,提取出Histogram of Oriented Gradients (HOG)HSV两种特征,然后拼接成向量,作为分类器的输入。HOG可以认为是标准图像的texture,而HSV可以表征图像的颜色。从assignment1中可以感受到,若使用这两个feature来代替原生像素作为输入,是用两层神经网络的分类器,分类效果最终可以到达约55%,效果有较大的提高。


小结

   assignment1主要是完成KNN、两个线性分类器SVMsoftmax以及一个两层神经网络。这一部分主要是练手与熟悉两个loss function,这些loss function以及其梯度推导在后续会较为常用;并且也简略地实现了一个两层神经网络,也是为后续部分做一个简单地了解。
   在assignment1中两个线性分类器的项目结构,是先定义一个类linear classifier,里面定义好train()predict()以及loss();然后对于两类分类器再继承linear classifier,重写loss();而具体loss()的实现,则类似定义静态函数那样来实现。

类图.png

   在该作业中,实现的gradietn check,主要是通过随机抽取相应的权重,计算来计算numerical_gradient然后与analysis_gradient的差距来进行gradietn check

你可能感兴趣的:(cs231n assignment1)