参考原文:https://blog.csdn.net/sinat_33487968/article/details/83582299
附github中pytorch有的源码VGG网络结构
如图所示,VGG有多个版本,从A-E,D阶段为VGG-16,E阶段是VGG-19,VGG-16指的是conv+fc层,不包括max pooling层,VGG卷积都是same卷积,即卷积后输出图像的尺寸与输入一致。VGG 网络的贡献即使用小尺寸的卷积核(3×3),以及有规则的卷积-池化操作。
下面看VGG (pytorch提供的)源码:
第一部分首先是关于模型预训练的部分每一个模型都大同小异,因为VGG有多个版本所以不同的版本有不同的预训练模型下载地址。可以看看https://blog.csdn.net/sinat_33487968/article/details/83582299里的解释。
重点关注模型部分。VGG这个类里面的self.features就代表了卷积的部分,而self.classifer就是后面的全连接部分。因为每一个VGG的版本前面的卷积层数不同(其实卷积核的大小论文里面也是有不同,只是这里的torchvision为了简便将所有的卷积核大小都定义为3。)foward函数就是网络前向传播的过程,而_initialize_weights函数是对网络的一些权重进行初始化,初始化的方式有很多种,可以参考pytorch官网上面torch.nn.init部分https://pytorch.org/docs/stable/nn.html#torch-nn-init。
看到有一个方法是kaiming大神在Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification中提出的。有兴趣的可以去看。
VGG 类这么多重复的卷积不可能一个一个写。所以使用了一个make layers的函数for循环产生卷积层。
VGG版本
这里的cfg就是我们对于每个版本的VGG卷积层的定义,其中'M'代表了maxpooling,数字代表了卷积核的数量。前面的字母可以和上图的论文上面截取的图片相匹配
VGG16其中有一句:model = VGG(make_layers(cfg['D']), **kwargs)
VGG是定义的类,make_layers是在类中定义的函数,即类可以调用类之外调用的函数,这个函数也就是类传入的参数。make_layers(cfg['D'])即为features。
VGG全部源码见 /home/wangqi/PycharmProjects/pytorch_learning/自定义模型/VGG_yuanma.py
关于参数的初始化,没有也不会影响训练。而VGG网络中的参数初始化函数,只要是CNN 都可以用这种方法进行初始化。在__init__里面调用即可。
附上一张VGG16每一层的输出情况:
VGG网络输出
网友评论