参考

5.7 使用重复元素的网络(VGG)

AlexNet在LeNet的基础上增加了3个卷积层。但AlexNet作者对它们的卷积窗口、输出通道数和构造顺序均做了大量的调整。虽然AlexNet指明了深度卷积神经网络可以取得出色的结果,但并没有提供简单的规则以指导后来的研究者如何设计新的网络。我们将在本章的后续几节里介绍几种不同的深度网络设计思路。

下面介绍VGG

5.7.1 VGG块

VGG块的组成规律是:连续使用数个相同的填充为1、窗口形状为3×3的卷积层后接上一个步幅为2、窗口形状为2×2的最大池化层。卷积层保持输入的高和宽不变,而池化层则对其减半。我们使用vgg_block函数来实现这个基础的VGG块,它可以指定卷积层的数量和输入输出通道数。

import time
import torch
from torch import nn, optimimport sys
sys.path.append("..")
import d2lzh_pytorch as d2l
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')def vgg_block(num_convs, in_channels, out_channels):blk = []for i in range(num_convs):if i == 0:blk.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))else:blk.append(nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1))blk.append(nn.ReLU())blk.append(nn.MaxPool2d(kernel_size=2, stride=2)) # 这里会使宽高减半return nn.Sequential(*blk)

5.7.2 VGG网络

与AlexNet和LeNet一样,VGG网络由卷积层模块后接全连接层模块构成。卷积层模块串联数个vgg_block,其超参数由变量conv_arch定义。该变量指定了每个VGG块里卷积层个数和输入输出通道数。全连接模块则跟AlexNet中的一样。

现在我们构造一个VGG网络。它有5个卷积块,前2块使用单卷积层,而后3块使用双卷积层。第一块的输入输出通道分别是1和64,之后每次对输出通道数翻倍,直到变为512。因为这个网络使用了8个卷积层和3个全连接层,所以经常被称为VGG-11。

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
fc_hidden_units = 4096 # 任意

下面实现VGG-11

def vgg(conv_arch, fc_features, fc_hidden_units=4096):net = nn.Sequential()# 卷积层部分# conv_arch: ((1,1,64),(1,64,128),(2,128,256),(2,256,512),(2,512,512))for i, (num_convs, in_channels, out_channels) in enumerate(conv_arch):# 每经过一个vgg_block都会使宽高减半"""(1,1,64):- 0: nn.Conv2d(1, 64, kernel_size=3, padding=1)  # (1, 1, 224, 224) -> (1, 64, 224, 224)nn.MaxPool2d(kernel_size=2, stride=2)  # (1, 64, 224, 224) -> (1, 64, 112, 112)(1,64,128):- 0: nn.Conv2d(64, 128, kernel_size=3, padding=1)  # (1, 64, 112, 112) -> (1, 128, 112, 112)nn.MaxPool2d(kernel_size=2, stride=2)  #  (1, 128, 112, 112) -> (1, 128, 56, 56)(2,128,256):- 0: nn.Conv2d(128, 256, kernel_size=3, padding=1)  #  (1, 128, 56, 56) -> (1, 256, 56, 56)- 1: nn.Conv2d(256, 256, kernel_size=3, padding=1)nn.MaxPool2d(kernel_size=2, stride=2)  # (1, 256, 56, 56) -> (1, 256, 28, 28)(2,256,512):- 0: nn.Conv2d(256, 512, kernel_size=3, padding=1)  # (1, 256, 28, 28) -> (1, 512, 28, 28)- 1: nn.Conv2d(512, 512, kernel_size=3, padding=1)nn.MaxPool2d(kernel_size=2, stride=2)  # (1, 512, 28, 28) -> (1, 512, 14, 14)(2,512,512):- 0: nn.Conv2d(512, 512, kernel_size=3, padding=1)- 1: nn.Conv2d(512, 512, kernel_size=3, padding=1)nn.MaxPool2d(kernel_size=2, stride=2)  # (1, 512, 14, 14) -> (1, 512, 7, 7)"""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
net = vgg(conv_arch, fc_features, fc_hidden_units)
print(net)# X = torch.rand(1, 1, 224, 224)# for name, blk in net.named_children():
#     X = blk(X)
#     print(name, "output shape: ", X.shape)

5.7.3 获取数据和训练模型

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)print(net)

batch_size = 64
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)lr, num_epochs = 0.001, 5
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
d2l.train_ch5(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs)

[pytorch、学习] - 5.7 使用重复元素的网络(VGG)相关推荐

  1. 卷积神经网络之(使用重复元素的网络)VGG

    卷积神经网络之VGG VGG提出了可以通过重复使用简单的基础块来构建深度模型的思路. VGG模型 VGG块的组成规律是: 连续使用数个相同的填充为1,.窗口形状为3*3的卷积层 后接一个步幅为2.窗口 ...

  2. (pytorch-深度学习系列)使用重复元素的网络(VGG)

    使用重复元素的网络(VGG) VGG的名字来源于论文作者所在的实验室Visual Geometry Group,VGG提出了可以通过重复使用简单的基础块来构建深度模型的思路. VGG Block(VG ...

  3. VGG使用重复元素的网络

    使用重复元素的网络(VGG) 1.VGG组网原理 #使用重复元素的网络(VGG) #VGG块的组成规律:连续使用数个相同的填充为1.窗口形状为33的卷积层后接上一个步幅为2,窗口形状为22的最大池化层 ...

  4. 《动手学深度学习》第十九天---使用重复元素的网络(VGG)

    卷积神经网络由卷积核来提取特征,通过池化层对显著特征进行提取,经过多次的堆叠,得到比较高级的特征,最后可以用分类器来分类.这是CNN的一个大概流程,其具体实现的结构是丰富多样的,但总的思想是统一的. ...

  5. pytorch学习笔记(二十五):VGG

    1. VGG块 VGG块的组成规律是:连续使用数个相同的填充为1.窗口形状为3×33\times 33×3的卷积层后接上一个步幅为2.窗口形状为2×22\times 22×2的最大池化层.卷积层保持输 ...

  6. 算法学习——求有重复元素的全排列(递归)

    算法学习--求有重复元素的全排列(递归) 思路:看到这个题目首先能想到的一点就是:①我们要求元素的所有全排列②我们要对求出的全排列去重 第一步:求全排列,这里先讨论对不含重复元素的数组元素进行全排列, ...

  7. PyTorch学习笔记(五):模型定义、修改、保存

    往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...

  8. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  9. java删除有序数组中的重复元素_java去除已排序数组中的重复元素

    题目描述 给定一个已排序的数组,去除数组中的重复元素,只保留一个重复的元素,并且返回新的数组长度. 要求: 不要给数组分配额外的空间,你必须使用常量的内存大小进行原地操作. 例如: 给出数组A=[1, ...

最新文章

  1. 技巧:结合Zabbix与SNMP监控嵌入式设备
  2. 如何实现Conditional Include
  3. 5 判断数据是否存在_Trie树实现:100亿URL中判断某个URL是否存在
  4. mapinfo制作地图_用QGIS代替Mapinfo软件
  5. python 之 __new__ 方法理解
  6. 软件设计师习题笔记-重点习题二
  7. C++11 并发指南三(Lock 详解)
  8. 算法竞赛入门经典第六章(例题) B - Rails(涉及到栈的运用)
  9. 多功能照片图片处理器小程序源码/流量主系列小程序源码
  10. 在python中for a in a是什么意思_Python:A [1:]中x的含義是什么?
  11. java毕业设计选题基于JavaWeb实现疫情环境下校园宿舍|寝室管理系统
  12. Canvas-lms 开源在线学习管理系统源码部署(生产版)
  13. X86汇编常见的寄存器
  14. “分手后,别拉黑”:成年人的放下,不在朋友圈
  15. 六年级计算机应用计划,《小学信息技术》六年级下册教学计划
  16. Linux ubuntu修改软件源为国内源;解决apt install、PPA源太慢;
  17. 师徒制,多么好的工具
  18. 蓝牙开关android项目,Android平台手机蓝牙开关和触摸开关的制作方法
  19. WebKit ndash; WebKit For Android
  20. 分享:前端页面样式收集 电影购票选座

热门文章

  1. qt开发环境 - c++之输入,输出,名字空间定义,名字空间指令,名字空间声明
  2. vue 改变domclass_手机上的大片制作软件——如何使用VUE
  3. css before after用法_CSS 伪元素基础知识:content 与counter 实用技巧(二)
  4. java表达式1 2_Aviator 2.1.1 发布,Java表达式引擎
  5. goods.java_javaweb网上书城项目 1.用户管理:注册会员 - 下载 - 搜珍网
  6. 6.Half Lambert光照Diffuse Shader
  7. 前后端交互json字符串
  8. JsonBuilder初出茅庐
  9. 东南亚支付——柬埔寨行
  10. 【翻译】在Ext JS和Sencha Touch中创建自己定义布局