课程资料

趁着在学校的时间,跟着 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 个 类别的评分是:

sj=f(xi,W)j

s_j = f(x_i, W)_j 如果是 Multiclass SVM loss,具体对第 ii 个样本的损失为:

Li=∑j≠yimax(0,sj−syi+Δ)

L_i = \sum_{j \ne y_i} \max(0, s_j - s_{y_i} + \Delta) 当然,损失应该还包括正则化项,比较简单就略过了。


反向传播就比较麻烦一点,因为要用随机梯度下降的迭代方法,所以要计算梯度。读完文档 Optimization: Stochastic Gradient Descent,可以找到 SVM 的梯度是:

⎧⎩⎨⎪⎪⎪⎪⎪⎪∇wyiLi=∇wjLi=−⎛⎝∑j≠yi1(wTjxi−wTyixi+Δ>0)⎞⎠xi1(wTjxi−wTyixi+Δ>0)xij=yij≠yi

\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,即交叉熵损失而已,如下:

Li=−log⎛⎝efyi∑jefj⎞⎠or equivalentlyLi=−fyi+log∑jefj

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}

而要算梯度就麻烦一点,课程文档里也没有给公式,我推了一下写在下边,如果有错误请读者批评指正,

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪∇wyiLi=∇wjLi=−xi+efyi∑jefjxiefj∑jefjxij=yij≠yi

\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相关推荐

  1. cs231n 课程作业 Assignment 3

    作业总结 终于来到了最后一次作业,这次主要是讲 RNN 或 LSTM 这个时序模型,感觉如果公式已经熟悉了的话(没有的话多看几遍,也可以参考我上篇博文的公式总结,囧),作业应该比上次的简单.代码量也少 ...

  2. cs231n 课程作业 Assignment 2

    上一次作业基本已经讲了构建一个多层神经网络的基本知识,包括其结构,公式推导,训练方法.这一次主要关注卷积神经网络(CNN, Convolution Neural Network),要先读完课程笔记 C ...

  3. 深度学习初学者推荐怎么在本地完成CS231n课程作业-配置环境

    近期学习cs231n课程,并准备做作业,整理一下整个过程以防忘记.也许会出一个系列. 课程推荐: 喜欢看视频的可看下面两个链接之一: 1.https://cloud.tencent.com/edu/l ...

  4. 【记录贴】cs231n课程作业一遇到问题总结

    1. 在本地完成作业环境配置 cs231n课程课后作业是要求在ipython中完成并提交的,所以选择anaconda来做比较合适.关于anaconda的安装与使用可自行百度,教程很多. 选择好编译器之 ...

  5. 如何在本地完成CS231n课程作业

    最近开始学习斯坦福大学的CS231n课程,课程地址:网易云课堂,只有中文字幕,现在学完了1-7课时,准备着手做一下第一次作业,但是第一次接触不免有些手忙脚乱,自己探索了半天,准备写一个教程给和我一样的 ...

  6. cs231n课程作业答案推荐

    近期在疫情期间在家学习课程,并且做做作业,把相关推荐记下来. cs231n知乎作业 cs231n课程翻译: 1)官方英文版 2)知乎 找作业时请从下往上翻.

  7. CS231N课程作业Assignment1--SVM

    Assignment1–SVM 作业要求见这里. 主要需要完成 KNN,SVM,Softmax分类器,还有一个两层的神经网络分类器的实现. 数据集CIFAR-10. SVM原理 SVM(Support ...

  8. cs231n课程作业踩坑汇总

    欢迎移步我的个人博客 https://blog.csdn.net/Kaiyuan_sjtu/article/details/80527131 报错:from past.builtins import ...

  9. CS231n课程笔记翻译

    贺完结!CS231n官方笔记授权翻译总集篇发布 - 智能单元 - 知乎专栏 https://zhuanlan.zhihu.com/p/21930884 CS231n课程笔记翻译:图像分类笔记(上) - ...

最新文章

  1. caffe 问题集锦之使用cmake编译多GPU时,更改USE_NCCL=1无效
  2. 国王放米粒的C语言程序,云南大学软件学院C语言实验米粒问题.doc
  3. 图的遍历、最小生成树、最短路径
  4. 课时76.兄弟选择器(掌握)
  5. 【windows】windows 11 安装解决 这台电脑无法运行 Windows 11
  6. Tensorflow车牌识别完整项目(含完整源代码及训练集)
  7. 张宇八套卷(一)复盘
  8. 网站建设的一般原则及网站推广技巧
  9. C# 使用Newtonsoft.Json 对象转json字符串,json字符串转对象
  10. 开发与测试如同左手和右手
  11. 人家也是干 IT 的。
  12. 第十五届全国大学生智能车全国总决赛获奖信息-西部赛区
  13. C语言无符号与有符号之间的比较
  14. 安卓逆向Xposed HOOK TB直播APP的x-sign参数
  15. GitHub 设置和取消代理,加速 git clone
  16. 仿京细菜谱微信小程序源码云开版
  17. 量化对冲:智能对冲策略解析
  18. 专题地图制作之POI获取
  19. 3D human skeleton 数据集简易可视化
  20. 玉米社:巧用以下6点,规避短视频剪辑违规侵权问题

热门文章

  1. matlab课程论文2500字,MATLAB课程论文.doc
  2. 阿里百川 Android 接入(as 4.2.1+gradle 6.7.1+gradle tool 4.2.1)
  3. 如何创建可以吸引您的投资组合网站
  4. 曼海寧,金地上塘道,水榭春天
  5. oracle tabe unlock_Oracle常用命令大全集
  6. GAD计算机辅助诊断,GAD-7-PHQ-9可打印.doc
  7. 程序设计基础1(Python)-顺序结构
  8. springboot 无法自动装配
  9. “国云”搅动云计算江湖,产业潮水将向何处涌动?
  10. 【Java设计模式】总结