全连接神经网络(下)

全连接神经网络(下)

0.说在前面1.Batch Normalization1.1 什么是BN?1.2 前向传播1.3 反向传播2.Dropout2.1 什么是Dropout?2.2 前向传播2.3 反向传播3.任意隐藏层数的全连接网络4.训练模型5.作者的话0.说在前面

说点感慨的,有人问我为何每日都在分享,从来没有间断过,我只有一个答案,那就是:坚持

另外,我已经将作业详解新建了一个菜单,可以在公众号里面找到作业详解菜单,里面有之前的所有作业详解!

ok,我们继续来上次cs231n的assignment2的全连接神经网络第二篇。这一篇则重点研究构建任意层数的全连接网络!下面我们一起来实战吧!

1.Batch Normalization

1.1 什么是BN?

什么是Batch Normalization,以及相关的前向传播,反向传播推导,这里给出一个大佬的网址,大家可以自行mark!

Understanding the backward pass through Batch Normalization Layer

简单来说,Batch Normalization就是在每一层的wx+b和f(wx+b)之间加一个归一化。

什么是归一化,这里的归一化指的是:将wx+b归一化成:均值为0,方差为1!

下面给出Batch Normalization的算法和反向求导公式,下图来自于网上上述链接~

1.2 前向传播

前向与后向传播均在layes.py文件内!

其实这里比较好写,原因在于注释提示了很多比如注释里面的:

输入输出:

完整实现:

相关公示的注释已经写上,对上述的算法进行实现即可!

1.3 反向传播

反向传播很重要,而在assignment1中对两层神经网络进行手推,这里是一样的原理,由于自己写的有点乱,就不放手推了,给出网上的推导:

输入输出:

完整实现:

这里建议将上述算法与反向传播公式联系起来一起推,最好手推,有一个重要点提一下,就是在对x求导的时候,是层层嵌套,所以采用算法当中的分治法解决,分为多个子问题,链式推导,方便简单,而且不容易出错!

2.Dropout

2.1 什么是Dropout?

Dropout可以理解为遗抑制过拟合的一种正规化手段!在训练过程中,对每个神经元,以概率p保持它的激活状态。下面给出dropout的示意图:

回答先图b与图a明显的区别是,指向变少了,也就是去掉了很多传递过程,但在实际中不经常用,因为容易去掉一些关键信息!

2.2 前向传播

前向与反向传播在layers.py文件中!

在注释中提到了cs231n的一个关键点,大家可以去下面链接去看什么是dropout:

cs231n直通点

输入输出

完整实现

具体实现只需要记住一句话,以某一概率失活!!!也就是让当前的数据乘以每个数据的失活概率即可!

2.3 反向传播

输入输出:

完整实现:

实现就是直接上层的梯度乘以当前的梯度,上层梯度为dout,当前梯度为存储的mask。

3.任意隐藏层数的全连接网络

对fc_net.py进行修改!

对于这一块填写,之前一直有点不懂,还好今天重新看了一下注释,觉得很清楚了,建议都去看看注释的todo或者解释,很详细!!!

以这个为例:

首先我们可以看到所构建的全连接网络结构为:

网络的层数为L层,L-1表示重复L-1次,注释中都有的!

输入输出:

为了保持原文意思,这里没有翻译出来,大家克服一下,看英文,如果不懂可以留言!

下面两行#号中间为填写内容!我们所实现的目标大家可以看TODO,里面说的很详细,我简单说一下,就是来存储w与b,而这个存储的作用,则会在后面的loss用到!

目标:

计算全连接网络的损失与梯度

输入输出:

完整实现:

这里的实现思路就是按照上面一开始的注释提到的:

下面一起来看:具体代码在两行长#号中间:

下面依此调用affine、batch、relu、dropout的前向传播来实现!紧接着求出loss,最后来调用跟前向传播相对的反向传播来求梯度!

4.训练模型

最后,回到FullyConnectedNets.ipynb文件中,依此调用即可,最后填充相应的训练一个好的模型的代码!

最终要求的精度在验证集上至少50%!

上面训练后的最好结果为:

5.作者的话

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181203G006LL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券