[语义分割] 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的时候,具体执行方式如下:
- conv1:进行两次[3,3]的64通道的卷积,获得一个[512,512,64]的初步有效特征层,再进行2X2最大池化,获得一个[256,256,64]的特征层。
- conv2:进行两次[3,3]的128通道的卷积,获得一个[256,256,128]的初步有效特征层,再进行2X2最大池化,获得一个[128,128,128]的特征层。
- conv3:进行三次[3,3]的256通道的卷积,获得一个[128,128,256]的初步有效特征层,再进行2X2最大池化,获得一个[64,64,256]的特征层。
- conv4:进行三次[3,3]的512通道的卷积,获得一个[64,64,512]的初步有效特征层,再进行2X2最大池化,获得一个[32,32,512]的特征层。
- 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