全连接神经网络(下)
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.作者的话
领取专属 10元无门槛券
私享最新 技术干货