cs231n的assignment1主要是通过使用numpy库,来构造三个:KNN、Multiclass SVM以及Softmax,image 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是机器学习算法中的一种,主要流程:
- 将测试集(个向量)的数据输入
- 计算测试集中各个数据与训练集(个向量)中各个数据的距离,得到结果为,其大小
- 对按行进行从小到大的排序,然后选择排序后的前K列做为候选
- 统计K个候选所对应的类别,数量最多的,则为该测试数据所对应的类别
KNN分类器比较特别的一个地方在于,并不需要对分类器进行训练,只需加载训练数据集合;而在测试阶段,需要计算测试数据与训练数据的距离,因此训练数据必须保存在模型,不能丢弃。而KNN分类器的hyperparameter也仅有“K”,因此在调参方面来看,相对方便。
在assignment1中,计算矩阵时的实现方式,会影响模型的性能;在assignment1中,分别渐进地实现两个循环到一个循环到无需循环来计算矩阵。前两种实现方式较为简单,而对于compute_distances_no_loops的实现,只需利用和numpy的broadcast机制即可完成(由于作业中的距离要求为欧氏距离)。
SVM
assignment1的第二部分是实现线性SVM分类器,SVM的整个流程如下:
- 先计算,得到数据关于C个类别的分数,其中
- 选择得分最高的作为该数据的所属类别
在模型训练的阶段,其loss function是hinge loss具体是:
那么关于整个训练集的loss function就是:
关于的梯度推导的情况如下:
那么可以推导出
softmax
assignment1的第三部分,构造softmax分类器。整个流程与SVM的一样,先计算数据关于10个类别的分数,然后选择分数最高的作为其归类;而不同的地方在于,loss function改为:
关于softmax的梯度推导,可以参考一下博主蜗牛一步一步往上爬的推导讲解,写得很详细清晰,剩余的步骤与上述的SVM一样。
从上面两部分可以看到,主要都是先通过线性模型算出关于10个类别的得分,然后得分高者则将其归于其中一类;分类器的训练就是是希望使正确类的得分可以上升,错误类的得分降低;上述的softmax function和SVM function其实就是分类器的训练目标、优化目标,而定义不同的loss function则会训练成不同的分类器。其实线性分类器,主要是指其决策边界是线性的,而其决策边界为:。当分数大于0则为边界的一侧,由于所有边界会将整个空间分成很多部分,因此在哪一侧的分数较高,则被划分为其中归属。
Two Layer Network
assignment1的第四部分,构造两层神经网络的分类器,网络结构:
- FC (3 * 32 * 32, 50)
- ReLU
- FC (50, 10)
而使用的loss function是softmax loss funtion,使用的训练方法是SGD。这部分需要调整的hyperparameter不仅仅是learning rate,还有模型结构、训练方法等等;开始有炼丹的味道。
Img Feature Extraction
在前面的部分,分类器都是直接将图片每个像素展开成一个向量,然后将改向量作为输入。而这部分,会首先从每张图像中,提取出Histogram of Oriented Gradients (HOG)和HSV两种特征,然后拼接成向量,作为分类器的输入。HOG可以认为是标准图像的texture,而HSV可以表征图像的颜色。从assignment1中可以感受到,若使用这两个feature来代替原生像素作为输入,是用两层神经网络的分类器,分类效果最终可以到达约55%,效果有较大的提高。
小结
assignment1主要是完成KNN、两个线性分类器SVM和softmax以及一个两层神经网络。这一部分主要是练手与熟悉两个loss function,这些loss function以及其梯度推导在后续会较为常用;并且也简略地实现了一个两层神经网络,也是为后续部分做一个简单地了解。
在assignment1中两个线性分类器的项目结构,是先定义一个类linear classifier,里面定义好train()、predict()以及loss();然后对于两类分类器再继承linear classifier,重写loss();而具体loss()的实现,则类似定义静态函数那样来实现。
在该作业中,实现的gradietn check,主要是通过随机抽取相应的权重,计算来计算numerical_gradient然后与analysis_gradient的差距来进行gradietn check。
网友评论