0
本文作者: 杨文 | 2018-02-28 11:54 |
雷锋网AI研习社按:CS231n是斯坦福大学开设的计算机视觉与深度学习的入门课程,授课内容在国内外颇受好评。其配套的课后作业质量也颇高,因此雷锋网AI研习社在近期的线上公开课上请来了一位技术大牛为大家来讲解这门课的配套作业。
本文根据AI研习社公开课上的直播视频内容整理而成,主要介绍CS231n 课后作业第二套Assignment 2的完成思路与重点部分代码实现。如果你还没开始听CS231n,可直接点击课程链接观看回放视频。
王煦中,CS硕士,主要研究方向为自然语言处理与深度学习。知乎专栏喵神大人的深度工坊(http://t.cn/RTc9wfy)作者,日语及ACGN爱好者。
分享主题:CS231n 课后作业第二讲 : Assignment 2(含代码实现)作业链接:https://github.com/Observerspy/CS231n
分享提纲:
Part 1 Fully-connected Neural Network
Part 2 Batch Normalization
Part 3 Dropout
Part 4 Convolutional Networks
Part 5 Tensorflow on CIFAR-10
第一部分分享主要是全连接神经网络,这里主要是对代码进行模块化,把每一层都抽象出来,分别实现每一层的前向和反向部分,实现多层神经网络。第二和第三部分讲的是神经网络中两个的重要技巧,对网络训练有很大的提升。本次作业中比较难的部分是卷积神经网络的实现,包括正向和反向的推导过程。
第一个部分是对代码的模块化处理,实现从两层到多层神经网络。
关于Update rules
第一个改变是加入了动量更新,也就是惯性。第二个是RMSProp(自适应学习率),第三个是Adam(两者结合),其实是上面两个方法的结合,如果拿不准使用哪个方法,就用Adam。
为什么需要BN(Batch Normalization )?
传统机器学习往往需要对输入数据做一个归一化,通常使用的是零均值和方差归一,这样会保证输入的数据特征会有比较好的分布,使得算法可以比好好的学习。对于深度学习神经网络,使用BN使得每一层分布都保持在良好范围内。
BN的原理
在求均值,求方差,归一化这三步做完之后,每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征。BN第四步中最关键的是两个参数,这两个参数对归一化后的分母进行缩放和平移,通过网络自己学习平移和缩放来保留一定的特征。
训练过程
前向就是计算minibatch的均值和方差,然后对minibatch做normalize和scale、shift。测试的时候没有minibatch,通过使用基于momentum的指数衰减,从而估计出均值和方差。
反向过程
BN的作用
可以有效减缓过拟合,减小不好的初始化影响,可以用大一点的学习率。通常放在激励函数前效果好一点。
Dropout 原理
训练时以概率P保留神经元,测试时所有神经元都参与。通常在测试的时候使用inverted dropout多移除一个p保证训练预测分布的统一。
Dropout的作用
可以有效缓解过拟合,通常dropout放在激励函数的后面或者全连接层后。
接下里来看怎么实现一个卷积神经网络
卷积神经网络通常有三个单元结构,分别是卷积核,激活函数,池化层。先看卷积核,首先明确输入x和卷积核的形状(数量,通道,高,宽)。
卷积核
这里的卷积和通信原理里的卷积还是稍有区别的,在这里其实只是卷积核和相应的区域进行元素乘,然后求和,课程官网给的说明十分形象生动。
也就是每个卷积核分别在每个通道上和对应区域进行元素乘,然后求和,对应图中:(-3(通道1元素乘后求和) + -1(通道2元素乘后求和) + 0 (通道3元素乘后求和))(三个通道求和) + 1(bias_0) = -3(out的第一个格子里的值)
所以,关键问题就是根据步长如何确定x对应区域,这里需要对Hnew(下标i)和Wnew(下标j)进行双循环。选好区域直接和每个卷积(下标k)核作元素乘就行了,注意sum的时候我们其实是在(C, H, W)上作的,因此axis=(1, 2, 3)。这时候一个输出out[:, k , i, j]就计算好了。
所以上述一共套了i, j ,k三层循环,循环完毕后out再加上bias就行了。注意b的形状(F,),因此要先把b扩展成和out一样的形状:b[None, :, None, None](None相当于np.newaxis)
以上就是前向计算,接下来是反向计算。
反向计算首先明确我们要求什么。求dx,dw和db。
卷积核的三个导数具体的求解过程,请关注AI慕课学院视频回放。
池化层
pooling同样有步长,确定输出形状的公式,计算输出形状并初始化,max pooling顾名思义就是取这个pooling大小区域内的max值。注意axis=(2, 3)。
反向和ReLU、DropOut是类似的,也就是说只有刚才前向通过的才允许继续传递梯度。
max_mask形状是(HH, WW),为了和x_padded_mask形状对应也要扩展。然后dout和这个temp_binary_mask元素乘即可。同样注意dout是由i,j确定的,因此形状需要扩展。
以前我们做的BN形状是(N, D),这里不过是将(N, C, H, W)reshape为(N*H*W, C)。
最后进入TensorFlow
这里强调一点,在使用BN时请务必注意:在你的优化器上套上下面图中的两行代码,另外需要注意tf.layers.batch_normalization()中的is_training(是一个tf.placeholder)在训练和测试时的设置,如果要使用dropout也是类似的。
以上就是本次的课后作业指导分享。
雷锋网AI慕课学院提供本次视频回放,欢迎观看。
微信公众号:AI研习社(ID: okweiwu)定期邀请各路大神直播分享,关注后第一时间与嘉宾直播互动。
雷峰网原创文章,未经授权禁止转载。详情见转载须知。