GitHub地址:https://github.com/ZJUFangzh/cs231n
完成了一个基于SVM的损失函数。
数据集
载入的数据集依旧是:
1 | Train data shape: (49000, 32, 32, 3) |
而后进行32 32 3的图像拉伸,得到:
1 | Training data shape: (49000, 3072) |
进行一下简单的预处理,减去图像的平均值
1 | # Preprocessing: subtract the mean image |
1 | # second: subtract the mean image from train and test data |
1 | # third: append the bias dimension of ones (i.e. bias trick) so that our SVM |
1 | (49000, 3073) (1000, 3073) (1000, 3073) (500, 3073) |
SVM分类器
然后就可以开始来编写cs231n/classifiers/linear_svm.py
的SVM分类器了。在这里先介绍一下SVM的基本公式和原理。
SVM损失函数想要SVM在正确分类上的比分始终比不正确的比分高出一个边界值$\triangle$
第i个数据图像为$x_i$,正确分类为$y_i$,然后根据$f(x_i,W)$来计算不同分类的值,将分类简写为$s$,那么第j类的得分就是$s_j = f(x_i,W)_j$,针对第i个数据的多类SVM的损失函数定义为:
$$L_i = \sum_{j \neq y_i} max(0, s_j - s_{y_i} + \triangle)$$
如:假设有3个分类,$s = [ 13,-7,11]$,第一个分类是正确的,也就是$y_i = 0$,假设$\triangle=10$,那么把所有不正确的分类加起来($j \neq y_i$),
$$L_i = max(0,-7-13+10)+max(0,11-13+10)$$
因为SVM只关心差距至少要大于10,所以$L_i = 8$
那么把公式套入:
$$L_i = \sum_{j \neq y_i} max(0, w_j x_i - w_{y_i} x_i + \triangle)$$
加入正则后:
$$L = \frac{1}{N} \sum_i \sum_{j \neq y_i}max(0, f(x_i ;W)_{j} - f(x_i ; W)_{y_i} + \triangle) + \lambda \sum_k \sum_l W^{2}_{k,l}$$
到目前为止计算了loss,然后还需要计算梯度下降的grads,
官方并没有给推导过程,这才是cs231n作业难的地方所在。。。
详细可以看这一篇文章CS 231 SVM 求导
总之就是两个公式:
而后开始编写compute_loss_naive
函数,先用循环来感受一下:
1 | def svm_loss_naive(W, X, y, reg): |
写完后,用梯度检验检查一下:
1 | # Once you've implemented the gradient, recompute it with the code below |
1 | numerical: 34.663598 analytic: 34.663598, relative error: 6.995024e-13 |
向量化SVM
套循环肯定是最菜的做法,我们在处理图像的时候肯定都要用矩阵算的:
1 | def svm_loss_vectorized(W, X, y, reg): |
计算一下两者的时间差:
1 | Naive loss: 8.577034e+00 computed in 0.084761s |
1 | Naive loss and gradient: computed in 0.082744s |
Stochastic Gradient Descent
编辑一下classifiers/linear_classifier/LinearClassifier.train()
1 | class LinearClassifier(object): |
再编辑一下predict
函数
1 | def predict(self, X): |
得到预测值
1 | training accuracy: 0.376633 |
然后调一调learning_rate和regularization:
1 | # Use the validation set to tune hyperparameters (regularization strength and |
小结
- 多看看cs231n的note文档
- 多学习学习grad的推倒