VGG16是一种深度卷积神经网络,由牛津大学的研究团队于2014年开发。
VGG16在2014年的ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 竞赛中取得了显著的成绩。它在图像分类任务中获得了当年的第二名,其准确率超过了之前的深度神经网络模型,并为后来的研究提供了重要的启示。
这张图来源于论文《VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION》,其中的D、E就表示的是VGG16和VGG19。
parameters:
VGG网络的卷积层全部采用的是3x3卷积核,这个设计是VGG16网络的一个显著特点。一个3x3卷积核包含了一个像素的上下左右的最小单元。连续多层的3x3卷积核可以拟合更复杂的特征,同时增加网络深度。
两个3x3卷积可以替代一个5x5卷积,三个3x3卷积可以替代一个7x7卷积。这样多个小卷积核的卷积层替代一个卷积核较大的卷积层,一方面参数数量减少了,另一方面非线性次数也变多了,学习能力变得更好,网络的表达能力也提升了。
图片来源于同济子豪兄的视频。
import torch
import torchvision
import torch.nn as nn
import torchsummary
# pytorch内置的VGG16的模型
model = torchvision.models.vgg16()
print(model)
控制台部分内容:
import torch
import torchvision
import torch.nn as nn
import torchsummary
model = torchvision.models.vgg16()
torchsummary.summary(model,input_size=(3,244,244),batch_size=2,device='cpu')
控制台部分内容:
部分参数量
Total params: 138,357,544
总的参数量达到了1.38亿。VGG16具有如此之大的参数数目,可以预期它具有很高的拟合能力,但同时缺点也很明显,即训练时间过长,调参难度大。需要的存储容量大,不利于部署。
class VGG16(nn.Module):
"""
每个卷积核大小都是3x3,后面步长为1,padding=1
每个卷积后面都用了ReLU
"""
def __init__(self,in_channel=3,out_channel=1000,num_hidden=512*7*7):
super(VGG16,self).__init__()
self.features=nn.Sequential(
# block1
nn.Conv2d(in_channel,64,(3,3),(1,1),1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
# block2
nn.Conv2d(64, 128, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.Conv2d(128, 128, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
# block3
nn.Conv2d(128, 256, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
# block4
nn.Conv2d(256, 512, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
# block5
nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, (3, 3), (1, 1), 1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
)
self.avgpool = nn.AdaptiveAvgPool2d(output_size=(7,7))
self.classifier = nn.Sequential(
nn.Linear(num_hidden, 4096),
nn.ReLU(),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(),
nn.Dropout(),
nn.Linear(4096, out_channel),
)
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
上面均为仿照Pytorch内置的VGG16模型的参数编写的。
VGG16作为深度学习发展历程中的重要里程碑,强调了通过增加网络深度和一致性设计来提取图像特征。它的成功启发了后续更复杂的网络架构和方法,并在图像分类等任务中取得了重要成就。通过研究和实践,我们可以更好地理解VGG16的原理,并将其应用于实际问题中。