机器学习——使用块的网络VGG
VGG块
虽然AlexNet证明深层神经网络卓有成效,但它没有提供一个通用的模板(例如VGG块)来指导后续的研究人员设计新的网络。 在下面的几个章节中,我们将介绍一些常用于设计深层神经网络的启发式概念。
经典卷积神经网络的基本组成部分是下面的这个序列:
-
带填充以保持分辨率的卷积层;
-
非线性激活函数,如ReLU;
-
汇聚层,如最大汇聚层。
而一个VGG块与之类似,由一系列卷积层组成,后面再加上用于空间下采样的最大汇聚层。
该函数有三个参数,分别对应于卷积层的数量num_convs
、输入通道的数量in_channels
和输出通道的数量out_channels
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import torch from torch import nn from d2l import torch as d2l def vgg_block(num_convs, in_channels, out_channels): layers = [] for _ in range (num_convs): layers.append(nn.Conv2d(in_channels, out_channels, kernel_size = 3 , padding = 1 )) layers.append(nn.ReLU()) in_channels = out_channels layers.append(nn.MaxPool2d(kernel_size = 2 ,stride = 2 )) return nn.Sequential( * layers) |
VGG网络
VGG神经网络连接 图7.2.1的几个VGG块(在vgg_block
函数中定义)。其中有超参数变量conv_arch
。该变量指定了每个VGG块里卷积层个数和输出通道数。全连接模块则与AlexNet中的相同。
原始VGG网络有5个卷积块,其中前两个块各有一个卷积层,后三个块各包含两个卷积层。 第一个模块有64个输出通道,每个后续模块将输出通道数量翻倍,直到该数字达到512。由于该网络使用8个卷积层和3个全连接层,因此它通常被称为VGG-11。
1 | conv_arch = (( 1 , 64 ), ( 1 , 128 ), ( 2 , 256 ), ( 2 , 512 ), ( 2 , 512 )) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def vgg(conv_arch): conv_blks = [] in_channels = 1 # 卷积层部分 for (num_convs, out_channels) in conv_arch: conv_blks.append(vgg_block(num_convs, in_channels, out_channels)) in_channels = out_channels return nn.Sequential( * conv_blks, nn.Flatten(), # 全连接层部分 nn.Linear(out_channels * 7 * 7 , 4096 ), nn.ReLU(), nn.Dropout( 0.5 ), nn.Linear( 4096 , 4096 ), nn.ReLU(), nn.Dropout( 0.5 ), nn.Linear( 4096 , 10 )) net = vgg(conv_arch) |
接下来,我们将构建一个高度和宽度为224的单通道数据样本,以观察每个层输出的形状。
1 2 3 4 | X = torch.randn(size = ( 1 , 1 , 224 , 224 )) for blk in net: X = blk(X) print (blk.__class__.__name__, 'output shape:\t' ,X.shape) |
Sequential output shape: torch.Size([1, 64, 112, 112]) Sequential output shape: torch.Size([1, 128, 56, 56]) Sequential output shape: torch.Size([1, 256, 28, 28]) Sequential output shape: torch.Size([1, 512, 14, 14]) Sequential output shape: torch.Size([1, 512, 7, 7]) Flatten output shape: torch.Size([1, 25088]) Linear output shape: torch.Size([1, 4096]) ReLU output shape: torch.Size([1, 4096]) Dropout output shape: torch.Size([1, 4096]) Linear output shape: torch.Size([1, 4096]) ReLU output shape: torch.Size([1, 4096]) Dropout output shape: torch.Size([1, 4096]) Linear output shape: torch.Size([1, 10])
正如从代码中所看到的,我们在每个块的高度和宽度减半,最终高度和宽度都为7。最后再展平表示,送入全连接层处理。
总结
-
VGG-11使用可复用的卷积块构造网络。不同的VGG模型可通过每个块中卷积层数量和输出通道数量的差异来定义。
-
块的使用导致网络定义的非常简洁。使用块可以有效地设计复杂的网络。
-
在VGG论文中,Simonyan和Ziserman尝试了各种架构。特别是他们发现深层且窄的卷积(即3*3)比较浅层且宽的卷积更有效。
- LeNet、AlexNet和VGG都有一个共同的设计模式:通过一系列的卷积层与汇聚层来提取空间结构特征;然后通过全连接层对特征的表征进行处理。 AlexNet和VGG对LeNet的改进主要在于如何扩大和加深这两个模块。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2022-11-08 题目目录