前言
大家好,我是Kay,小白一个。以下是我完成斯坦福 cs231n-assignment1-SVM 这份作业的做题过程、思路、踩到的哪些坑、还有一些得到的启发和心得。希望下面的文字能对所有像我这样的小白有所帮助。
在第一份作业里,我们使用的 kNN 其实有很多缺陷,比如要和全部训练集比较一遍才能得到结果、每张图存的信息太多了内存容易不足等等。现在我们来学习一种更有效率的工具: 线性分类器 。
线性分类器的思想是,训练集不是拿来比对的,而是拿来对 W 进行训练,使之存下一个所有有同一个标签下的图像的“模板”,等 W 的训练完成后,我们大可抛弃掉整个训练集,用 test 集与这个 W 做比较,显然这种方法高效得多。一个完整的线性分类器由两部分组成:一个给图片评估分数的函数 + 一个评估与真实标签差距大小的损失函数。
分数函数以 f(x, W) 的形式出现,而损失函数我们将要接触两种处理方法: SVM & Softmax
数据含义分析
· X[N*D]: N 份训练集图像,每份包含的像素数据是 D· W[D*C]: D 个像素数据,每个数据对 C 个标签的偏好/倾向
TODO1:计算损失函数里的梯度 dW
【思路】由于分数函数 f=Wx+b ,所以 W 的梯度为 x,所以直接把 x 的值直接 copy 进 dW 的数组里就行啦。
dW += -np.reshape(X[i], (-1, 1))
【开始 Debug】结果完全对不上,刚开始以为是这种广播写法不对,用下面的代码去测试了一下,是可行的!不应该对自己的代码没有自信。(虽然这种写法形式很丑)
import numpy as np
a = np.arange(6)
b = np.zeros((6, 2))