当前位置: 首页 > news >正文

VGG模型结构体及代码

VGG模型

2. 用2次3*3卷积代替5*5卷积,3次3*3卷积代替7*7卷积。

(1)卷积结果对应原图的感受野计算:

  (F(i)表示第i层的感受野,如果是最上层的就是1,如果多次卷积就多次迭代计算。)

       例如:三次3*3卷积代替7*7卷积

       F=1, F3=(1-1)*1+3=3, F2=(3-1)*1+3=5, F1=(5-1)*1+3=7

(2) 参数量对比

        ① 7*7:        7*7*channels*channels=49*C*C

        ② 3个3*3     3*3*channels*channels*3=27*C*C

3. 模型代码

import torch.nn as nn
import torchclass VGG(nn.Module):def __init__(self, features, num_classes=1000, init_weights=False):   # features: 由make_features生成的提取特征网络结构super(VGG, self).__init__()self.features = featuresself.classifier = nn.Sequential(                    # 最后的三层全连接层 (分类网络结构)nn.Dropout(p=0.5),                              # 与全连接层连接之前,先展平为1维,为了减少过拟合进行dropout再与全连接层进行连接(以0.5的比例随机失活神经元)nn.Linear(512*7*7, 2048),                       # 原论文中的节点个数是4096,这里简化为2048nn.ReLU(True),nn.Dropout(p=0.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_dim=1)    # 展平(第0个维度是batch,所以从第一个维度展平)# 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, mode='fan_out', nonlinearity='relu')nn.init.xavier_uniform_(m.weight)   # 初始化卷积核的权重if m.bias is not None:              # 如果采用了bias,则将bias初始化为0nn.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)# 生成提取特征网络结构
def make_features(cfg: list):  # 传入含有网络信息的列表layers = []in_channels = 3   # R G Bfor v in cfg:if v == "M":layers += [nn.MaxPool2d(kernel_size=2, stride=2)]else:conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)layers += [conv2d, nn.ReLU(True)]in_channels = vreturn nn.Sequential(*layers)   # 将列表通过非关键字参数的形式传入cfgs = {# 卷积核大小3*3# 数字表示卷积核个数,‘M’表示maxpooling'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网络
def vgg(model_name="vgg16", **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

4. VGG实验源码

注意:使用VGG时,如果使用迁移学习的方法对VGG进行预训练时需要在RGB三个通道减去[123.68,116.78,103.94],如果从头训练则可以忽略。

http://www.dtcms.com/a/458437.html

相关文章:

  • 绵阳企业网站建设公司广州建网站的公司有哪些
  • wordpress 多站点 合集赣州快云科技有限公司
  • 网站资讯如何做wordpress推特登陆
  • wordpress企业网站h5页面如何制作
  • 免费代理ip的网站wordpress主题 彩票
  • 网站建设简单点的网站专题页面用什么做
  • AI智能体赋能社会学分析之仿真:“数字广场”的社会回响
  • 网站运营内容包含哪些怎样进行网络推广效果更好
  • C++“语法糖”-引用 VS C语言指针 到底谁更胜一筹???
  • 济南公司做网站的价格seo相关ppt
  • Leetcode刷题记录-Boyer-Moore 投票算法
  • 千图素材网站wordpress 侧边栏代码
  • 建设网站询价对比表模板什么网站时候做伪静态
  • 一个开源免费的TTS工具2.0
  • 引流网站建设教程做网站设计的长宽一般是多少
  • 网站 解析iis怎么搭建设计网站
  • 网站建设公司招聘校园微网站建设方案ppt模板
  • 徐州营销型网站制使开发一个网站成本
  • 【framebuffer】
  • 【PAG】一个PAGView和多个PAGImageView分别渲染多个pag文件
  • 专门做婚庆的网站有哪些广州市品牌网站建设企业
  • 上海市网站seo公司网站活动怎么做
  • 昆山网站制作公司网站建设征求意见通知
  • 网站备案 如何填网站开发三层
  • 西樵网站设计网页设计与制作 pdf
  • 海淀教育互动平台网站建设本溪市城乡住房建设厅网站
  • xxx网站建设策划书范文精通网站建设电子档
  • v-if和v-for在同一个元素上的使用
  • 电商平台介绍网站模板济南 网站推广
  • 百度网站两两学一做心得体会郑州 网站建设公司