VGG
四 问题思索
一 论文导读
《Very Deep Convolutional Networks For Large-scale Image Recongnition》
作者:Karen Simonyan & Andrew Zisserman
单位:牛津大学
发表会议与时间:arxiv 2015
arxiv是一个网站,发布在其上,可以防止自己的idea被抢用
1.论文的研究背景和成果
2.论文的研究方法
3.论文结论
4.感受野
1.论文的研究背景和成果
自2012年的AlexNet异军突起,在其基础上,
(1)小卷积核
在第一个卷积层用了更小的卷积核和卷积stride
(2)多尺度
训练和测试使用整张图不同的尺度
vgg作者在将上两种方法应用到自己的网络设计和训练测试阶段,同时还考虑了网络深度对结果的影响。
2.论文的研究方法
14年在ILSVRC比赛上获得了分类项目的第二名,第一是googlLeNet,和定位项目的第一名。
同时模型对其他数据集也有很好的泛化能力。
VGG由于结构简单、特征提取能力强,所以应用场景广泛。
例如:
风格迁移
目标检测的backbone,提取特征(faster rcnn ,ssd等)
gan网络内容特征提取,进行内容计算
下图展示了作者的研究思路与方法,通过六组不同卷积核大小和层数的比对,得出了相关的结论
实验结果如下图:
从而得出三个主要结论:
- LRN对网路性能没有帮助(从A与A-LRN的对比得出)
- 对于同一个网络结构多尺度训练可以提高网络精度(从C、D、E分别都可以看出多尺度训练的好处,[256,512]意思是随机从其中抽取224*224的训练图片)
- VGG19模型的效果最后,从而得出一定程度的加深网络可以提高网络精度
通过Table3和Table4的对比可以得到: - 对比单尺度预测,多尺度综合预测,能够提升预测的精度,证明了scale jittering(尺度抖动)的作用
- vgg16综合上是最好的模型
得出结论: - dense evluation & multi-crop 两种测试方法联合使用效果最好
得出结论: - 融合模型D、E之后的模型错误率进一步下降
结论: - vgg很好
3.论文结论
1.在一定范围内,通过增加深度能有效的提升网络性能
2.最佳模型:vgg16,只用33卷积和22池化,简洁实用
3.多个卷积核比单个大卷积核性能好
4.LRN并不能带来性能上的提升
5.尺度抖动(多尺度训练、多尺度测试)有利于网络性能的提升
4.感受野
感受野的定义:卷积神经网络每一层输出的特征图上的像素点在输入图片上映射的区域大小。(特征图上的一个点和原图上多少点有关系)
感受野十分重要,目标检测中的流行算法,如SSD,Faster Rcnn等中的prior box 和Anchor box的设计都以感受野为依据做的设计
二 论文精读
1.论文整体框架
2.网络结构及权重参数设计
3.网络超参数及训练数据处理
4.网络特点
1.论文整体框架
(0)Abstract
论文的创新点和论文成果
(1)Introduction
论文研究背景
(2)Convnet Configuration
2.1 Architecture 介绍网络构成
2.2 Configurations A-E网络结构通道设置
2.3 Disscusion 使用小卷积、可以使用参数减少
(3)Classification Framework
3.1 Training 网络超参数 训练数据处理
3.2 Testing fc变成conv
3.3 Implementtation detailis 实验环境、训练时长
(4)Classification Experiments
4.1 Single Scale Evaluation
4.2 Multi-scale Evaluation
4.3 Multi-crop Evaluation
4.4 ConNet Fusion
4.5 Comparison with the State of the art
(5)Conclusions
增强网络深度可以提高分类精确度
2.网络结构及权重参数设计
VGG16:12层3*3 的卷积层、5层池化层、3层全连接层和一个softmax输出层
第一个全连接层参数量为102760448,有大约1亿参数,全连接层的参数量很大
1.为什么使用3*3的卷积核?
(1)深度更深并增加了非线性
3个33的卷积核感受野与一个77卷积核感受野等效,但是三个33卷积之间加入了激活函数,与仅使用一个77卷积核相比,深度更深且增加了非线性。
(2)参数量减少
假设输入数据通道大小为C
3个C通道的3*3的卷积核参数量为
3*(C*3*3*C)=27C*C
1个C通道的7*7卷积核参数量为
C*7*7*C=49C*C
2.1*1的卷积核的作用
(1)为决策增加非线性因素
(2)调整网络维度扩维或者缩小维度
3.网络超参数及训练数据处理
4.网络特点
三 代码实现
import torch
import torch.nn as nn
import torchvision
def Conv3x3BNReLU(in_channels,out_channels):
return nn.Sequential(
nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=3,stride=1,padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU6(inplace=True)
)
class VGGNet(nn.Module):
def __init__(self, block_nums,num_classes=5):
super(VGGNet, self).__init__()
self.stage1 = self._make_layers(in_channels=3, out_channels=64, block_num=block_nums[0])
self.stage2 = self._make_layers(in_channels=64, out_channels=128, block_num=block_nums[1])
self.stage3 = self._make_layers(in_channels=128, out_channels=256, block_num=block_nums[2])
self.stage4 = self._make_layers(in_channels=256, out_channels=512, block_num=block_nums[3])
self.stage5 = self._make_layers(in_channels=512, out_channels=512, block_num=block_nums[4])
self.classifier = nn.Sequential(
nn.Linear(in_features=512*7*7,out_features=4096),
nn.ReLU6(inplace=True),
nn.Dropout(p=0.2),
nn.Linear(in_features=4096, out_features=4096),
nn.ReLU6(inplace=True),
nn.Dropout(p=0.2),
nn.Linear(in_features=4096, out_features=num_classes)
)
def _make_layers(self, in_channels, out_channels, block_num):
layers = []
layers.append(Conv3x3BNReLU(in_channels,out_channels))
for i in range(1,block_num):
layers.append(Conv3x3BNReLU(out_channels,out_channels))
layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
return nn.Sequential(*layers)
def forward(self, x):
x = self.stage1(x)
x = self.stage2(x)
x = self.stage3(x)
x = self.stage4(x)
x = self.stage5(x)
x = x.view(x.size(0),-1)
out = self.classifier(x)
return out
def VGG16():
block_nums = [2, 2, 3, 3, 3]
model = VGGNet(block_nums)
return model
def VGG19():
block_nums = [2, 2, 4, 4, 4]
model = VGGNet(block_nums)
return model
if __name__ == '__main__':
model = VGG19()
print(model)
input = torch.randn(1,3,224,224)
out = model(input)
print(out.shape)