VGG16网络详解并使用pytorch搭建模型

VGG网络结构

网络中的亮点:通过堆叠多个3x3的卷积核来代替大尺度卷积核(减少所需参数),可以拥有相同的感受野
在这里插入图片描述
1、一张原始图片被resize到(224,224,3)。
2、conv1两次[3,3]卷积网络,输出的特征层为64,输出为(224,224,64),再2X2最大池化,输出net为(112,112,64)。
3、conv2两次[3,3]卷积网络,输出的特征层为128,输出net为(112,112,128),再2X2最大池化,输出net为(56,56,128)。
4、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(56,56,256),再2X2最大池化,输出net为(28,28,256)。
5、conv4三次[3,3]卷积网络,输出的特征层为512,输出net为(28,28,512),再2X2最大池化,输出net为(14,14,512)。
6、conv5三次[3,3]卷积网络,输出的特征层为512,输出net为(14,14,512),再2X2最大池化,输出net为(7,7,512)。
7、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)。共进行两次。
8、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,1000)。
最后输出的就是每个类的预测。

在卷积神经网络中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野。通俗的解释是,输出feature map上的一个单元对应输入层上的区域大小。
在这里插入图片描述
在VGG中,使用三个3x3的卷积核可以替代一个7x7的卷积核(步长默认为1):
在这里插入图片描述
论文中提到通过这种方法能够减少所需参数:
假设输入输出channel为C,那么使用7x7卷积核所需参数为7x7xCxC=49C3;堆叠三个3x3卷积核所需参数为3x3xCxC+3x3xCxC+3x3xCxC=27C3

VGG网络搭建

VGG网络可以分为两个部分:提取特征网络结构和分类网络结构

不同网络结构配置

#cfgs字典文件,字典的每个key代表每个模型的配置文件
cfgs = {
    'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],    #列表中的数字代表卷积层卷积核的个数,M代表池化层的结构(maxpool)
    'vgg13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
    'vgg19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
}

特征提取网络

def make_features(cfg: list):          #生成提取特征网络(list类型)
    layers = []                        #定义一个空列表用来盛放定义的每一层结构
    in_channels = 3                    #输入的图片是RGB图像
    for v in cfg:                      #for循环来遍历配置列表
        if v == "M":                   #如果配置元素是M,那么说明该层为最大池化层,那么就创建一个最大池化下采样层
            layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
        else:                          #否则该层为卷积层,则创建卷积操作
            conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
            layers += [conv2d, nn.ReLU(True)]   #将定义的卷积层和ReLU激活函数拼接并添加到layers列表中
            in_channels = v                     #当特征矩阵通过该层卷积后其输出变成v
    return nn.Sequential(*layers)               #将列表通过非关键字参数的形式传入(*代表通过非关键字形式,sequential要求)

分类网络

        self.classifier = nn.Sequential(            #生成分类网络结构
            nn.Linear(512*7*7, 4096),               #展平处理
            nn.ReLU(True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, num_classes)
        )

训练和预测相关代码和AlexNet网络差不多

导师博客:https://blog.csdn.net/qq_37541097/article/details/103482003
导师github:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing
代码用的导师的,自己又加了些备注,就放在自己的github里了:
https://github.com/Petrichor223/Deep_Learning/tree/master

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值