1 问题

什么是VGG网络?怎么使用pytorch实现VGG网络?

2 方法

VGG网络就是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(AlexNext就是经典的卷积神经网络),包括5个卷积层和3个全连接层。VGG网络用2 个3*3 卷积核连续卷积代替 5*5 的卷积核,3个 3*3 的卷积核连续卷积代替 7*7 的卷积核,目的是在相同感知野的条件下,去提升网络的深度,并在在一定程度上提升神经网络的效果,提升性能。同时VGG耗费更多计算资源,使用了更多的参数,导致更多的内存占用。

为什么连续卷积可以代替大的卷积核,主要是根据感受野计算。感受野就是输出feature map上一个对应输入层上的区域大小,公式F(i)=(F(i+1)-1)*stride+Ksize (F(i)为第i层的感受野,stride为第i层步的步距,ksize为卷积核的尺寸)

import torch.nn as nn
import torch
class VGG(nn.Module):  # 定义VGG网络
   def __init__(self, features, num_classes=1000,init_weights=False): # num_classed 为分类的个数
       super(VGG, self).__init__()
       self.features = features #特征提取层通过make_features 创建
       self.classifier = nn.Sequential(
           nn.Dropout(p=0.5), # dropout 随机失活
           nn.Linear(512 * 7 * 7, 2048), #特征提取最后的size是(512*7*7)
           nn.ReLU(True),
           nn.Dropout(p=0.5),
           nn.Linear(2048, 1024),
           nn.ReLU(True),
           nn.Linear(1024, num_classes)
       )
       if init_weights:  #初始化权重
           self._initialize_weights()
   def forward(self, x):
       x = self.features(x)  #特征提取层
       x = torch.flatten(x, start_dim=1)  #ddat维度为(batch_size,512,7,7),从第二个维度开始flatten
       x = self.classifier(x)
       return x
)

3 结语

VGG主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能,从本次实验也可以看出,短时间少周期的训练并不能使得如此庞大的网络拥有很好的效果,而在比较小的网络如LeNet-5这样的网络上往往几个周期就能得到较高的精度。遗憾的是因为实验设备性能限制,网络的运行速度很慢,受限于内存大小,BatchSize的大小受限,最大只能到32,没有充足的调整空间。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐