assignment1
Q1: k-Nearest Neighbor classifier (20 points)
- 收获:开始学习 numpy,two_loop、one_loop 方法都能写出来但是 no_loop 就不会写,而且连答案都看不懂
- 交叉验证的那段代码可以复用,可以 copy 到其它项目中去
- 我不会 matplotlib, 可以 copy 本作业的绘图代码去其它项目
Q2: Training a Support Vector Machine (25 points)
- 收获: svm 多分类损失函数的梯度不好求(不可导,不考虑某一点的上可导性)。 numpy 居然有 maximun 函数,以后要多问搜索 ~
- 要学 numpy matrix 的 mask 用法, 和 numpy 的升维操作(写 cs231n 的作业都变成 numpy 的学习之旅了
Q3: Implement a Softmax classifier (20 points)
- 收获:numpy 用的还是不溜
Q4: Two-Layer Neural Network (25 points)
- 收获:在处理链式推导时花了一定的时间
- 未解之谜:计算 loss 的时候,不知道为什么我的结果就是不对。标准答案也就 4 ~5 行,我的也就 4 ~5 行。 一行行对下来,只是中间变量的名字不同。居然也能导致结果不同
Q5: Higher Level Representations: Image Features (10 points)
- 收获:现在只是调 sklearn 库的机器学习从业者是永远不知道那些开拓者为了提高模型的效果做了多少的努力!
- 为了提高识别成功率,人工生成特征
- 不知道为什么,我用 2 层神经网络计算 cifar-10 数据集得出的准确率只有 10% ~~
- 在参考 cs231n.github.io 后,重新训练 2 层神经网络后得出的准确率为75%, 55%, 52.7%(不加正则化时的准确率:训练准确率、验证集准确率、测试集准确率)。方法为先关掉正则化来探索不同参数对未来的贡献
- 机器计算能力不够,没有进行更细致的探索~
Q6: Cool Bonus: Do something extra! (+10 points)
- 用 2 层网络处理 mnist 手写字符识别(把在 cifar-10 上表现好的参数套用到 mnist 上依然有很好的表现,这就是迁移学习吧 。 train/test set: 20000/1000: 测试集上准确率 97% 。 为什么在 cifar-10 的效果没有那么好? 需要做特征工程?)
- 对 cifar-10 数据集合做不同的预处理,svd、autoencode 等 (对 cifar-10 数据集, svd 压缩比设置为 65 % 左右, 在测试集合上 2-layer nn 的识别率从 47.2 % 变成了 48.9%。因为 gridsearch 的参数组合比较少,根据现有的数据来看,只能说 做 svd 后的效果不会变差。在 svm 上表现明显变差了——准确来说应该是不加正则化的准确率为 14.4% ~ 35.2%, 加上正则化后在测试集上只有 10% 的准确率)。观察对 svm 和 nn 的准确率的影响
- 观察 svm、2-layer nn 在 lenet-5 提取的特征上的表现
- 使用 knn 探索 mnist 数据集合: train/test set: 5000/500, 测试集合上的准确率能达到 91%。 train/test set: 10000/1000, 测试集上的准确率为 92.9%。
- 使用 pytorch 实现 2-layer nn ,使用 autoencoder 后接入 2 层 nnet后分类准确率只有 95%, 不接如 autoencoder 层的 2 层 nnet 的分类准确率有 97.6%
- 用 svm 和 2-lay nn 来计算 cifar-10 的 HOG特征、LBP特征、Haar-like特征并比较准确率(图像领域还是深啊, 都说 hog 要好一点。那就不用试了!)
- 用 pyCharm 单步调试 scikit-learn 观看 scikit-learn 下的 random forest 是否采用了诸如 svd、pca 这些特征预处理方法
题外话
1. 我绘图的能力比较弱,希望能在完成本作业的过程中提高个人的绘图能力
2. 就算把 cs231n 的作业都做完,也不见得有多大的收获。我不是从事这个行业,没有大量的实践机会,不会建立起感性认识和对数据的嗅觉。总而言之,学完本课程不会改变什么,唯一能称之为改变的是不会盲目地点赞
3. L2 正则化加在 loss、grad 上
4. 失误,我居然把写好的代码全部删掉了~
5. 调参是个技术活
6. 手写机器学习算法时,可以先关闭正则化来探索参数。但是调用 scikit-learn 这些库时又该如何呢,也要先关掉正则化项后探索?不加正则化项,模型可能不够稳定。比如在 svm-svd 实验中, 不加正则化项的测试集准确率在 14.4% ~ 35.2%范围内
7. 如何设计 autoencode 的各个层呢?