吴恩达深度学习卷积神经网络学习笔记(2)——经典神经网络

目录

1.经典网络

    1.1 LeNet-5(1998)

    1.2 AlexNet

    1.3 VGG-16

2 ResNets(残差网络)

    2.1残差块(Residual block)

    2.2 残差网络为什么有用?

    2.3 网络中的网络以及1x1卷积

3 谷歌Inception网络


1.经典网络

    1.1 LeNet-5(1998)

假设有一张32x32x1的图片,LeNet-5可以识别图片中的手写数字。LeNet-5是针对灰度图像训练的。1998年,人们更喜欢用平均池化,那个时候也还没有padding。这个神经网络中还有一种模式至今仍然经常用到,那就是一个或者多个卷积层后面跟着一个池化层,然后又是若干个卷积层,再接一个池化层,然后是全连接层,最后是输出,这种排列方式很常用。

1.过去人们使用Sigmoid函数和Tanh函数,而不是ReLu函数,这个模式使用的正是Sigmoid函数和Tanh函数。

2.这种网络结构的特别之处还在于各个网络层之间是有关联的。例如,有一个\small n_{H}x\small n_{W}x\small n_{C}的网络,有\small n_{C}个信道,使用尺寸为fxfx\small n_{C}的过滤器,每个过滤器的信道数和它上一层的信道数相同。这是由于在当时计算机的运算速度非常慢,为了减少计算量和参数,经典的LeNet-5网络使用了非常复杂的计算方式,每个过滤器都采用和输入模块一样的信道数量。

3.经典的LeNet-5网络在池化后还进行了非线性函数处理,池化层之后使用了Sigmoid函数。论文中提到这种图形变形网络如今并没有得到广泛应用。精读论文第二段,浅读论文第三段。

    1.2 AlexNet

AlexNet是以论文的第一作者Alex Krizhevsky的名字命名的。AlexNet首先用一张227x227x3的图片作为输入(实际上论文中使用的图像是224x224x3);第一层使用96个11x11的过滤器,步幅为4;然后再使用一个3x3的过滤器构建最大池化层,f=3,s=2等,详细如图所示。

实际上,这个网络与LeNet有许多相似之处,不过AlexNet要大的多。

1.LeNet有6万多个参数,而AlexNet约6000万个参数。当用于训练图像和数据集时,AlexNet能够处理非常相似的基本构造模块。这些模块往往包含大量的隐藏单元或者数据,这一个使AlexNet表现出色。

2.相比LeNet另一个更出色的原因是,AlexNet使用了ReLU激活函数。

3.但是GPU的处理速度还很慢,所以AlexNet采用了非常复杂的方法在两个GPU上进行训练,大致的原理是这些层被分别拆分到两个不同的GPU上,同时还转门有一个方法用于两个GPU进行交流。

4.经典的AlexNet结构还有另一种类型的层,叫作“局部响应归一化层(LRN层)”。LRN层的基本思路是:

假设这是网络的一块,它的尺寸是上面这些尺寸中的某一个。比如是13x13x256,选取一个位置,从这个位置穿过整个信道,得能得到256个数字并进行归一化。进行局部响应归一化的目的是对于这张13x13的图像中的每个位置来说,我们可能并不太需要太多的高激活神经元。但是后来,很多研究者发现LRN所起的作用不是太大。我们现在并不用LRN来训练网络。

 

    1.3 VGG-16

VGG没有那么多的超参数,只是一种只需要专注于构建卷积层的简单网络。VGG-16中的数字16指这个网络包含了16个卷积层和全连接层。

首先用3x3,步幅为1的过滤器构建卷积层,padding的参数为same,然后用一个2x2步幅为2的过滤器构建最大池化层。所以VGG的一大优点就是简化了神经网络结构。

VGG其实是一个很深的网络,下图并没有把所有的卷积层都画出来,只用一串数字代表这些网络。

总共包含约1.38亿个参数。在每一组卷积层进行过滤器翻倍的操作,图像缩小的比例和信道增加的比例是有规律的。主要的缺点是需要训练的特征数量非常巨大。

 

2 ResNets(残差网络)

非常深的网络是很难训练的,因为存在梯度消失和梯度爆炸问题。

跳远连接可以从某一网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳远连接构建能够训练深度网络的ResNets。有时深度能够超过100层。

ResNets是由残差块(Residual block)构建的。

    2.1残差块(Residual block)

残差块(Residual block):

这是一个两层神经网络,在L层进行激活。得到一个a^{[l+1]}再次激活,两层之后得到a^{[l+2]}。计算过程是从a^{[l]}开始,首先进行线性激活,根据等式

z^{[l+1]}=W^{[l+1]}a^{[l]}+b^{[l+1]}       (1)

a^{[l+1]}=g(z^{[l+1]})                     (2)这里的g指ReLU非线性函数

z^{[l+2]}=W^{[l+2]}a^{[l+1]}+b^{[l+2]}   (3)

a^{[l+2]}=g(z^{[l+2]})                     (4)

根据公式(1)通过a^{[l]}计算出z^{[l+1]},然后通过ReLU非线性激活,根据公式(2)计算得出得到a^{[l+1]}。接着根据公式(3)再次进行线性激活,最后根据等式(4)再次进行ReLU非线性激活,得到的结果就是a^{[l+2]}

在残差网路中有一点变化,我们将a^{[l]}直接向后拷贝到神经网络深层,在ReLU非线性激活前加上a^{[l]}。这是一条捷径,a^{[l]}的信息直接到达神经网络的深层,不再沿着主路径传递。也就是用公式(5)去取代了原来的公式(4)。

a^{[l+2]}=g(z^{[l+2]}+a^{[l]})                     (5)

也就是加上的a^{[l]}得到了一个残差块。a^{[l]}插入线性激活之后,非线性激活之前。术语“捷径”和“跳远连接”就是指a^{[l]}跳过一层或者好几层,从而将信息传递到神经网络的更深层。

ResNets的发明者发现使用残差块能够训练更深的神经网络,所以构建一个ResNets网络就是通过很多这样的残差块堆积在一起形成一个深度神经网络。

对于一个普通网络(没有残差块),如果深度越深意味用优化算法越难训练。而且实际上随着网络深度的加深,训练错误会越来越多。但是有了ResNets情况就不一样了,即使网络再深,训练的表现却还不错,错误还会减少,就算是训练深度达100层的网络也不例外。

残差块这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能。

    2.2 残差网络为什么有用?

通常来说,网络在训练集上表现好,才能在Hold-Out交叉验证集或者dev集和测试集上有好的表现。

一个网络深度越深,它在训练集上训练网络的效率会有所减弱,这也就是我们不喜欢加深网络的原因。在训练ResNets网络时,并不是完全如此。

example

假设有一个大型神经网络(在图中用Big NN表示),其输入为x,输出激活值a^{[l]}。并且假设我们在整个网络中使用ReLu激活函数,这样所有的激活值就都大于等于0。

如果想增加这个神经网络的深度,再给这个网络额外增加两层,最后输出为a^{[l+2]},可以把增加的两层看做一个ResNet块。

a^{[l+2]}=g(z^{[l+2]}+a^{[l]})     ,添加的a^{[l]}就是刚刚添加的跳远连接的输入。展开这个表达式:

a^{[l+2]}=g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]})

注:如果使用L2正则化或者权重衰减,它会压缩W^{[l+2]}的值;如果对b应用权重衰减也可以达到同样的效果。尽管在实际应用中,有时会对b应用权重衰减,有时不会。这里的W^{[l+2]}是关键项。如果W^{[l+2]}等于0,为了方便起见也假设b等于0,此时

a^{[l+2]}=g(z^{[l+2]}+a^{[l]})=g(a^{[l]})=a^{[l]}

结果表明,残差块学习这个恒等式函数残差块并不难,因为学习恒等函数对它来说很简单。所以残差网络起作用的主要原因是:这些残差块学习恒等函数非常容易,能确定网络性能不会受到影响,如果不是恒等式而是学习了一些有用的参数,甚至可以提高效率,至少不会降低网络效率。

关于残差网络,另一个值得讨论的细节就是:如果W^{[l+2]}a^{[l]}有相同的维度,说明ResNets使用了许多相同卷积,所以这个a^{[l]}的维度等于输出层的维度;如果W^{[l+2]}a^{[l]}有不同的维度,比如输入a^{[l]}的维度是128,输出a^{[l+2]}的维度是256,增加一个矩阵W_{s},W_{s}是一个256x128维度的矩阵。如下面的公式所示。

a^{[l+2]}=g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+W_{s}a^{[l]})

不需要对W_{s}做任何操作,它是网络通过学习得到的矩阵或参数,是一个固定矩阵,padding为0。

ResNet也类似于其他很多网路,也会有很多卷积层,其中偶尔会有池化层或类似池化层的层。不论是什么层,都需要调整矩阵W_{s}的维度。普通网络和ResNet网络常用的结构是:卷积层 卷积层 卷积层 池化层 依次重复。直到最后有一个通过Softmax进行预测的全连接层。

    2.3 网络中的网络以及1x1卷积

在架构内容设计方面,其中一个比较有用的想法就是使用1x1的卷积(有时也被称为Network in Network)。

用1x1的过滤器进行卷积似乎用处不大,只是对某个输入矩阵乘以某个数字,但这仅仅是对于6x6x1的信道图片来说(如上图所示),1x1卷积效果不佳。如果是一张6x6x32的图片(如下图所示),那么使用1x1过滤器进行卷积效果更好,1x1卷积实现的作用就是遍历这36个单元格,计算左图中32个数字和过滤器中32个数字的元素智能乘积,然后应用ReLU非线性函数。我们以其中一个单元格为例,它是这个输入层上的某个切片,用这36个数字乘以这个输入层上1x1的切片,得到一个实数。

1x1x32过滤器中的“32”这个数字可以理解为:

一个神经元的输入是32个数字,乘以相同高度和宽度上某个切片上的32个数字,这32个数字具有不同信道。乘以32个权重,然后应用ReLU非线性函数。输出相应的结果。一般来说,如果过滤器是多个,就好像有多个输入单元,其输入内容为一个切片上所有数字。

所以1x1卷积从根本上理解为,这32个单元都应用了一个全连接神经网络。全连接层的作用是输入32个数字和过滤器数量(标记为n_{c}^{[l+1]}),在36个单元上重复此过程,输出结果就是6x6xn_{c}^{[l+1]}。以便在输入层实施一个非平凡计算。

可以应用到压缩n_{c},因为池化层只是压缩这些层的高度和宽度。

example

1x1卷积就是给神经网络添加了一个非线性函数,从而减少或者保持输入层中的信号数量不变(也可以增加信道数量)。

下一节就是1x1卷积网络帮助构建的Inception网络。

3 谷歌Inception网络

池化层后通过32个1x1x192的卷积,将通道数从192缩小到32,这样是为了避免最后的输出池化层占据了所有的通道。

最后把所有的方块连接在一起。

Inception网络所做的就是将这些模块都组合在一起。下图是取自Szegety et al.的论文中的关于Inception网络的图片。图中有很多的重复的模块。虽然看上去很复杂,但是如果截取其中一段会发现就是上图的Inception模块。

仔细看图,除了基本的Inception模块,还有一些分支,连接的是全连接网络,这些分支所做的就是通过隐藏层来做出预测。这些分支确保了即便是隐藏层和中间层也参与了特征计算,他们也能预测图片的分类,在Inception网路中起到调整的效果,防止网络发生过拟合。

这个神经网络的名字的梗来自于电影《Inception(盗梦空间)》。

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值