VGGNet模型

  • 1. VGGNet模型介绍
    • 1.1 VGGNet的结构
    • 1.2 VGGNet结构举例
  • 2. VGGNet的PyTorch实现
    • 2.1 导入相应的包
    • 2.2 基本网络单元block
    • 2.3 实现VGGNet
    • 2.4 训练网络

1. VGGNet模型介绍

VGG Net由牛津大学的视觉几何组(Visual Geometry Group)和 Google DeepMind公司的研究员一起研发的的深度卷积神经网络,在 ILSVRC 2014 上取得了第二名的成绩,将 Top-5错误率降到7.3%。它主要的贡献是展示出网络的深度(depth)是算法优良性能的关键部分。目前使用比较多的网络结构主要有ResNet(152-1000层), GooleNet(22层), VGGNet(19层),大多数模型都是基于这几个模型上改进,采用新的优化算法,多模型融合等。到目前为止,VGGNet 依然经常被用来提取图像特征

1.1 VGGNet的结构

VGGNet的网络结构如下图所示。VGGNet包含很多级别的网络,深度从11层到19层不等,比较常用的是VGGNet-16和VGGNet-19。VGGNet把网络分成了5段,每段都把多个3x3的卷积网络串联在一起,每段卷积后面接一个最大池化层,最后面是3个全连接层和一个softmax层。数个相同的填充为1、窗口形状为3×33\times 33×3的卷积层,接上一个步幅为2、窗口形状为2×22\times 22×2的最大池化层。 卷积层保持输入的高和宽不变,而池化层则对其减半

图1. VGGNet 各级别网络结构图与网络参数量

1.2 VGGNet结构举例

下图是VGG16结构图

图2. VGG16 结构图

  • 输入是大小为224x224x3的RGB图像,预处理(preprocession)时计算出三个通道的平均值,在每个像素上减去平均值(处理后迭代更少,更快收敛)。

  • 图像经过一系列卷积层处理,在卷积层中使用了非常小的3x3卷积核,在有些卷积层里则使用了1x1的卷积核。

  • 卷积层步长(stride)设置为1个,3x3卷积层的填充(padding)设置为1。池化层采用max pooling,共有5层,在一部分卷积层后,max-pooling的窗口是2*2,步长设置为2。

  • 卷积层之后是三个全连接层(fully-connected layers,FC)。前两个全连接层均有4096个通道,第三个全连接层有1000个通道,用来分类。所有网络的全连接层配置相同。

  • 全连接层后是Softmax,用来分类。

  • 所有隐藏层(每个conv层中间)都使用ReLU作为激活函数。VGGNet不使用局部响应标准化(LRN),这种标准化并不能在ILSVRC数据集上提升性能,却导致更多的内存消耗和计算时间(LRN:Local Response Normalization,局部响应归一化,用于增强网络的泛化能力)。

下图是VGGNet与AlexNet的结构对比图:

图3. VGGNet与AlexNet 结构对比图

2. VGGNet的PyTorch实现

2.1 导入相应的包
import time
import torch
from torch import nn, optim
import torchvision
import numpy as np
import sys
sys.path.append("/home/kesci/input/")
import d2lzh1981 as d2l
import os
import torch.nn.functional as F
2.2 基本网络单元block
def vgg_block(num_convs, in_channels, out_channels): #卷积层个数,输入通道数,输出通道数blk = []for i in range(num_convs):if i == 0:# 第一层卷积层的输入是in_channels,输出是out_channelsblk.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))else:# 之后的卷积层输入和输出都是out_channelsblk.append(nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1))# 激活函数是ReLUblk.append(nn.ReLU())# 最后加载最大池化层blk.append(nn.MaxPool2d(kernel_size=2, stride=2)) # 这里会使宽高减半# 返回组合的网络return nn.Sequential(*blk)
2.3 实现VGGNet
# 定义基本参数
conv_arch = ((1, 1, 64), (1, 64, 128), (2, 128, 256), (2, 256, 512), (2, 512, 512))
# 经过5个vgg_block, 宽高会减半5次, 变成 224/32 = 7
fc_features = 512 * 7 * 7 # c * w * h
fc_hidden_units = 4096 # 任意
# VGGNet
def vgg(conv_arch, fc_features, fc_hidden_units=4096):net = nn.Sequential()# 卷积层部分for i, (num_convs, in_channels, out_channels) in enumerate(conv_arch):# 每经过一个vgg_block都会使宽高减半net.add_module("vgg_block_" + str(i+1), vgg_block(num_convs, in_channels, out_channels))# 全连接层部分net.add_module("fc", nn.Sequential(d2l.FlattenLayer(),nn.Linear(fc_features, fc_hidden_units),nn.ReLU(),nn.Dropout(0.5),nn.Linear(fc_hidden_units, fc_hidden_units),nn.ReLU(),nn.Dropout(0.5),nn.Linear(fc_hidden_units, 10)))return net
2.4 训练网络
# 缩放比例
ratio = 8
# 因为数据集比较少,所以一定程序的缩减参数能够防止过拟合现象
small_conv_arch = [(1, 1, 64//ratio), (1, 64//ratio, 128//ratio), (2, 128//ratio, 256//ratio), (2, 256//ratio, 512//ratio), (2, 512//ratio, 512//ratio)]
net = vgg(small_conv_arch, fc_features // ratio, fc_hidden_units // ratio)
# 小批量中的样本数
batchsize=16
#batch_size = 64
# 如出现“out of memory”的报错信息,可减小batch_size或resize
# train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
# 开始训练
lr, num_epochs = 0.001, 5
# 优化函数是Adam函数
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
d2l.train_ch5(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs)

动手学深度学习(PyTorch实现)(九)--VGGNet模型相关推荐

  1. 动手学深度学习(PyTorch实现)(八)--AlexNet模型

    AlexNet模型 1. AlexNet模型介绍 1.1 AlexNet的特点 1.2 AlexNet的结构 1.3 AlexNet参数数量 2. AlexNet的PyTorch实现 2.1 导入相应 ...

  2. 动手学深度学习(PyTorch实现)(七)--LeNet模型

    LeNet模型 1. LeNet模型 2. PyTorch实现 2.1 模型实现 2.2 获取数据与训练 1. LeNet模型 LeNet分为卷积层块和全连接层块两个部分.下面我们分别介绍这两个模块. ...

  3. 动手学深度学习(PyTorch实现)(十一)--GoogLeNet模型

    GoogLeNet模型 1. GoogLeNet介绍 1.1 背景 1.2 GoogLeNet网络结构 2. PyTorch实现 2.1 导入相应的包 2.2 定义Inception块结构 2.3 定 ...

  4. 动手学深度学习(PyTorch实现)(十三)--ResNet模型

    ResNet模型 1. ResNet介绍 2. ResNet结构 3. ResNet的PyTorch实现 3.1 导入所需要的包 3.2 构建ResNet网络 3.3 开始训练 注:本文部分内容参考博 ...

  5. 动手学深度学习(PyTorch实现)(十)--NiN模型

    NiN模型 1. NiN模型介绍 1.1 NiN模型结构 1.2 NiN结构与VGG结构的对比 2. PyTorch实现 2.1 导入相应的包 2.2 定义NiN block 2.3 全局最大池化层 ...

  6. 【动手学深度学习PyTorch版】6 权重衰退

    上一篇移步[动手学深度学习PyTorch版]5 模型选择 + 过拟合和欠拟合_水w的博客-CSDN博客 目录 一.权重衰退 1.1 权重衰退 weight decay:处理过拟合的最常见方法(L2_p ...

  7. 动手学深度学习Pytorch Task01

    深度学习目前以及未来都有良好的发展前景.正值疫情期间,报名参加了动手学深度学习pytorch版的公开课,希望在以后的学习生活中能够灵活运用学到的这些知识. 第一次课主要包含三个部分:线性回归.soft ...

  8. 伯禹公益AI《动手学深度学习PyTorch版》Task 07 学习笔记

    伯禹公益AI<动手学深度学习PyTorch版>Task 07 学习笔记 Task 07:优化算法进阶:word2vec:词嵌入进阶 微信昵称:WarmIce 优化算法进阶 emmmm,讲实 ...

  9. 伯禹公益AI《动手学深度学习PyTorch版》Task 03 学习笔记

    伯禹公益AI<动手学深度学习PyTorch版>Task 03 学习笔记 Task 03:过拟合.欠拟合及其解决方案:梯度消失.梯度爆炸:循环神经网络进阶 微信昵称:WarmIce 过拟合. ...

最新文章

  1. Python报错TypeError: 'str' object is not callable
  2. IDEA快速修改类名和文件名
  3. [html] 精确获取页面元素位置的方式有哪些?
  4. AJAX基础:JavaScript中类的实现
  5. 深度学习常用的数据集,包括各种数据跟图像数据
  6. matlab常用函数
  7. yum install gcc报错Error: Package: glibc-2.17-260.el7_6.6.i686 (updates) Requires: glibc-common = 2.17
  8. 简单差分运放公式推倒
  9. C语言实现高尔顿钉板实验(模拟正态分布)
  10. 数理统计与描述性分析
  11. 学习日志-《微习惯》心得
  12. PDF文件修改最常用的方式有哪些?
  13. Rust编译`Couldn‘t resolve host name (Could not resolve host: crates)` 错误的解决办法
  14. 轻松实现iMessage群发
  15. java里用idea是什么意思_idea什么意思?啥意思?idea简介
  16. 麻木的踏实,但丧失了真实
  17. 定制Github上的小图标/小徽章
  18. 读书笔记-《基于Oracle的SQL优化》-第二章-1
  19. nacosk8s部署_在K8S中部署Nacos配置中心
  20. 所有老板看完都会说一句“卧槽”!一套营销方案,彻底颠覆你思维!

热门文章

  1. Linux环境下为普通用户添加sudo权限
  2. Content-Type
  3. 大数据系列的默认端口(hbase,hadoop,hived等)
  4. VMware虚拟化云平台-最新版本vSphere 6.7
  5. mysql 的client_mysql(一)-客户端Client相关
  6. 无法发送具有此谓词类型的内容正文_采用多模态细化类型进行程序合成
  7. MySQL: 1006 - Can't create database '***' (errno: 13) 错误 解决方法
  8. 吴恩达机器学习3-无监督学习
  9. 软件体系架构课下作业07
  10. 关于Servlet中filter过滤器的小问题