cs231n 课程作业 Assignment 1
课程资料
趁着在学校的时间,跟着 cs231n 的课程做了一下作业,感觉收获特别大,现在汇总在博客里。下面是一些官方的课程资料:
网页 | 备注 |
---|---|
课程主页 | 主页课程介绍,浏览器也可以跑深度学习 |
课程官方笔记 | 貌似要 fq 软件支持 |
Syllabus | 课件、视频、课程安排表 |
还有一些其他有用的非官方资料:
网页 | 备注 |
---|---|
课程中文翻译 | 智能单元公众号提供的翻译 |
课程视频 | 网易云课堂提供 |
作业参考 | 来自 github@lightaime 的代码 |
我的作业代码请参考 github@Halfish/cs231n
Assignment 1
完成 这里 的课程笔记中 Module 1: Neural Networks 的阅读。作业要求见 Assignment #1: Image Classification, kNN, SVM, Softmax, Neural Network,主要需要完成 kNN,SVM,Softmax分类器,还有一个两层的神经网络分类器的实现。
kNN
kNN 应该算法最简单的分类器了,读完课程文档 Image Classification: Data-driven Approach, k-Nearest Neighbor, train/val/test splits
和完成 knn.ipynb 的代码即可。
课程设置的很合理,需要依次完成两层循环、一层循环,最后完全用 numpy 的矩阵操作来实现逻辑。有点麻烦,但是都是因为对 numpy 不太熟悉,逻辑上其实没有什么难点。函数 compute_distances_no_loops 的三行代码 有点一时难以想到,不过看了别人代码也就很好理解了。
SVM
支持向量机和后面的 Softmax 分类器都是线性模型,这里只是损失函数不同罢了。阅读文档 Linear classification: Support Vector Machine, Softmax 大概就知道什么线性模型了。
对于 SVM 而言,分类器输入样本 xix_i 后,对第 jj 个 类别的评分是:
s_j = f(x_i, W)_j 如果是 Multiclass SVM loss,具体对第 ii 个样本的损失为:
L_i = \sum_{j \ne y_i} \max(0, s_j - s_{y_i} + \Delta) 当然,损失应该还包括正则化项,比较简单就略过了。
反向传播就比较麻烦一点,因为要用随机梯度下降的迭代方法,所以要计算梯度。读完文档 Optimization: Stochastic Gradient Descent,可以找到 SVM 的梯度是:
\left\{\begin{aligned} \nabla_{w_{y_i}} L_i = & -\left(\sum_{j \ne y_i}1(w_j^Tx_i - w_{y_i}^Tx_i + \Delta > 0)\right)x_i & j = y_i \\ \nabla_{w_j} L_i = & 1(w_j^Tx_i - w_{y_i}^Tx_i + \Delta > 0) x_i & j \ne y_i \end{aligned}\right.
具体需要完成 svm.ipynb 中的代码,具体的理论推导得出的梯度计算是否正确,会有 gradient check 的数值计算方式来检查。
Softmax
Softmax 是和 SVM 一起对比介绍的,只是把 hinge Loss 换成 cross-entropy Loss,即交叉熵损失而已,如下:
L_i = - \log \left( \frac{e^{f_{y_i}}}{\sum_j e^{f_j}} \right)\quad \text{or equivalently}\quad L_i = -f_{y_i} + \log\sum_j e^{f_j}
而要算梯度就麻烦一点,课程文档里也没有给公式,我推了一下写在下边,如果有错误请读者批评指正,
\left\{\begin{aligned} \nabla_{w_{y_i}} L_i = & -x_i + \frac{e^{f_{y_i}}}{\sum_j e^{f_j}} x_i & j = y_i \\ \nabla_{w_j} L_i = & \frac{e^{f_j}}{\sum_j e^{f_j}} x_i & j \ne y_i \end{aligned}\right.
在 Putting it together: Minimal Neural Network Case Study 里,构造了一个二维的数据集,用 Softmax 和 2-layer Neural Network 来做实验。完成 softmax.ipynb 的时候,计算 loss 和梯度都可以参考这篇笔记。
补充解释一下,前面的 loss function 是怎么来的呢?其实就是交叉熵。回忆一下交叉熵的公式,H(p,q)=−∑jpjlogqjH(p, q) = -\sum_j p_j\log q_j,其中向量 pp 是原始的分布,这里指的是 ground-truth label,具体是 One-hot 编码结果。qq 则是模型预测的输出,可以看做是对 qj=efj∑jefjq_j = \frac{e^{f_j}}{\sum_j e^{f_j}},由于 pp 里面一堆的零,那么显然只有 label 那项会保留下来。所以最后的结果就是 LiL_i。
再考虑交叉熵,因为 H(p,q)=H(p)+DKL(p∥q)H(p, q) = H(p) + D_{KL}(p\|q),而 H(p)=0H(p) = 0,所以最小化交叉熵,其实就是最小化 KLKL 散度。也就是想让两个分布尽量相同。
上面是信息论的角度来看 Softmax,其实也可以用概率的角度来解释,即把结果看做是对每个类别预测分类的概率值,p(yi|xi;W)=efyi∑jefjp(y_i | x_i;W) = \frac{e^{f_{y_i}}}{\sum_j e^{f_j}},因为有归一化的步骤,所以可以看做合法的概率值。
Neural Network
这部分内容较多一点,要完成三个文档,
- Neural Networks Part 1: Setting up the Architecture
- Neural Networks Part 2: Setting up the Data and the Loss
- Neural Networks Part 3: Learning and Evaluation
对于这部分内容的理解,有很多重要的内容值得参考,可以参考我上一篇博文。
前向传播和计算 loss 的逻辑和 Softmax 分类器差不多,难点在于梯度的计算。因为要涉及 矩阵对矩阵 的梯度计算。可以参考课程笔记中 Gradients for vectorized operations 的内容。总结起来就是,通过矩阵的维度匹配来记忆梯度的计算规则。后向传播的梯度也是一层层计算下去的。注意 ReLU 的导数,我写作了:dhidden[hidden_layer <= 1e-5] = 0
,里面的 1e-5
而不是 0
,是为了避免精度损失带来的计算误差。
完成 two_layer_net.ipynb 中的代码。
Features
这里讲的是提取特征,要补全的代码也是用来找最优参数的,模型的代码要跑很久而且感觉用处不大,所以就懒得写了。
链接
后面的两次作业的博文见:
- cs231n 课程作业 Assignment 2
- cs231n 课程作业 Assignment 3
cs231n 课程作业 Assignment 1相关推荐
- cs231n 课程作业 Assignment 3
作业总结 终于来到了最后一次作业,这次主要是讲 RNN 或 LSTM 这个时序模型,感觉如果公式已经熟悉了的话(没有的话多看几遍,也可以参考我上篇博文的公式总结,囧),作业应该比上次的简单.代码量也少 ...
- cs231n 课程作业 Assignment 2
上一次作业基本已经讲了构建一个多层神经网络的基本知识,包括其结构,公式推导,训练方法.这一次主要关注卷积神经网络(CNN, Convolution Neural Network),要先读完课程笔记 C ...
- 深度学习初学者推荐怎么在本地完成CS231n课程作业-配置环境
近期学习cs231n课程,并准备做作业,整理一下整个过程以防忘记.也许会出一个系列. 课程推荐: 喜欢看视频的可看下面两个链接之一: 1.https://cloud.tencent.com/edu/l ...
- 【记录贴】cs231n课程作业一遇到问题总结
1. 在本地完成作业环境配置 cs231n课程课后作业是要求在ipython中完成并提交的,所以选择anaconda来做比较合适.关于anaconda的安装与使用可自行百度,教程很多. 选择好编译器之 ...
- 如何在本地完成CS231n课程作业
最近开始学习斯坦福大学的CS231n课程,课程地址:网易云课堂,只有中文字幕,现在学完了1-7课时,准备着手做一下第一次作业,但是第一次接触不免有些手忙脚乱,自己探索了半天,准备写一个教程给和我一样的 ...
- cs231n课程作业答案推荐
近期在疫情期间在家学习课程,并且做做作业,把相关推荐记下来. cs231n知乎作业 cs231n课程翻译: 1)官方英文版 2)知乎 找作业时请从下往上翻.
- CS231N课程作业Assignment1--SVM
Assignment1–SVM 作业要求见这里. 主要需要完成 KNN,SVM,Softmax分类器,还有一个两层的神经网络分类器的实现. 数据集CIFAR-10. SVM原理 SVM(Support ...
- cs231n课程作业踩坑汇总
欢迎移步我的个人博客 https://blog.csdn.net/Kaiyuan_sjtu/article/details/80527131 报错:from past.builtins import ...
- CS231n课程笔记翻译
贺完结!CS231n官方笔记授权翻译总集篇发布 - 智能单元 - 知乎专栏 https://zhuanlan.zhihu.com/p/21930884 CS231n课程笔记翻译:图像分类笔记(上) - ...
最新文章
- caffe 问题集锦之使用cmake编译多GPU时,更改USE_NCCL=1无效
- 国王放米粒的C语言程序,云南大学软件学院C语言实验米粒问题.doc
- 图的遍历、最小生成树、最短路径
- 课时76.兄弟选择器(掌握)
- 【windows】windows 11 安装解决 这台电脑无法运行 Windows 11
- Tensorflow车牌识别完整项目(含完整源代码及训练集)
- 张宇八套卷(一)复盘
- 网站建设的一般原则及网站推广技巧
- C# 使用Newtonsoft.Json 对象转json字符串,json字符串转对象
- 开发与测试如同左手和右手
- 人家也是干 IT 的。
- 第十五届全国大学生智能车全国总决赛获奖信息-西部赛区
- C语言无符号与有符号之间的比较
- 安卓逆向Xposed HOOK TB直播APP的x-sign参数
- GitHub 设置和取消代理,加速 git clone
- 仿京细菜谱微信小程序源码云开版
- 量化对冲:智能对冲策略解析
- 专题地图制作之POI获取
- 3D human skeleton 数据集简易可视化
- 玉米社:巧用以下6点,规避短视频剪辑违规侵权问题
热门文章
- matlab课程论文2500字,MATLAB课程论文.doc
- 阿里百川 Android 接入(as 4.2.1+gradle 6.7.1+gradle tool 4.2.1)
- 如何创建可以吸引您的投资组合网站
- 曼海寧,金地上塘道,水榭春天
- oracle tabe unlock_Oracle常用命令大全集
- GAD计算机辅助诊断,GAD-7-PHQ-9可打印.doc
- 程序设计基础1(Python)-顺序结构
- springboot 无法自动装配
- “国云”搅动云计算江湖,产业潮水将向何处涌动?
- 【Java设计模式】总结