pytorch复现网络AlexNet和VGG

关于AlexNet很重要的链接1
关于AlexNet很重要的链接2

下图是AlexNet的网络结构

下面两个网络输入图片不一致,一个是224x224,一个是227x227

注意,第一幅图可能是VGG16的结构图(不确定中)

pytorch复现网络AlexNet和VGG_第1张图片
pytorch复现网络AlexNet和VGG_第2张图片
pytorch复现网络AlexNet和VGG_第3张图片

下面的过程是该网络配置结构中各个层的data flow diagram(训练阶段)

conv1阶段pytorch复现网络AlexNet和VGG_第4张图片

  1. 第一层输入数据为原始的227x227x3图像,图像被11x11x3的卷积核进行卷积,卷积核对原始图像的每次卷积都生成一个新的像素,卷积核沿着原始图像的x轴方向和y轴方向两个方向移动,移动步长是4个像素。
  2. 行和列的55x55个像素形成对原始图像卷积之后的像素层,共有96个卷积核,会生成55x55x96个卷积后的像素层,
  3. 反向传播时,每个卷积核对应一个偏差,即第一层的96个卷积核对应上层输入的96个偏差值

conv2阶段

pytorch复现网络AlexNet和VGG_第5张图片
????????????????上面第二个方框中的计算式子27-5+2x2,式子中2x2是因为group x padding???????????????????????????????

  1. padding=2,padding的中文解释就是填充。就表示为了后续处理,需要将输入的每幅像素层的左右两边和上下两边各填充上2个像素。

conv3阶段

在这里插入图片描述
??????????这里为什么要(13-3+1x2)式子中为什么要乘以2,是因为有2组卷积核?类似于上面group=2???????????????????????????

  1. padding=1,就表示为了后续处理,需要将输入的每幅像素层的左右两边和上下两边各填充上1个像素。

conv4阶段在这里插入图片描述

  1. padding=1,就表示为了后续处理,需要将输入的每幅像素层的左右两边和上下两边各填充上1个像素。

conv5阶段

pytorch复现网络AlexNet和VGG_第6张图片

5个卷积层结束后就是3个全连接层

fc6阶段

pytorch复现网络AlexNet和VGG_第7张图片
??????????????????为什么是4096?????????????????

  1. 第六层输入数据的尺寸是66256,采用66256尺寸的滤波器对第六层的输入数据进行卷积运算;
  2. 每个66256尺寸的滤波器对第六层的输入数据进行卷积运算生成一个运算结果,通过一个神经元输出这个运算结果;
  3. 共有4096个66256尺寸的滤波器对输入数据进行卷积运算,通过4096个神经元输出运算结果;
  4. 这4096个运算结果通过relu激活函数生成4096个值;
  5. 并通过drop(dropout层)运算后输出4096个本层的输出结果值。
  6. 由于第六层的运算过程中,采用的滤波器的尺寸(66256)与待处理的feature map的尺寸(66256)相同,即滤波器中的每个系数只与feature map中的一个像素值相乘;
  7. 而其它卷积层中,每个滤波器的系数都会与多个feature map中像素值相乘;
  8. 因此,将第六层称为全连接层。
  9. 第五层输出的66256规模的像素层数据与第六层的4096个神经元进行全连接,
  10. 然后经由relu6进行处理后生成4096个数据,
  11. 再经过dropout6处理后输出4096个数据。
fc7阶段

pytorch复现网络AlexNet和VGG_第8张图片

  1. 第六层输出的4096个数据与第七层的4096个神经元进行全连接,
  2. 然后经由relu7进行处理后生成4096个数据,
  3. 再经过dropout7处理后输出4096个数据。
fc8阶段

pytorch复现网络AlexNet和VGG_第9张图片

  1. 第七层输出的4096个数据与第八层的1000个神经元进行全连接,
  2. 经过训练后输出被训练的数值。

pytorch复现网络AlexNet和VGG_第10张图片
3. 由上图可见,AlexNe共有8层网络,有5个卷积层,然后紧跟着3个全连接层。简图如下图
pytorch复现网络AlexNet和VGG_第11张图片
4. 采用的激活函数是ReLU,激活函数表达式是f(x)=max(0,x)
pytorch复现网络AlexNet和VGG_第12张图片
5. 如上图所示,AlexNet在每个全连接层后都加上了dropout层。减少过拟合。dropout层以一定的概率随机关闭当前层中神经元激活值。
6. dropout层,不同的神经元组合被关闭,代表着不同的结构,所有这些不同的结构使用一个子数据集并行地带权重训练,权重和为1。在预测的时候,相当于集成这些模型取平均。这种结构化的正则化就可以避免过拟合。
7. 而且由于神经元是随机选择的,所以可以减小神经元之间的相互依赖,从而确保提取出的相互独立的重要特征。

卷积神经网络具有两个特点:神经元间的权重共享和卷基层间的稀疏连接。

在卷积层,某一层的神经元只是和输入层中的神经元局部连接,而且卷积核的参数是在整个2-D特征图上共享的。

VGG16

VGG16相对于AlexNet的一个改进是:采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(如11x11 5x5)。
  1. 对于给定感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核优于大卷积核。因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还较小(因为参数少)

3个步长为1的3x3卷积核连续作用在一个大小为7的感受野,则参数总量是3x3x3xcxc,其中c为channel,指的是输入和输出的通道数。

如果是直接使用7x7卷积核,则参数总量是7x7xcxc,可以看出参数量是大大增加的

  1. 而且3x3这种小卷积核有利于更好保持图像性质。
下图是VGG16网络图
不同的VGG网络结构是差不多的,主要的不同体现在每一个卷积段内(共有5个卷积段)卷积层的个数以及卷积层的参数。

pytorch复现网络AlexNet和VGG_第13张图片

  1. VGG16即VGG-D,他的特点是重复使用一种块结构,多次重复使用同一大小的卷积核来提取复杂的特征。
  2. 如上面结构图所示,conv3-64(数字64)/conv3-128(数字128)/conv3-256等,可以看出网络的通道数从较小的64开始,然后每经过一个下采样或者池化层成倍地增加,与此同时特征图大小也会成倍减小。

GoogleNet/Inception提出的原因

将VGG16部署在一个适度大小的GPU上是困难的,因为需要VGG在内存和时间上的计算要求很高。因为VGG的卷积层通道数过大,所以VGG不高效。
  1. 一个3x3卷积核,如果其输入和输出的通道数都是512,那么需要的计算量是3x3x512x512
  2. 卷积操作时,输出特征图上某一个位置,其与所有的输入特征图是相连的,这是一种密集连接结构。
  3. GoogleNet基于:在深度网络中大部分的激活值是不必要的,为0,还有有些相关性是冗余的,所以最高效的神经网络架构是:激活值之间是稀疏连接的,意味着512个输出特征图是没有必要与所有的512个输入特征图相连。
  4. 可以对网络剪枝来得到稀疏权重和连接。

GoogleNet设计了一种inception模块,这个模块用密集结构近似一个稀疏的CNN。如下图

pytorch复现网络AlexNet和VGG_第14张图片

  1. 因为只有很少一部分的神经元是真正有效的,所以一种特定大小的卷积核数量设置得很少。并且,GoogleNet使用了不同大小的卷积核抓取不同大小的感受野。inception模块的另一个特点是使用瓶颈层,也就是1x1卷积来降低计算量。
  2. 假定inception模块的输入为192个通道,使用128个3x3卷积核和32个5x5卷积核,5x5卷积核的计算量是5x5x32x192,

网络变深,网络的通道数和卷积核数会增加,计算量也会暴涨

  1. 为了表面上面的问题所以在使用较大卷积核前,先降低输入通道数。
所以,inception模块中,输入首先送入只有16个卷积核的1x1卷积层,然后再送给5x5卷积层。这样计算量为16x192x1x1+5x5x32x16,计算量大大减少了。

把1x1卷积层称为瓶颈层,是因为1x1卷积层拥有最少的通道数,在inception模块中就是一个瓶子最窄处。

GoogleNet的另一个特殊点:在最后的卷积层后使用全局均值池化层代替了全连接层,全局池化就是在整个2D特征图上取均值,这样操作减少了模型的总参数量

  1. 在AlexNet中,全连接层参数占了网络总参数的90%。使用一个更深更大的网络使得GoogleNet在移除全连接层后还不影响准确度。

ResNet

  1. 提出原因:网络深度增加带来的问题:因为梯度从后向前传播,增加网络深度后,比较靠前的层梯度会很小。这意味着这些靠前的层基本上学习停滞了,梯度消失问题。另一个原因是:网络更深时,参数空间更大,优化问题变难。
  2. 解决办法:构造残差单元。
  3. 残差单元可以解决问题的原因在于:假设一个网络A,其训练误差为x,通过在A上面堆积更多的层来构建网络B,这些新增的层什么也不做,仅仅复制前面A的输出,把新增的层称为C,这就意味着网络B和网络A的训练误差一样,但是实际上训练网络B的误差比训练网络A的误差更大,这是因为增加的层C去学习恒等映射是不容易的。所以残差模块在输入和输出之间建立了一个直接连接,这样新增的层C仅仅需要在原来的输入层的基础上学习新的特征,即学习残差,这样比较容易。
和GoogleNet一样,ResNet在最后也使用了全局均值池化层
  1. 利用残差模块,可以训练152层的残差网络
  2. ResNet主要使用3x3卷积核,和VGG类似。
  3. 在VGG的基础上,添加短路连接进而形成残差网络。如下图
    pytorch复现网络AlexNet和VGG_第15张图片
  4. 由于存在梯度消失问题所以34层的普通网络比18层的网络其误差更大。但是有了短路连接(残差模块)后,34层的残差网络比18层的残差网络性能好。

网络深度越来越大,为了保证正确率,则设计结构倾向于选择较小的卷积核,例如1x1和3x3等。

设计网络结构时采用模块结构可以减少网络的设计空间,使用1x1卷积层(瓶颈层)可以降低计算量。

你可能感兴趣的:(计算机视觉,神经网络)