二.实例探究
2.1 为什么要进行实例探究
以下是比较经典的几种网络:
2.2 经典网络
下图是LeNet-5神经网络的结构:
(针对灰色图像训练的,平均池化)
下图是AlexNet神经网络的结构:
下图是VGG-16神经网络的结构:每经过一次卷积和池化后图像大小减半,通道数加倍。
优点:简化了神经网络。
缺点:需要训练的特征数量非常巨大。(16是指在这个网络包含16个卷积层和全连接层)
其结构都是几个卷积层后面跟着可以压缩图像大小的池化层,池化层缩小图像的高度和宽度。
2.3 残差网络
远跳连接:它从某一网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。
我们可以利用跳远连接构建能够训练深度网络的ResNets,有时深度能够超过100层。(远跳连接就是指a[l]跳过一层或者好几层,从而将信息传递到更深层的神经网络。)
下图是一个残差块,输入a[l]会传送到l+2层的线性部分之后,这样它会直接参加非线性部分的计算。
残差块:这是一个两层神经网络,在L层进行激活,得到a[l+1]再次进行激活,两层之后得到a[l+2],计算过程是从a[l]开始,首先进行线性激活,根据这个等式,步骤:通过a[l]算出z[l+1],即a[l]*权重矩阵+偏差因子,然后通过ReLu非线性激活得到a[l+1],由a[l+1]=g(z[l+1])计算得出,接着再次进行线性激活,依据的等式是后面这个,这个等式与第一个等式很是相似。g是指ReLu线性函数
构建,就是将很多个残差块,堆积在一起,形成一个深度神经网络。
下图是一个残差神经网络的示例:对于一般的神经网络,当网络层数变多时,训练错误会先减少后增加,但是对于ResNet不会出现这种情况。
2.4 残差网络为什么有用?
为什么残差网络如此好的表现?
解析:如图,在输出a[l]后通过增加残差块,增加网络深度。
(假设激活函数为Relu)
图中得到a[l+2]计算公式,可知即使w[l+2]和b[l+2]值为0,亦可得到输出a[l+2]的值为a[l](Relu激活函数在a[l]>0时线性映射),由此,残差块至少可以做到性能不会更差。当w[l+2]和b[l+2]不为0时,对性能还会有一些增益。
但如果非残差函数,直接进行计算,会使得很难更新网络参数(参数值接近0,很难通过训练得到较好的值),此时,不但不会提升性能,反而会破坏性能。
注意:a[l]和z[l+2]应该具有相同的维度,
但如果维度不一致,给a[l]乘以参数w_s,(此参数无要求,可以训练,也可设置为固定值,比如:给a[l]增加0使其满足维度即可)
残差网络为什么有用?
残差网络起作用的主要原因就是这些残差块学习恒等函数非常容易,能够保证网络的性能不会收到影响,很多时候甚至可以提高效率,或者说至少不会降低网络效率,因此创建类似残差网络可以提升网络性能。一般卷积神经网络的结构都是几个卷积层后面跟一个池化层,在网络的最后还有一个或多个全连接层。
解析: 在卷积网络,使用远跳连接,依然主义维度的一致性。注意到这里卷积网络的特点,其卷积大小保持不变,保持输出特征的维度一致。
残差网络的卷积网络,和普通网络结构一致,一组卷积,一个池化,最后全连接层通过softmax得到输出结果。
2.5 网络中的网络以及1*1卷积
下图中用对一个1*1*32的卷积对6*6*32的图像进行卷积操作,相当于对6*6个单元分别进行添加了一个全连接层。
解析:只关注其中一个切片的计算,在一个位置上,32个通道的元素和1*1卷积核的32个参数元素相乘,通过激活函数后得到输出对应位置的一个元素;假如不止一个滤波器,相当于对输入再次进行同样的计算得到另外一个输出。最终此位置输出个数为#filter,将此位置的32个通道看做全连接的32个输入,则通过32*#filter个参数,得到#filter个输出,由此,这样的1*1滤波器可以看做对该卷积层每个位置的元素都进行了全连接层的计算,之后又在这36个位置的每个位置进行相同的操作(全连接层)。(且参数均为卷积核提供)
<即实现全连接层,又大大减少了参数个数>
林敏、陈强、杨学成的论文中有详细描述。文中框架未被广泛应用,但是这种1*1卷积的理念具有很大的影响力。很多神经网络的框架都深受其影响。(包括下节的inception网络)
1*1网络的应用:
1*1卷积层可以减少或者增加图像的通道数,之前学习的池化层会减少图像的高度和宽度,但不会改变图像的通道数。
用法一:假如目前的卷积层已经有192个通道,想要减少通道数到32,那么就可以用32个28*28*192大小的滤波器。
用法二:通道数保持不变,用1*1网络可以增加一次非线性计算,使得网络更加复杂化。
(当然,增加通道数也可以通过1*1网络。)