[语义分割] Pytorch-用for语句构成VGG模型

[语义分割] Pytorch-用for语句构成VGG模型



前言

VGG神经网络模型是一个通用性强,经典且实用的模型,一般情况下都是直接进行相应网络的连接,采用conv2d和MaxPool等的不断重复来进行,现在采用for语句来简单实现。


提示:以下是本篇文章正文内容,下面案例可供参考

一、VGG模型的背景

VGG是由Simonyan 和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。

结构如下图所示:

在这里插入图片描述
这个图形为VGG16的图形,反应了其相应的结构
当我们使用VGG16作为主干特征提取网络的时候,我们只会用到两种类型的层,
卷积层con2d和最大池化层maxpool

二、VGG相应不同结构

1.结构框图

对多种不同深度的网络进行了测试,分别称为为A-E网络,从11-19层,其中D和E被称为VGG16和VGG19。各网络结构如下
在这里插入图片描述

2.对样例VGG16做具体说明

当输入的图像大小为512x512x3的时候,具体执行方式如下:

  1. conv1:进行两次[3,3]的64通道的卷积,获得一个[512,512,64]的初步有效特征层,再进行2X2最大池化,获得一个[256,256,64]的特征层。
  2. conv2:进行两次[3,3]的128通道的卷积,获得一个[256,256,128]的初步有效特征层,再进行2X2最大池化,获得一个[128,128,128]的特征层。
  3. conv3:进行三次[3,3]的256通道的卷积,获得一个[128,128,256]的初步有效特征层,再进行2X2最大池化,获得一个[64,64,256]的特征层。
  4. conv4:进行三次[3,3]的512通道的卷积,获得一个[64,64,512]的初步有效特征层,再进行2X2最大池化,获得一个[32,32,512]的特征层。
  5. conv5:进行三次[3,3]的512通道的卷积,获得一个[32,32,512]的初步有效特征层

在这里插入图片描述

相应代码

# make layer是对每一层的层自定义,有点类似于nn.Sequential(),
# 但是layer是将每一层所要的网络或者激活函数归一化存在一个数组,
# 目前看来他的优点,可以用一个for循环去定义整个网络,不用对对每一层都写同样的函数。从而只改变他的参数就行了。
# 调用函数 make_layers(cfgs["D"], batch_norm=False, in_channels=in_channels)
# [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']
# 这一连串对列表的循环构成了VGG网络

def make_layers(cfg, batch_norm=False, in_channels=3):
    layers = []
    for v in cfg:  # 对列表进行循环
        if v == 'M':
            layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
        else:
            conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
            if batch_norm:
                layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)]
            else:
                layers += [conv2d, nn.ReLU(inplace=True)]
            in_channels = v
    return nn.Sequential(*layers)



# 当输入的图像大小为512x512x3的时候,具体执行方式如下:
# 1、conv1:64通道的卷积, [512,512,64]特征层,再进行2X2最大池化,得[256,256,64]的特征层。
# 2、conv2:128通道的卷积,[256,256,128]特征层,再进行2X2最大池化,得[128,128,128]的特征层。
# 3、conv3:256通道的卷积,[128,128,256]特征层,再进行2X2最大池化,得[64,64,256]的特征层。
# 4、conv4:512通道的卷积,[64,64,512]特征层,再进行2X2最大池化,得[32,32,512]的特征层。
# 5、conv5:512通道的卷积,[32,32,512]特征层。

cfgs = {
    'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']
}  # 判断输入的是数字还是M,如果是M则要进行最大池化;如果是数字的话,就代表通道数是多少




def VGG16(pretrained, in_channels, **kwargs):
    model = VGG(make_layers(cfgs["D"], batch_norm=False, in_channels=in_channels), **kwargs)
    if pretrained:
        state_dict = load_state_dict_from_url("https://download.pytorch.org/models/vgg16-397923af.pth",
                                              model_dir="./model_data")
        # url(string) -要下载的对象的 URL
        # model_dir(string,可选的) -保存对象的目录
        model.load_state_dict(state_dict)

    del model.avgpool
    del model.classifier
    return model

主体就是使用 make_layers来对[64, 64, ‘M’, 128, 128, ‘M’, 256, 256, 256, ‘M’, 512, 512, 512, ‘M’, 512, 512, 512, ‘M’]进行相应的遍历,不断补充layer使其符合VGG

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值