微信开发者文档小程序,互联网关键词优化,网站建设用自助建站系统好不好,html 做网站的模板参考自
up主的b站链接#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 VGG 在2014年由牛津大学著名研究组 VGG#xff08;Visual Geometry Group#xff09;提出#xff0c;斩获该年 Imag…参考自
up主的b站链接霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 VGG 在2014年由牛津大学著名研究组 VGGVisual Geometry Group提出斩获该年 ImageNet 竞赛中 Localization Task定位任务第一名和 Classification Task分类任务第二名。 VGG 的创新点
通过堆叠多个小卷积核来替代大尺度卷积核可以减少训练参数同时能保证相同的感受野。 论文中提到可以通过堆叠两个3×3的卷积核替代5x5的卷积核堆叠三个3×3的卷积核替代7x7的卷积核 1. CNN感受野 在卷积神经网络中决定某一层输出结果中一个元素所对应的输入层的区域大小被称作感受野receptive field。 通俗的解释是输出feature map上的一个单元 对应 输入层上的区域大小。
以下图为例输出层 layer3 中一个单元 对应 输入层 layer2 上区域大小为2×2池化操作对应输入层 layer1 上大小为5×5 可以这么理解layer2中 2×2区域中的每一块对应一个3×3的卷积核又因为 stride2所以layer1的感受野为5×5 现在我们来验证下VGG论文中的两点结 VGG网络有多个版本一般常用的是VGG-16模型其网络结构如下如所示 pytorch搭建VGG网络 import torch.nn as nn
import torchclass VGG(nn.Module):def __init__(self, features, num_classes1000, init_weightsFalse):super(VGG, self).__init__()self.features features # 卷积层提取特征self.classifier nn.Sequential( # 全连接层进行分类nn.Dropout(p0.5),nn.Linear(512*7*7, 2048),nn.ReLU(True),nn.Dropout(p0.5),nn.Linear(2048, 2048),nn.ReLU(True),nn.Linear(2048, num_classes))if init_weights:self._initialize_weights()def forward(self, x):# N x 3 x 224 x 224x self.features(x)# N x 512 x 7 x 7x torch.flatten(x, start_dim1)# N x 512*7*7x self.classifier(x)return xdef _initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):# nn.init.kaiming_normal_(m.weight, modefan_out, nonlinearityrelu)nn.init.xavier_uniform_(m.weight)if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):nn.init.xavier_uniform_(m.weight)# nn.init.normal_(m.weight, 0, 0.01)nn.init.constant_(m.bias, 0)这里有一点需要注意的是 VGG网络有 VGG-13、VGG-16等多种网络结构
# vgg网络模型配置列表数字表示卷积核个数M表示最大池化层
cfgs {vgg11: [64, M, 128, M, 256, 256, M, 512, 512, M, 512, 512, M], # 模型Avgg13: [64, 64, M, 128, 128, M, 256, 256, M, 512, 512, M, 512, 512, M], # 模型Bvgg16: [64, 64, M, 128, 128, M, 256, 256, 256, M, 512, 512, 512, M, 512, 512, 512, M], # 模型Dvgg19: [64, 64, M, 128, 128, M, 256, 256, 256, 256, M, 512, 512, 512, 512, M, 512, 512, 512, 512, M], # 模型E
}# 卷积层提取特征
def make_features(cfg: list): # 传入的是具体某个模型的参数列表layers []in_channels 3 # 输入的原始图像(rgb三通道)for v in cfg:# 最大池化层if v M:layers [nn.MaxPool2d(kernel_size2, stride2)]# 卷积层else:conv2d nn.Conv2d(in_channels, v, kernel_size3, padding1)layers [conv2d, nn.ReLU(True)]in_channels vreturn nn.Sequential(*layers) # 单星号(*)将参数以元组(tuple)的形式导入def vgg(model_namevgg16, **kwargs): # 双星号(**)将参数以字典的形式导入try:cfg cfgs[model_name]except:print(Warning: model number {} not in cfgs dict!.format(model_name))exit(-1)model VGG(make_features(cfg), **kwargs)return model train.py model_name vgg16
net vgg(model_namemodel_name, num_classes5, init_weightsTrue)