Bachbone 之 VGGNet:走向深度 (Pytorch实现及代码解析)

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

Bachbone 之 VGGNet:走向深度 (Pytorch实现及代码解析)_第1张图片

        从图中可以看出来,网络大概有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
​

你可能感兴趣的:(深度学习算法,目标检测,经典网络骨架Backbone,python,机器学习,深度学习,神经网络,人工智能)