Bachbone 之 VGGNet:走向深度

133 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Bachbone 之 VGGNet:走向深度

2014年的VGGNet荣获ImageNet亚军,其主张探索网络深度与性能的关系,用更小的卷积核与更深的网络结构,并且还取得了较为优异的效果,其网络结果图如示:

img

从图中可以看出来,网络大概有6种版本,最为常用的是VGG16的版本。VGGNet采用了5组卷积和3个全连接层,最后的部分采用Softmax做分类,其有一个显著的特点就是:

  • 每经过一层池化层,特征图的尺寸减小一倍,通道数增加一倍
  • 更多地使用3x3的卷积核来代替5*5的卷积核,因为两个3x3的卷积核起到的效果和一个5x5卷积核起到的效果是一样的,同时在同等参数的情况下,3x3的卷积核所用的参数更少;更优秀的是两个3x3卷积核的非线性能力要比5x5卷积核更强,因为其拥有的两个激活函数,可以大大提高卷积网络的学习能力。

详细代码:

 from torch import nn
 class VGG(nn.Module):
     def __init__(self, num_classes=1000):
         super(VGG, self).__init__()
         layers = []
         in_dim = 3
         out_dim = 64
         ##构造13个卷积层
         for i in range(13):
             layers += [nn.Conv2d(in_dim, out_dim, 3, 1, 1), nn.ReLU(inplace=True)]  ##输入通道为3,输出通道为64
         ##卷积核大小为3x3,步长为1,pading为1,此处如果想要输入与输出是一致的H和W,padding=(kernel_size-1)/2
             in_dim = out_dim
         ###在2,4,7,10,13个卷积层后增加池化层
             if i==1 or i==3 or i==6 or i==9 or i==12:
                 layers += [nn.MaxPool2d(2, 2)]
         ###第10层卷积后保持和前面的通道数一致,都为512,其余则加倍
                 if i!=9:
                     out_dim*=2
         self.features = nn.Sequential(*layers)
         ###定义的3个全连接层,中间有ReLU激活函数和Dropout
         self.classifier = nn.Sequential(
             nn.Linear(512 * 7 * 7, 4096),
             nn.ReLU(True),
             nn.Dropout(),
             nn.Linear(4096, 4096),
             nn.ReLU(True),
             nn.Dropout(),
             nn.Linear(4096, num_classes),
         )
         ###定义前向传播
     def forward(self, x):
         x = self.features(x)
         ###
         ##这一步作用:将特征图的维度从[1,512,7,7]变为[1,512*7*7],以便于后面的全连接分类
         ###
         x = x.view(x.size(0), -1)
         x = self.classifier(x)
         return x
 ​

\