介绍
VGG-Network是K. Simonyan和A. Zisserman在论文“verydeepconvolutionalnetworksforlarge-scaleimagerecognition”[1]中提出的卷积菜单该架构在ImageNet上实现了92.7%的top-5测试精度,该网络拥有1400多万张属于1000个类别的图像。
它是深度学习领域的著名体系结构之一。 通过将第1层和第2层的较大内核大小的滤波器分别替换为11和5,显示出AlexNet架构的改善,多个33内核大小的滤波器层出不穷。 经过几周的培训,使用了NVIDIA Titan Black GPU。
VGG16架构卷积神经网络的输入是固定大小的224 224 RGB图像。 预处理只需从每个像素中减去训练数据集计算的平均RGB值。
由一捆卷积层执行的图像,其中滤波器的感觉范围非常小,3 3,是捕捉左/右、上/下概念的最小尺寸和中心部分。
在任一配置中,还使用1 1卷积滤波器,并且观测到在输入信道的线性变换之后它们为非线性的。 卷积步幅固定为1像素; 卷积层输入的空间填充使卷积后的空间分辨率保持恒定。 也就是说,3 3个卷积层的填充是1个像素。
然后,空间池化由五个最大池层执行,其中16个最大池层跟在几个Conv层之后,但不是所有Conv层。 此最大池化在2 2像素的窗口中执行,步长为2。
来源: neurohive.io
该体系结构包含许多在不同体系结构中具有不同深度的卷积层,其次是三个全连接(FC )层。 前两个FC分别有4096个通道,第三个FC执行1000通道分类,因此每类包含一个通道。
最后一层是soft-max层。 所有网络中的所有连接层的配置都很相似。
所有隐藏层都装备有整流(ReLU )非线性。 此外,此处的网络还包括局域网(lrn )。 此规范化不会提高培训数据集的性能,但这会增加内存消耗和计算时间。
体系结构总结:
模型的输入是固定大小的224224224224 RGB图像
预处理是每个像素减去训练集的RGB值后的平均值
折叠层17
步幅固定为1像素
3 x 33 x 3填充为1像素
空间池化层
此层通常不包括在网络深度中
空间池化使用最大池化层进行
窗口大小为2222
步幅固定为2
convnets最多使用5个池化层
全连接层:
第一个是4096(Relu )
第二,4096(Relu ) )。
第三,1000 (软件最大值)
体系结构配置下图显示了VGG网络的卷积神经网络配置
以下内容:
VGG-11
是vgg-11(lrn )
VGG-13
vgg-16(conV1 ) )。
VGG-16
VGG-19
来源:《大规模图像识别深度卷积网》
上述卷积神经网络每列配置一个。
以下,网络以其名称(A-E )表示。 所有配置都遵循传统设计,只有深度不同。 从网络a的11个权重层(8个变换和3个FC层)变为网络e的19个权重层(16个变换和3个FC层)。
每个卷积层的宽度较小,信道数从第一层64开始,在每个最大池化层达到512之前持续增加两倍。
各构成的参数如下。 虽然深度较大,但网络中权重的数量不大于浅网络中权重的数量,卷积层的宽度和感觉区较大
来源:“大规模图像识别的非常深的卷积网络”
训练损失函数是多个逻辑回归
学习算法是基于动量反向传播的小批量随机梯度下降(SGD )
批量是256
运动量是0.9
正则化
L2加权衰减(罚乘数为0.0005 ) ) ) )。
前两个全连接层的Dropout设置为0.5
学习率
初始: 0.01
如果停止提高验证集的精度,则下降到10。
与Alexnet相比,参数和深度多,但CNN的损耗函数收敛所需的时间少
小卷积核和大深度的更多正则化。
部分图层的预初始化。
训练图
像大小S 是同位素重缩放图像的最小边
设置S的两种方法
Fix S,称为单尺度训练
这里 S = 256 和 S = 384
Vary S,称为多尺度训练
S 来自 [Smin, Smax] 其中 Smin = 256, Smax = 512
– 然后 224×224224×224
图像是从每次 SGD 迭代重新缩放的图像中随机裁剪的。
主要特征VGG16 共有 16 层,具有一定的权重。
仅使用卷积和池化层。
始终使用 3 x 3 内核进行卷积。20
2×2 大小的最大池。
1.38 亿个参数。
在ImageNet 数据上训练。
它的准确率为 92.7%。
另一个版本是 VGG 19,共有 19 个带权重的层。
这是一个非常好的深度学习架构,用于对任何特定任务进行基准测试。
VGG 的预训练网络是开源的,因此它可以开箱即用地用于各种类型的应用程序。
让我们实现 VGG 网络首先让我们为 VGG 网络的每个版本创建过滤器映射。参考上面的配置图片了解过滤器的数量。即为键名为 VGG11、VGG13、VGG16、VGG19 的版本创建一个字典,并分别根据每个版本中的过滤器数量创建一个列表。这里列表中的“M”称为 Maxpool 操作。
import torchimport torch.nn as nn VGG_types = {"VGG11": [64, "M", 128, "M", 256, 256, "M", 512, 512, "M", 512, 512, "M"],"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",],}创建一个全局变量来说明架构的版本。然后创建一个名为 VGG_net 的类,输入为 in_channels 和 num_classes,它接受输入,如图像通道数和输出类数。
初始化 Sequential 层,即在序列中,Linear layer->ReLU->Dropout。
然后创建一个名为 create_conv_layers 的函数,它将 VGGnet 架构配置作为输入,即我们上面为不同版本创建的列表。当它遇到上面列表中的字母“M”时,它执行 MaxPool2d 操作。
VGGType = "VGG16" class VGGnet(nn.Module): def __init__(self, in_channels=3, num_classes=1000): super(VGGnet, self).__init__() self.in_channels = in_channels self.conv_layers = self.create_conv_layers(VGG_types[VGGType]) self.fcs = nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096, 4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096, num_classes),)def forward(self, x):x = self.conv_layers(x)x = x.reshape(x.shape[0], -1)x = self.fcs(x)return xdef create_conv_layers(self, architecture):layers = []in_channels = self.in_channelsfor x in architecture:if type(x) == int:out_channels = xlayers += [nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=(3, 3),stride=(1, 1),padding=(1, 1),),nn.BatchNorm2d(x),nn.ReLU(),]in_channels = xelif x == "M":layers += [nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2))]return nn.Sequential(*layers)完成后,编写一个小的测试代码来检查我们的实现是否运行良好。
在下面的测试代码中,给出的类数是 500。
if __name__ == "__main__": device = "cuda" if torch.cuda.is_available() else "cpu" model = VGGnet(in_channels=3, num_classes=500).to(device) # print(model) x = torch.randn(1, 3, 224, 224).to(device) print(model(x).shape)输出应该是这样的:
如果你想查看网络架构,你可以取消对上述代码中的*print(model)*语句的注释。也可以通过更改变量 VGGType 中的 VGG 版本来尝试使用不同的版本。
整个代码可以在这里访问:
https://github.com/BakingBrains/Deep_Learning_models_implementation_from-scratch_using_pytorch_/blob/main/VGG.py
[1]. K. Simonyan and A. Zisserman: Very Deep Convolutional Networks for Large-Scale Image Recognition, April 2015, DOI: https://arxiv.org/pdf/1409.1556.pdf
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓