上一次作业基本已经讲了构建一个多层神经网络的基本知识,包括其结构,公式推导,训练方法。这一次主要关注卷积神经网络(CNN, Convolution Neural Network),要先读完课程笔记 CS231n Convolutional Neural Networks for Visual Recognition,基本就懂了。特别是那个解释卷积的动态图,非常形象。

CNN 主要多了卷积层(convolution layer)和池化层(pooling layer)的操作,还有防止过拟合的 Batch Normalization 层和 Dropout 层。后面又介绍了很多这两年经典的 CNN 架构,如 LeNet, AlexNet, GoogLeNet, VGG 以及现在最好的 残差网络(residual network)等。

Fully-connected Neural Network

前面的作业已经实现了多层的神经网络,或者叫多层感知机,这里为了后面搭建 CNN 的方便性,又重新模块化实现了一遍。即把线性变化(Affine Layers),激活层(Activation Layers),loss 层都抽象出来,像箱子一样,可以把模块一个个堆积起来。每层都有 forwardbackward 函数,负责前向传播和后向传播求导。

可以这样抽象出每层的原理就是链式求导法则,前面已经讲过了。每层只要关注 输出的梯度,就可以算出来 输入的梯度,这样一层层传递下去。很多现代的神经网络框架,如 tensorflow,pytorch 等都是这样子设计的,实际上这样节点的计算连接,最后组成了一个有向无环图,即计算图(Computation Graph)。在 TensorBoard 中还可以可视化这个计算图。

完成 FullyConnectedNets.ipynb 的要求,其中需要写完 cs231n/layers.py 中的 affine_forward, affine_backward, relu_forward, relu_backward 函数,最后几行的损失函数 svm_loss, softmax_loss 因为和之前的代码一样,所以已经帮我们实现好了。

完成 fc_net.py 中的 TwoLayerNet 类和 FullyConnectedNet 类,实现 optim.py 中的 sgd+momentum, rmsprop 和 adam,原理和公式可以参考 neural-networks-3,或者我前面的博客总结。

其实把每层都模块化以后,代码写起来还是很清晰的,麻烦点在于理清楚每层之间的关系,不过这些都是编程的逻辑和技巧,仔细一点就好了。

Batch Normalization

Batch Normalization 的出现真是逆天,加上一个简单的归一化操作(即减去均值,除以标准差),就能取得各种好的效果。具体来说,在卷积操作或者全连接层之后,但是在激活层之前加上 BN 层,会有下面的几个效果和好处,

  • 减少坏初始化的影响
  • 加快模型的收敛速度
  • 可以用大些的学习率
  • 能有效地防止过拟合

具体是怎么做的呢?是在一个 mini-batch 的数据中,算一个均值和标准差,然后做归一化,如下面公式所示,

里面的参数 γ,β\gamma, \beta 是可学习的参数,是为了提高模型的容纳能力(capacity),即可以改变原输入,也可以保持原来的输入不变。

反向传播时,也是按照链式法则求导即可,推导也很简单,见下图,

具体在作业里,按照 BatchNormalization.ipynb 的步骤,要实现 cs231n/layers.py 里的 batchnorm_forwardbatchnorm_backward,和 batchnorm_backward_alt 三个函数。这里实现的是一维的 BatchNorm,后面可以发现,其实卷积上的 SpatialBatchNorm 也可以通过一维的接口实现。这里输入的数据 xx 的是 NN 个维度为 DD 的向量,我们针对每个维度,在 NN 个数据间算一个均值和方差。每个 mini-batch 的数据都用自己的均值方差来标准化,然后在训练的过程中,会计算一个 running_mean 和 running_var,以便预测的时候用。默认的 batchnorm_backward 是用计算图的方式计算的,比较快,而后面那个 batchnorm_backward_alt 是用论文里的公式直接实现的,比较容易理解。

那么问题来了,为什么 BatchNorm 能够 work?背后的原理是什么呢?原论文里分析了很多,其中题目就提到可以减小了 internal covariance shift 的现象,而知乎上有人分析是减小了梯度消失(梯度弥散)问题。参考 知乎: 深度学习中 Batch Normalization为什么效果好? 和 Quora: Why does batch normalization help?

Dropout

Dropout 这种技术是 Hinton 老先生的那一派提出的黑魔法,一般会把这一层加在激活层之后。激活值会按照 p∈[0,1]p \in [0, 1] 的概率被保留,其余的都置零,这样可以有效地缓解过拟合的现象。

在实现 Dropout 的时候,有一种技巧,如教程 neural-network-2 提到的,原始的实现方法,由于在训练时丢掉了部分的激活值,造成整体分布的期望值的下降,因此在预测时也要乘上一个概率 pp,才能保持分布的统一。另一种的做法叫做 inverted dropout,就是直接在训练时多除以一个概率 pp,那么在预测时就不用做任何操作了。

这部分作业比较简单,按照 Dropout.ipynb 的步骤实现 cs231n/layers.py 里的 dropout_forward, dropout_backward 函数,添加 dropout 层到分类器 fc_net.py 中。

ConvNet on CIFAR-10

卷积这部分是重点,主要需要实现 conv,max-pooling 和 spatial batch normalization,然而我 numpy 功力不够,经常需要参考大神的代码,有机会还要回来琢磨琢磨这些代码。按照 ConvolutionalNetworks.ipynb 的步骤,需要实现 cs231n/layers.py 里的 conv_forward_naive, conv_backward_naive, max_pool_forward_naive, max_pool_backward_naive, spatial_batchnorm_forward, spatial_batchnorm_backward 函数。

算卷积操作的前向传播时,基本思路是先沿着输入数据 xx 的后两个维度,即图片的宽和高做 padding,而要输出的 feature map 上的每个点,都是原始的 xx 和对应的卷积核在所有通道上做内积得到的。特别是 L420-L424 这几行代码比较难理解:

for i in range(output_height):for j in range(output_width):x_padded_mask = x_padded[:, :, i*stride:i*stride+HH,j*stride:j*stride+WW]for k in range(F):out[:, k, i, j] = np.sum(x_padded_mask * w[k, :, :, :], axis=(1,2,3))

out 是 feature map,第一个维度是 batch,第二个维度 k 是输出通道数,后两个维度 i,j 是 feature map 的高和宽。卷积核共 F 个,每个都是一个长方体,即输入的通道数 C * 卷积核的高 HH * 卷积核的宽 WW。

后面反向传播的逻辑和这里正好反过来了,见代码 L470-L474

for k in range(F): #compute dwdw[k ,: ,: ,:] += np.sum(x_pad_masked * (dout[:, k, i, j])[:, None, None, None], axis=0)
for n in range(N): #compute dx_paddx_pad[n, :, i*stride:i*stride+HH, j*stride:j*stride+WW] += np.sum((w[:, :, :, :] * (dout[n, :, i, j])[:,None ,None, None]), axis=0)

每个 feature map 的像素点都所有的卷积核和输入都有作用。对权重的梯度,要遍历所有通道数,在 batch 的维度上求和。对输入的梯度,要遍历所有的 batch,在通道数的维度上求和。


max-pooling 的代码就相对简单一点了,即在 pooling_mask 上取一个最大值,反向传播时,只是最大值的那个点有梯度回传回去。这里只是实现了最常见的 max-pooling,还有别的如 avg-pooling,stochastic pooling,还有 Kaiming He 大神的 Spatial Pyramid Pooling 。采用池化(pooling)的操作有很多的好处,

  • 引入不变性(invariance)

    • 包括 translation(平移),rotation(旋转),scale(尺度)
    • 只要在 pooling window 里出现了激活,那么在哪里出现其实无所谓。对应原图片中,物体只要出现了,在图片的位置已经无所谓了。
    • 当然,反过来说,pooling 之后也失去了局部的的位置信息。
  • 减少了参数,防止过拟合,减少计算量
  • 获得定长输出,两种方法
    • 可以做 global pooling, 把 feature map 变成 (batch_size,channel,1,1) 的大小
    • 利用 SPP,把输入划分成定量的格子后做 pooling,这个在 R-CNN 中也有应用

spatial_batchnorm 是在一维的 batch norm 的基础上实现的,代码也很少。不过代码却值得深究。具体的做法是,把每个 channel 当做是一个维度,在其他的三个维度上统计均值和方差。原话解释如下,

If the feature map was produced using convolutions, then we expect the statistics of each feature channel to be relatively consistent both between different imagesand different locations within the same image. Therefore spatial batch normalization computes a mean and variance for each of the C feature channels by computing statistics over both the minibatch dimension N and the spatial dimensions H and W.

最后要完成 ConvolutionalNetworks.ipynb 和 cnn.py 的代码。

cs231n 课程作业 Assignment 2相关推荐

  1. cs231n 课程作业 Assignment 1

    课程资料 趁着在学校的时间,跟着 cs231n 的课程做了一下作业,感觉收获特别大,现在汇总在博客里.下面是一些官方的课程资料: 网页 备注 课程主页 主页课程介绍,浏览器也可以跑深度学习 课程官方笔 ...

  2. cs231n 课程作业 Assignment 3

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

  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. 在线html转ipa,iphone在线安装 ipa 应用:利用 itms-services 协议实现 iOS 应用程序在线安装功能...
  2. [总结] 康托展开及其逆运算
  3. 蜘蛛牌 HDU - 1584(搜索——达到先让某些段先结合,达最优解)
  4. 初学JavaWeb需要的前端js,JavaScript是什么样的?
  5. 路由器-配置(思科)
  6. 怎么让照片变年轻_做了隆鼻,至少年轻5岁
  7. VMware虚拟机下网络连接的三种模式
  8. 【numpy】argmax参数辨析(axis=0,axis=1,axis=-1)
  9. codevs 1029 遍历问题
  10. Windows环境上装在VM,VM安装CentOS7
  11. VBA批量OCR识别提取身份证照片信息_人脸识别一体机,支持多种证件比对
  12. 潘多拉 搭建 php服务器,OpenWrt/LEDE/潘多拉固件4G网卡上网之【HiLink模式上网教程】...
  13. AI提取图片里包含的文字信息-解决文字无法复制的痛点
  14. 在fedora 36 上安装docker
  15. 三星手机 qq上通过我的设备我的android上传到手机的东西,两个手机怎么互传文件?...
  16. ArangoDB——操作案例二
  17. 【Mo 人工智能技术博客】利用Logistic函数和LSTM分析疫情数据
  18. 二进制拆弹实验详解linux,拆解二进制炸弹
  19. 全屏截图保存为文件_VisualFreeBasic源码
  20. 【JY】结构工程师:请避开有限元分析中6个常见的“坑”

热门文章

  1. 蓝桥杯算法竞赛系列第八章——提高篇之广度优先搜索(BFS)
  2. [Deep-Learning-with-Python]GAN图片生成
  3. opencv学习(六)之掩膜版
  4. Python实现的《芳华》WordCloud词云+LDA主题模型
  5. python中for语句涉及的序列可以是字符串吗_用for循环,可以遍历字符串、列表、元组、字典、数字序列、文件(TXT、excel)。...
  6. 大漠易语言 找字、找图
  7. 文摘 - 巧取老山参
  8. Hive On Spark优化
  9. docker保存镜像报错:Cowardly refusing to save to a terminal. Use the -o flag or redirect.
  10. android 横向滚动选择,简单实现自定义横向滚动选择View