概述
从2012年之后,alexnet网络的横空出世,带来了深度学习的春天,深度学习在图像,语音等领域大放异彩,几乎碾压其它传统机器学习算法,之后的vgg网络更是被用于计算机视觉的各个任务中,比如本人研究的reid方向,很多方法都是基于vgg网络来设计算法,下面就简单介绍一下这两个网络的优秀之处。
1,alexnet
lenet是最早用于数字识别的cnn网络,alexnet也主要是对于此网络的改进,下面直接看pytorch对于这2个网络的代码实现:
1.1 lenet
class LeNet5(nn.Module):
def __init__(self):
super().__init__()
#定义卷积层,1个输入通道,6个输出通道,5*5的卷积filter,外层补上了两圈0,因为输入的是32*32
self.conv1 = nn.Conv2d(1, 6, 5, padding=2)
#第二个卷积层,6个输入,16个输出,5*5的卷积filter
self.conv2 = nn.Conv2d(6, 16, 5)
#最后是三个全连接层
self.fc1 = nn.Linear(16*5*5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
'''前向传播函数'''
#先卷积,然后调用relu激活函数,再最大值池化操作
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
#第二次卷积+池化操作
x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2))
#将多维数据重新塑造为二维数据,256*400
x = x.view(-1, self.num_flat_features(x))
print('size', x.size())
#第一个全连接
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
#x.size()返回值为(256, 16, 5, 5),size的值为(16, 5, 5),256是batch_size
size = x.size()[1:] #x.size返回的是一个元组,size表示截取元组中第二个开始的数字
num_features = 1
for s in size:
num_features *= s
return num_features
1.2 alexnet
class AlexNet(nn.Module): def __init__(self, num_classes=1000): super(AlexNet, self).__init__() self.features = nn.Sequential( #第一个卷积层,3个输入通道,64个11*11大小的卷积核 nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2), #卷积层后面跟一个relu激活函数 nn.ReLU(inplace=True), #最大池化操作 nn.MaxPool2d(kernel_size=3, stride=2), #以上可以作为一个block,整个网络基本就是多个block的叠加 nn.Conv2d(64, 192, kernel_size=5, padding=2), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(192, 384, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), ) self.classifier = nn.Sequential( nn.Dropout(), nn.Linear(256 * 6 * 6, 4096), nn.ReLU(inplace=True), nn.Dropout(), nn.Linear(4096, 4096), nn.ReLU(inplace=True), nn.Linear(4096, num_classes), ) def forward(self, x): x = self.features(x) x = x.view(x.size(0), 256 * 6 * 6) x = self.classifier(x) return x 总结:
lenet:
- 输入尺寸:32*32
- 卷积层:2个
- 降采样层(池化层):2个
- 全连接层:2个
- 输出层:1个。10个类别(数字0-9的概率)
alexnet:
- 输入尺寸:227*227*3
- 卷积层:5个
- 降采样层(池化层):3个
- 全连接层:2个
- 输出层:1个。1000个类别
差异:
(1)alexnet中使用relu作为cnn的激活函数,验证效果远远好于sigmoid,解决了网络较深时的梯度弥散问题,并且加快了训练速度,虽然很早relu激活函数就存在了,但是alexnet成功的把它发扬光大。
(2)训练时使用dropout来避免模型过拟合,dropout同样是已存在的技术,但是在alexnet验证了它的有效性,虽然之后有了BN之后一般不再使用dropout了
(3)使用最大池化,避免了平均池化的模糊效果
(4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应较大的值变得相对更大,并抑制其他较小的神经元,增强了模型的泛化能力
(5)基于GPU使用CUDA加速神经网络的训练
2,VGG网络
从alexnet到vgg,网络表达能力进一步增强,同时在imagenet上的精度进一步提高,我们简要分析一下其改进的点
如上图所示,是根据网络的层数来定义VGG网络的架构,从vgg11到vgg19,分析一下vgg网络的优缺点
优点:
(1)VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)
(2)几个小滤波器(3x3)卷积层的组合比一个大滤波器(5x5或7x7)卷积层好
(3)验证了通过不断加深网络结构可以提升性能
缺点:
VGG耗费更多计算资源,并且使用了更多的参数(这里不是3x3卷积的锅),导致更多的内存占用(140M)。其中绝大多数的参数都是来自于第一个全连接层,VGG可是有3个全连接层。
总结:
不管对于alexnet还是VGG,这些网络之所以可以被广泛应用,除了算法设计人员设计了这么优秀的网络架构之外,其他因素一样重要,简单说有如下三点
1,算法:就是各种优秀的网络结构,再加上各种设计trick,比如relu,BatchNorm等等
2,算力:最重要的就是GPU的发展,再这方面Nvidia做出了很大的贡献,不过它这几年的股价也是让他们赚的盆满钵满
3,数据:互联网的高速发展产生了大量的数据,数据是宝贵的财富,目前的说到底还是数据驱动的深度学习
目前模型的训练还是主要集中在服务器端,部署也大部分在PC端,对配置要求比较高,成本也比较高,在移动端部署会是一个大趋势,移动端部署方便,灵活,低成本。目前基本30%左右的服务在前端,70%在后端,最终的形态应该是95%的服务在前端,5%左右的服务放在后端,只负责数据的存储和分析。
最后
以上就是感性小笼包为你收集整理的alexnet和vgg网络的一些个人看法的全部内容,希望文章能够帮你解决alexnet和vgg网络的一些个人看法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复