前言

本篇文章主要对一些经典的神经网络进行分析。大致分为:AlexNet,ZFNet,VGG,GoogleNet和ResNet。当然,还存在着很多新类型的优秀的网络,但由于ResNet的视觉识别能力已经在ILSVRC(ImageNet大规模视觉识别挑战赛)当中超过了人类的识别能力,因此我们就先不再继续往下面分析。


AlexNet

AlexNet的网络结构

AlexNet主要由8层全连接神经网络构成。包括5层卷积层和3层全连接层构成。
AlexNet.png


第一层卷积层

卷积层:输入图像尺寸为227×227×3大小,经过96个11×11×3的卷积核,padding=0,stride=4,输出尺寸为(227-11)/4+1=55,因此输出图像尺寸为55×55×96。
池化层:采用maxpooling的方式,其中池化核的大小为3×3,padding=0,stride=2,输出尺寸为(55-3)/2+1=27,因此输出图像尺寸为27×27×3。
NORM1:局部归一化层,其作用为:对局部神经元的活动创建竞争机制;响应比较大的值变得相对更大;抑制其他反馈较小的神经元;增强模型的泛化能力。(后来研究表明:更深的网络中该层对分类的效果并不显著,还会增加计算量和存储空间)


第二层卷积层

卷积层:输入的图像尺寸为27×27×256大小,经过256个5×5的卷积核,padding=2,stride=1,输出尺寸为(27-5+2*2)/1+1=27,因此输出图像尺寸为27×27×256。
池化层:与第一层卷积层一致,最终输出的特征图尺寸为13×13×256
NORM2:与第一层卷积层一致。


第三、四层卷积层

卷积层:最终保证输出图像的尺寸大小为13×13×384.
该两层没有池化层和局部归一化层!


第五层卷积层

卷积层:输入图像尺寸为13×13×384大小,经过256个3×3卷积核,stride=1,padding=1,输出特征尺寸为13×13×256
池化层:池化核大小为3×3,padding=0,stride=2,输出的特征图尺寸为6×6×256.


第六、七、八层

全连接神经网络分类器,输入maxpooling传入的特征响应图组,输出图像类别概率。
采用Dropout策略防止过拟合
使用加入动量的随机梯度算法,加快收敛效率


AlexNet的突破

1.RELU激活函数的引用
2.层叠池化操作:可以简单理解为在池化过程中,池化核经过了很多有重复的地方,这样可以防止过拟合情况的产生。
3.引入dropout操作:dropout局部失活用来预防过拟合现象的产生,减少了复杂的神经元之间的相互影响。
4.网络层数的叠加。


pytorch实现实例

该实例来自于《动手学深度学习pytorch版》

import time
import torch
from torch import nn, optim
import torchvision
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

class AlexNet(nn.Module):
def __init__(self):
super(AlexNet, self).__init__()
self.conv = nn.Sequential(
nn.Conv2d(1, 96, 11, 4), # in_channels, out_channels, kernel_size, stride, padding
nn.ReLU(),
nn.MaxPool2d(3, 2), # kernel_size, stride
# 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数
nn.Conv2d(96, 256, 5, 1, 2),
nn.ReLU(),
nn.MaxPool2d(3, 2),
# 连续3个卷积层,且使用更小的卷积窗口。除了最后的卷积层外,进一步增大了输出通道数。
# 前两个卷积层后不使用池化层来减小输入的高和宽
nn.Conv2d(256, 384, 3, 1, 1),
nn.ReLU(),
nn.Conv2d(384, 384, 3, 1, 1),
nn.ReLU(),
nn.Conv2d(384, 256, 3, 1, 1),
nn.ReLU(),
nn.MaxPool2d(3, 2)
)
# 这里全连接层的输出个数比LeNet中的大数倍。使用丢弃层来缓解过拟合
self.fc = nn.Sequential(
nn.Linear(256*5*5, 4096),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(4096, 4096),
nn.ReLU(),
nn.Dropout(0.5),
# 输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000
nn.Linear(4096, 10),
)

def forward(self, img):
feature = self.conv(img)
output = self.fc(feature.view(img.shape[0], -1))
return output

ZFNet

ZFNet网络结构

ZFNet与AlexNet的网络结构基本一致,但是它存在一些改进措施:
1.将第一个卷积层的卷积核大小改成了7×7,防止丢失掉过多的细节信息
2.将第二、三个卷积层的卷积步长都设置成了2,防止图片缩小过快,导致丢失特征
3.增加了第三、第四个卷积层的卷积核个数


VGG

VGG网络结构

VGG网络分类为VGG16和VGG19,但是VGG19所需要的内存更多,所以我们以VGG16为例。
VGG16包括13个卷积层和3个全连接层
VGG16.png


卷积层

13个卷积层分成了5段,每一段中卷积层的卷积核个数均是相同的,为3×3尺寸。
多个小卷积核串联有什么优势?答案在于,多个小尺寸卷积核串联可以得到与大尺寸卷积核相同的感受野。同时需要运行的参数数量还会减少。、
VGGcompare.png