Introduction to Deep Learning week 3
第三周的内容介绍了CNN,这里主要回顾CNN的基本概念。
Introduction to CNN
Convolutions
如果使用第二周的MLP来进行图像识别,那么结果会和物体在图像中的位置有关,如下图:
所以我们不能直接使用MLP,解决的办法是卷积(Convolutions):
Padding
在做卷积运算的时候,处于角落位置的像素进行卷积运算的次数很小,为了解决这个问题,我们可以使用Padding,在原图片周围填充一些像素:
Backpropagation for CNN
由于卷积运算会对许多像素进行重复运算,所以CNN中的反向传播和MLP中反向传播略有不同,需要进行累加:
Stride
Stride为步长,可以理解为kernel每次平移的像素数量,从一个例子中来看一下:
增加Stride主要是为了减少输出的维度。
Pooling
Pooling也是一种减少输出维度的方法,相当于直接把某些像素进行压缩,例如把每$2\times2$个像素取其中的最大值,来看一个例子:
Modern CNNs
由于当$x$很大时,$\frac{1}{1+e^{-x}}$和$\tanh(x)$的梯度很小,不利于训练,所以常常使用其他的激活函数。
ReLU activation
由于ReLU激活函数在小于$0$的地方导数为$0$,这依旧是一个不好的性质,所以还有Leaky ReLU激活函数。
Leaky ReLU activation
Weights initializations
对权重的初始化也非常重要。假设$x_i$同分布,$w_i$服从标准正态分布,且$E(x_i) =E(w_i)=0$,那么$E(\sum_{i=1}^n w_i x_i)=0$,我们来计算其方差:
我们希望输入和输出的方差尽量一致,所以会取$n \text{Var}( w) =1$,我们来计算$n \text{Var}( aw) $,注意$w$服从标准正态分布。
一般的,我们会取$a =\frac{\sqrt 2}{\sqrt{n_{in} + n_{out}}}$或者$a =\frac{\sqrt 2}{\sqrt{n_{in}}} $
Batch normalization
在输入数据之前,会做正规化处理:
Dropout
训练过程中,以一定的概率使得神经元无效,这种方法叫做Dropout:
在测试数据时,我们不对神经元采取Dropout,而是乘以Dropout的概率p:
Data augmentation
当图片数据不够时,可以对图片进行旋转,对称等处理来增加数据: