使用 VGG 块构建深层卷积网络:d2l-en 中 VGG 网络的原理、实现与训练指南

发布时间:2026/10/3 13:05:31

使用 VGG 块构建深层卷积网络:d2l-en 中 VGG 网络的原理、实现与训练指南 文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载VGG 是牛津大学视觉几何组Visual Geometry Group提出的深度卷积神经网络它首次将卷积层块 下采样的重复结构作为网络设计的基本单元开启了现代 CNN 模块化设计时代。本指南以《Dive into Deep Learning》d2l-en仓库中 chapter_convolutional-modern/vgg.md 为骨架完整讲解 VGG 块的设计动机、四框架MXNet/PyTorch/TensorFlow/JAX实现、VGG-11 网络组装与 Fashion-MNIST 实战训练并补充仓库 d2l 工具库中Classifier、layer_summary、Trainer等源码细节帮助你既会写 VGG 代码也能理解其背后的设计哲学。背景从逐层设计走向模块化架构AlexNet 用实证证明了深层 CNN 能取得好成绩但它并没有给出一个通用的设计模板来指导后续研究者搭建新网络。VGG 论文 :cite:Simonyan.Zisserman.2014的贡献恰恰在于提出了这样一个模板用重复的块block来组装网络。这一思路与芯片设计领域 VLSI超大规模集成的演进如出一辙——工程师们从放置晶体管发展到逻辑元件再到逻辑块 :cite:Mead.1980。神经网络架构设计也经历了同样的抽象化过程从单个神经元到整层layer再到由多层构成的块block。值得一提的是这一趋势延续至今研究者已经开始直接复用整个预训练模型来完成相关但不同的任务这类大型预训练模型通常被称为基础模型foundation models:cite:bommasani2021opportunities。使用现代深度学习框架我们很容易用循环和子程序在代码中实现这些重复结构这正是本仓库各章节代码的一贯风格。在原文档 vgg.md 中同一套逻辑分别以 MXNet、PyTorch、TensorFlow 和 JAX 四种后端给出。VGG 块的动机为什么多层卷积 一次池化传统 CNN 的基本构建单元是一次卷积 一次非线性 一次池化。这种做法的问题是空间分辨率下降太快每经过一个池化层分辨率就减半因此网络最多只能堆叠 $\log_2 d$ 层卷积$d$ 为输入维度否则特征图就耗尽。以 ImageNet 的 $224\times224$ 输入为例用这种方式无法构造超过 8 层的卷积网络。VGG 论文的核心思想是在两次 max-pooling 下采样之间堆叠多个卷积层组成一个块。作者当时关注的核心问题是深网络和宽网络哪个更好一个关键的观察是连续两个 $3\times3$ 卷积的感受野等价于一个 $5\times5$ 卷积但后者参数约为 $25 \cdot c^2$而前者仅需 $3 \cdot 9 \cdot c^2 27c^2$更省参数且引入了更多非线性。通过详细分析VGG 作者证明深而窄的网络显著优于浅而宽的网络。这开启了深度学习对更深网络的追求也使堆叠 $3\times3$ 卷积成为此后十年深度网络的黄金标准该设计决策直到近期才被 :cite:liu2022convnet重新审视。相应地GPU 上针对小卷积核的快速实现也成为了标配 :cite:lavin2016fast。VGG 块定义与四框架实现一个 VGG 块由两部分组成若干个卷积层$3\times3$ 卷积核、padding1保持高宽不变后接 ReLU 非线性一个max-pooling 层$2\times2$ 池化窗口、stride2将高宽减半。vgg_block函数接受两个参数num_convs块内卷积层数量和num_channels输出通道数。四种框架的完整实现如下MXNetGluondef vgg_block(num_convs, num_channels): blk nn.Sequential() for _ in range(num_convs): blk.add(nn.Conv2D(num_channels, kernel_size3, padding1, activationrelu)) blk.add(nn.MaxPool2D(pool_size2, strides2)) return blkPyTorchdef vgg_block(num_convs, out_channels): layers [] for _ in range(num_convs): layers.append(nn.LazyConv2d(out_channels, kernel_size3, padding1)) layers.append(nn.ReLU()) layers.append(nn.MaxPool2d(kernel_size2, stride2)) return nn.Sequential(*layers)PyTorch 版本使用nn.LazyConv2d延迟初始化通道数在首次前向时才确定这与仓库 d2l/torch.py 中init_cnn、apply_init的惰性初始化机制配合使用。TensorFlowKerasdef vgg_block(num_convs, num_channels): blk tf.keras.models.Sequential() for _ in range(num_convs): blk.add( tf.keras.layers.Conv2D(num_channels, kernel_size3, paddingsame, activationrelu)) blk.add(tf.keras.layers.MaxPool2D(pool_size2, strides2)) return blkJAXFlaxdef vgg_block(num_convs, out_channels): layers [] for _ in range(num_convs): layers.append(nn.Conv(out_channels, kernel_size(3, 3), padding(1, 1))) layers.append(nn.relu) layers.append(lambda x: nn.max_pool(x, window_shape(2, 2), strides(2, 2))) return nn.Sequential(layers)可以看到四个后端的逻辑完全一致循环添加 $3\times3$ 卷积 ReLU末尾追加 $2\times2$ stride2 的 max-pooling。VGG 网络用arch参数化组装网络族与 AlexNet 和 LeNet 类似VGG 网络可以分成两部分前半部分主要由卷积和池化层组成后半部分是与 AlexNet 完全相同的全连接层。关键区别在于卷积层被组织为保持维度不变的非线性变换组 分辨率缩减步骤的块结构。在 vgg.md 中网络通过一个名为arch的元组列表来定义每个元组对应一个块包含两个值卷积层数量与输出通道数——这正是调用vgg_block所需的两个参数。因此 VGG 定义的是一整个网络族而非单一网络只需遍历arch即可拼装出任意配置的 VGG。VGG-11 类定义PyTorch / MXNet / TensorFlowclass VGG(d2l.Classifier): def __init__(self, arch, lr0.1, num_classes10): super().__init__() self.save_hyperparameters() if tab.selected(mxnet): self.net nn.Sequential() for (num_convs, num_channels) in arch: self.net.add(vgg_block(num_convs, num_channels)) self.net.add(nn.Dense(4096, activationrelu), nn.Dropout(0.5), nn.Dense(4096, activationrelu), nn.Dropout(0.5), nn.Dense(num_classes)) self.net.initialize(init.Xavier()) if tab.selected(pytorch): conv_blks [] for (num_convs, out_channels) in arch: conv_blks.append(vgg_block(num_convs, out_channels)) self.net nn.Sequential( *conv_blks, nn.Flatten(), nn.LazyLinear(4096), nn.ReLU(), nn.Dropout(0.5), nn.LazyLinear(4096), nn.ReLU(), nn.Dropout(0.5), nn.LazyLinear(num_classes)) self.net.apply(d2l.init_cnn) if tab.selected(tensorflow): self.net tf.keras.models.Sequential() for (num_convs, num_channels) in arch: self.net.add(vgg_block(num_convs, num_channels)) self.net.add( tf.keras.models.Sequential([ tf.keras.layers.Flatten(), tf.keras.layers.Dense(4096, activationrelu), tf.keras.layers.Dropout(0.5), tf.keras.layers.Dense(4096, activationrelu), tf.keras.layers.Dropout(0.5), tf.keras.layers.Dense(num_classes)]))JAXFlax版本class VGG(d2l.Classifier): arch: list lr: float 0.1 num_classes: int 10 training: bool True def setup(self): conv_blks [] for (num_convs, out_channels) in self.arch: conv_blks.append(vgg_block(num_convs, out_channels)) self.net nn.Sequential([ *conv_blks, lambda x: x.reshape((x.shape[0], -1)), # flatten nn.Dense(4096), nn.relu, nn.Dropout(0.5, deterministicnot self.training), nn.Dense(4096), nn.relu, nn.Dropout(0.5, deterministicnot self.training), nn.Dense(self.num_classes)])为什么叫 VGG-11原始 VGG 网络包含五个卷积块前两个块各含 1 个卷积层后三个块各含 2 个卷积层。第一个块有 64 个输出通道之后每个块通道数翻倍直到 512。由于该网络共使用 8 个卷积层和 3 个全连接层因此常被称为VGG-11。标准 VGG-11 的arch配置为arch ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))用 layer_summary 查看逐层输出形状借助d2l.Classifier基类提供的layer_summary方法定义于 d2l/torch.py 的Classifier类中它用随机张量前向遍历self.net并打印每层输出形状可以直观确认每个块都会将高宽减半VGG(arch((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))).layer_summary( (1, 1, 224, 224))TensorFlow 与 JAX 后端因数据布局不同输入形状分别为(1, 224, 224, 1)TF与(1, 224, 224, 1)JAX 需传入trainingFalse。从输出可以看到每个块使高宽减半最终在展平flatten前高宽降为 7随后交由全连接部分处理。VGG 论文还描述了其他变体——事实上提出一族在速度与精度间权衡的网络已成为新架构发布的常态。训练 VGG-11 于 Fashion-MNISTVGG-11 比 AlexNet 计算量更大因此仓库中的训练示例使用通道数更小的变体这对 Fashion-MNIST 来说绰绰有余model VGG(arch((1, 16), (1, 32), (2, 64), (2, 128), (2, 128)), lr0.01) trainer d2l.Trainer(max_epochs10, num_gpus1) data d2l.FashionMNIST(batch_size128, resize(224, 224)) if tab.selected(pytorch): model.apply_init([next(iter(data.get_dataloader(True)))[0]], d2l.init_cnn) trainer.fit(model, data)TensorFlow 后端写法略有差异trainer d2l.Trainer(max_epochs10) data d2l.FashionMNIST(batch_size128, resize(224, 224)) with d2l.try_gpu(): model VGG(arch((1, 16), (1, 32), (2, 64), (2, 128), (2, 128)), lr0.01) trainer.fit(model, data)这里有几个值得注意的实战细节均有仓库源码可印证d2l.FashionMNIST(batch_size128, resize(224, 224))数据模块定义于 d2l/torch.py 的FashionMNIST类构造时通过transforms.Resize(resize)将原本 $28\times28$ 的图片放大到 $224\times224$get_dataloader返回带num_workers的 DataLoaderd2l.init_cnn定义于 d2l/torch.py对nn.Linear和nn.Conv2d施加xavier_uniform_初始化PyTorch 的惰性层LazyConv2d/LazyLinear需要先用真实数据触发一次前向model.apply_init才能完成参数创建并应用初始化这与 d2l/torch.py 中apply_init的实现一致d2l.Trainer(max_epochs10, num_gpus1)训练器定义于 d2l/torch.py其fit会依次执行数据准备、模型准备、优化器配置与多轮fit_epochnum_gpus在Trainer中控制设备搬运与model.to(gpu)训练过程与 AlexNet 类似见 chapter_convolutional-modern/alexnet.md验证损失与训练损失接近说明过拟合程度较小。对于 JAX 后端trainer.fit配合model.apply_init定义于 d2l/jax.py通过self.init(key, *dummy_input)初始化参数使用JAX 版本的Dropout需要deterministic标志区分训练/推理模式因此示例中传入trainingFalse以关闭随机性。总结VGG 为什么是第一个真正现代的 CNN可以说 VGG 是第一个真正意义上的现代卷积神经网络AlexNet 引入了许多让深度学习大规模生效的组件但VGG 引入了关键特性多卷积层组成的块结构以及深而窄优于浅而宽的偏好VGG 是第一个真正以参数化网络族形式存在的模型实践者可以在复杂度与速度之间自由权衡现代框架在这里大放异彩不再需要生成 XML 配置文件来指定网络而是通过简单的 Python 代码直接组装网络。近期的 ParNet :cite:Goyal.Bochkovskiy.Deng.ea.2021展示了通过大量并行计算用更浅的架构也能获得有竞争力的性能这一方向值得关注但本仓库后续章节仍沿着过去十年的主流路径更深、更模块化展开。延伸练习与 AlexNet 相比VGG 计算更慢且占用更多 GPU 内存比较 AlexNet 与 VGG 的参数数量比较卷积层与全连接层的浮点运算量思考如何降低全连接层带来的计算开销。打印网络各层维度时只能看到 8 个块加上若干辅助变换的信息尽管网络共有 11 层——剩下的 3 层去哪了提示逐层观察输出形状与layer_summary的实现。参考 VGG 论文 Table 1 :cite:Simonyan.Zisserman.2014构造 VGG-16 或 VGG-19 等其他常见变体。将 Fashion-MNIST 从 $28\times28$ 八倍上采样到 $224\times224$ 非常浪费。尝试修改网络架构与分辨率转换例如改用 56 或 84 的输入尺寸能否在精度不下降的前提下做到可参考 VGG 论文中关于下采样前增加更多非线性的思路。相关章节导航现代卷积神经网络章节索引了解 VGG 在 CNN 发展脉络中的位置AlexNet 章节VGG 训练流程的直接参照LeNet 章节VGG 块与经典 CNN 组件的衔接d2l 工具库Classifier、Trainer、FashionMNIST、init_cnn等基类与工具函数的完整源码。赞分享文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载相关推荐使用块的网络VGG从可复用卷积块到 VGG-11 的完整实现与训练使用块的网络VGG从可复用卷积块到 VGG 11 的完整实现与训练 本篇技术指南围绕《动手学深度学习》d2l zh chapter_convoluti人工智能深度学习机器学习教程使用块的网络VGG用可复用卷积块设计深层卷积神经网络的实战指南使用块的网络VGG用可复用卷积块设计深层卷积神经网络的实战指南 《动手学深度学习》中文仓库d2l zh的本章节聚焦于 VGGVisual Geome人工智能深度学习机器学习教程用 CNTK 训练 VGG 深度卷积网络ImageNet 图像分类的 Python 与 BrainScript 实战指南用 CNTK 训练 VGG 深度卷积网络ImageNet 图像分类的 Python 与 BrainScript 实战指南 导读 本文围绕 Microsoft深度学习机器学习人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/3 13:05:31

昆明理工大学817通信工程考研名额一年比一年少

817信号2027只招61人,五年最低,学硕专硕一起缩 昆工817信号与系统2027招生数据出来了,先看数字:三个专业合计61人,比去年少6个,是近五年最少的一年。 三个专业各招多少通信与信息系统(081001学硕…

2026/10/3 13:05:31

开发指南147-WebSocket-前端

监控大屏等应用,如果用定时刷新模式有很多缺点:1、有延迟。2、浪费带宽。所以,更好的模式是浏览器进入大屏页面时建立websocket,后台接收到信号时,主动推送数据到前端页面。前端应用主要封装在qlm_websocket.js中。使用…

2026/10/3 13:55:33

人机协同预训练:三条路线,一条拉开差距

【具身AGI导读】同一套数据、同一套训练与评测设置,三种把第一视角数据接进预训练的做法被放在一起比。结果里有一条并不好看:被寄予厚望的那条,反而低于它自己的机器人基线。近日,arXiv 上出现一篇题为 AtomEgo 的预印本&#xf…

2026/10/3 13:55:33

解密C语言:static静态与extern外部声明

一:extern外部声明 extern 是 C/C 语言中的存储类说明符(storage class specifier),用于声明一个变量或函数是在其他文件中定义,或者声明其具有外部链接性(external linkage)。简单来说&#xf…

2026/10/3 13:55:33

ARR还是交付量,物理AI 国产 的三种收入口径

【具身AGI导读】同一家公司,换一种口径,就能讲出三个完全不同的进度。行业第一次公开吵起来的,恰恰是「收入」这两个字本身。2026 年 9 月,具身智能行业内部围绕「收入怎么算」出现了一场公开争执。一方质疑同行的收入口径&#x…

2026/10/3 13:55:33

ABAP Cloud 中的 Reuse Services,如何把通用能力沉淀成可复用的企业级服务

在一个真正投入生产的 SAP 业务应用里,开发工作很少只是维护几张业务表、写几个 CDS View、实现一个 RAP Business Object,再通过 OData V4 暴露出去这么简单。销售订单修改以后要留下审计记录,后台批处理需要能够调度,业务异常需要写入统一日志,审批需要进入工作流,业务…

2026/10/3 13:55:33

JS/TS电子表格引擎:SheetJS、ExcelJS、Hucre

SheetJS 英文官网,中文官网,开源(GitHub,36.4K Star,7.9K Fork)。 GitHub已不再维护,查看源码新地址:https://git.sheetjs.com/SheetJS/sheetjs 中文文档。 ExcelJS 开源&#…

2026/10/3 13:50:33

算子是什么,以及 DeepSeek 在算子层面到底做了什么

先把"算子"这个词说清楚 很多人第一次听到"算子"是在学数学分析或者泛函的时候,那时候它指的是从一个函数空间到另一个函数空间的映射,比如微分算子、积分算子。但今天在 AI 圈子里说的"算子",含义要朴素得多&…

2026/10/2 8:16:46

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/2 18:20:53

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 0:04:31

国内大学生必备的AI写作辅助软件是哪款?

国内高校学生在论文写作过程中,越来越依赖AI辅助工具提升效率,主流方案以本土化全流程工具为核心,结合通用大模型与专业插件,覆盖选题构思、框架搭建、初稿撰写、查重降重、格式调整等关键环节,本文将深入解析当前主流…

2026/10/3 0:04:31

Codex接入Jev模型完整指南:配置方法、本地部署与踩坑排查

最近不少人在讨论 Codex 搭配 Jev 这套玩法,我一开始没太当回事,直到自己把 Jev 接进 Codex跑了几轮编码任务之后,才明白那些说“直接起飞”的人是怎么想的。Codex 作为工具本身已经够能打了,但模型固定、上下文策略固定&#xff…

2026/10/3 0:04:31

GitHub 热门: NVIDIA/Model-Optimizer

👋 Hi,我擅长 AI 大模型应用落地、意识解码与 AI 开发工具链 。 💡 创业路上,用技术换时间,一起把 AI 变成生产力 🚀 >GitHub 热门: NVIDIA/Model-Optimizer 凌晨两点,你刚把跑通了的 Qwen3.…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑