@[TOC](CS231n Assignment 1(一))
这篇文章就用来说说CS231n A1 Q1-Q3主要教的东西,还有计算SVM、Softmax损失函数和梯度的全矢量化(fully-vectorized)代码吧。
0.图像识别的简单分类器
CS231n是讲卷积神经网络(Convolutional Neural Network,CNN)图像识别的,当然,不可能一开始就来讲CNN(可能也可以吧),所以前面的几个lecture从简单的图像识别器开始讲起。
A1前三问主要讲了两大类图像识别分别器:KNN (nonlinear classifier中的一种) 和 linear classifier,linear classifier 根据Loss的不同又可以再分成svm loss linear classifer 和 softmax loss linear classfier。
1.KNN (Q1)
KNN分类器比较简单。它的基本逻辑是,在训练的时候记住所有的训练样本,包括样本的特征和标签。在预测的时候,它计算测试样本到各个训练样本的“距离”,然后根据前 K K K 个最近的训练样本的标签来决定预测的标签是什么。
好比说,我们取 K = 3 K=3 K=3,然后计算出来离测试样本最近的3个样本的标签分别为 1 , 1 , 2 1,1,2 1,1,2,由于这里面 1 1 1 最多,所以测试样本的预测标签是1。
这个算法最关键的地方是计算距离矩阵,也就是各个测试样本到训练样本的距离。如果测试样本的数目是 N t e N_{te} Nte,训练样本的数目是 N t r N_{tr} Ntr,那这个距离矩阵的维度是 N t e × N t r N_{te}×N_{tr} Nte×Ntr,其中 ( i , j ) (i,j) (i,j)位置的元素代表测试样本 i i i与训练样本 j j j的距离。
比如说我们要用 L 2 L^2 L2 范数来表征距离。最简单的计算方法是写两个loop,一个循环test set,一个循环training set,逐一计算距离。当然,这种办法的计算速度是贼慢。
我们可以使用fully-vectorized的代码来加快速度,因为numpy的库已经为我们优化过矩阵运算的速度了。Python代码如下:
X_te_square=np.sum(X**2,axis=1).reshape(num_test,1)
X_tr_square=np.sum(self.X_train**2,axis=1).reshape(1,num_train)
X_te_tr_cross=np.dot(X,self.X_train.T)
dists+=X_te_square
dists+=X_tr_square
dists-=2*X_te_tr_cross
dists=np.sqrt(dists)
原理就是将平方项展开为二次项、交叉项,然后用pyhton numpy自带的broadcast功能将二次项和交叉项拼接回去。
2.Linear Classifier (Q2 & Q3)
我们可以把每张图片拉长成一个长向量 x ∈ R D x\in R^D x∈RD,这里 D D D是图片的像素点数乘上RGB通道数。一般来说,我们希望训练一个分类器,把图片分为 { 0 , 1 , . . . , C − 1 } \{0,1,...,C-1\} { 0,1,...,C−