人工智能-python-深度学习-神经网络VGG(详解)

LeNet 系列之后 —— VGG(详解):从原理到 PyTorch 实现

文章目录

  • LeNet 系列之后 —— **VGG(详解)**:从原理到 PyTorch 实现
    • 1. VGG 的发展历史与意义(一句话+背景)
    • 2. VGG 的核心思想(要点)
    • 3. VGG 的主要版本(配置)
    • 4. **逐层结构详解 + 逐层计算举例(以 VGG-16 为例)**
      • 4.1 形状变化公式(卷积/池化常用公式)
      • 4.2 参数数量计算公式
      • 4.3 逐层数值举例(VGG-16,输入:`3 × 224 × 224`)
      • 4.4 感受野(receptive field)直观说明
    • 5. 关键设计点解析(深入)
    • 6. PyTorch 实现
      • A. 直接用 torchvision(推荐做迁移学习)
      • B. 自定义 VGG-16(配置 D)的实现
      • 训练/微调的示例骨架(CIFAR-10)
    • 7. 训练与评估(超参、训练曲线、结果呈现建议)
      • 建议超参数(可作为 baseline)
      • 训练曲线绘制(示例)
      • 示例结果(说明)
    • 8. 实验扩展(对比/消融实验建议)
    • 9. 总结与实践建议

标题:VGG 神经网络(详解)—— 原理、逐层计算、PyTorch 实现与实验指南
简介:VGG(Visual Geometry Group)由 Simonyan & Zisserman 在 2014 年提出,主张用统一的小卷积核(3×3)堆叠并加深网络,取得了 ImageNet 上的优秀效果。本文目标是把 VGG 的思想、结构、逐层维度/参数计算以及一个可跑通的 PyTorch 示例讲清楚



1. VGG 的发展历史与意义(一句话+背景)

  • 一句话:VGG 提出“把网络加深并统一用小卷积核(3×3)”的设计思想,证明了深度(depth)在卷积网络表征能力上的重要性。
  • 背景/成绩:VGG 的模型(其两个最优模型)在 ILSVRC2014 的分类/定位任务中取得了非常靠前的结果(classification 与 localization 分别取得优异名次)。在 ILSVRC2014 上,GoogLeNet 为第一名,VGG 的提交在分类赛道上名列前茅(ensemble/top5 ~7.3% 左右),在定位上也表现很好。([image-net.org][1])

2. VGG 的核心思想(要点)

  • 非常小的卷积核(3×3)并多层堆叠:用许多 3×3 卷积替代单个大核(例如 7×7),既能增加网络深度,也能用更少的参数获得更复杂的非线性。论文中阐明:两层 3×3 的堆叠拥有等效的 5×5 感受野,三层 3×3 等效 7×7。
  • 统一的设计范式:每个 block 中重复 “(conv3×3 → ReLU)” 若干次,再做 2×2 max-pool 下采样;每个 block 的通道数在下采样后翻倍(64→128→256→512)。
  • 深度优先:通过把“宽度”控制在中等,重点增加“深度”,提升表达能力。
  • 简单实用:统一且模块化,便于移植、迁移学习与微调。现成的预训练权重也广泛可得(PyTorch/torchvision 等)。([PyTorch Docs][2])

3. VGG 的主要版本(配置)

论文中给出几种配置(A–E);常见编号对应为:

  • VGG-11 (A)
  • VGG-13 (B)
  • VGG-16 (D,最常见,常说的 VGG16)
  • VGG-19 (E)

各配置差异主要在每个 block 内 conv 层的个数(例如 VGG16 每个 block 的 conv 层数为 2/2/3/3/3)。更多细节见论文配置表。


4. 逐层结构详解 + 逐层计算举例(以 VGG-16 为例)

4.1 形状变化公式(卷积/池化常用公式)

  • 卷积输出宽/高计算(单层):

    Hout=⌊Hin−K+2PS⌋+1H_{out} = \left\lfloor\frac{H_{in} - K + 2P}{S}\right\rfloor + 1 Hout=SHinK+2P+1

    其中 KKK 为核大小(例如 3),PPP 为 padding,SSS 为 stride。VGG 全部 conv 使用 K=3, P=1, S=1,因此空间尺度 保持不变

  • 池化(2×2, stride=2)会将宽高各除以 2:Hout=Hin/2H_{out} = H_{in}/2Hout=Hin/2

4.2 参数数量计算公式

  • 卷积层参数(含偏置):

    params=Cin×Cout×K×K(+Coutbiases)\text{params} = C_{in} \times C_{out} \times K \times K \; (+\; C_{out}\ \text{biases}) params=Cin×Cout×K×K(+Cout biases)

  • 全连接层参数(含偏置):

    params=Nin×Nout(+Noutbiases)\text{params} = N_{in} \times N_{out} \; (+\; N_{out}\ \text{biases}) params=Nin×Nout(+Nout biases)

4.3 逐层数值举例(VGG-16,输入:3 × 224 × 224

下面表格列出每层的输入/输出尺寸以及该层参数(含 bias)。(注:padding=1, stride=1 的 3×3 conv;池化 2×2 stride=2)

层名类型输入输出参数量(含 bias)
conv1_1conv 3→64 (3×3)3×224×22464×224×2241,792 (1728 + 64)
conv1_2conv 64→6464×224×22464×224×22436,928
pool1maxpool 2×264×224×22464×112×1120
conv2_1conv 64→12864×112×112128×112×11273,856
conv2_2conv 128→128128×112×112128×112×112147,584
pool2maxpool128×112×112128×56×560
conv3_1conv 128→256128×56×56256×56×56295,168
conv3_2conv 256→256256×56×56256×56×56590,080
conv3_3conv 256→256256×56×56256×56×56590,080
pool3maxpool256×56×56256×28×280
conv4_1conv 256→512256×28×28512×28×281,180,160
conv4_2conv 512→512512×28×28512×28×282,359,808
conv4_3conv 512→512512×28×28512×28×282,359,808
pool4maxpool512×28×28512×14×140
conv5_1conv 512→512512×14×14512×14×142,359,808
conv5_2conv 512→512512×14×14512×14×142,359,808
conv5_3conv 512→512512×14×14512×14×142,359,808
pool5maxpool512×14×14512×7×70
flatten512×7×7250880
fc1FC 25088→4096250884096102,764,544
fc2FC 4096→40964096409616,781,312
fc3FC 4096→1000409610004,097,000
  • 总参数量(VGG-16)138,357,544(约 138M)。可以看到 绝大部分参数来源于前两层 FC(尤其是第一个 FC)。这就是为什么全连接层往往是参数与存储瓶颈。数据来源与论文表格一致。

4.4 感受野(receptive field)直观说明

  • 单个 3×3 卷积的感受野是 3×3;两个 3×3 连着(无下采样)对原图的等效感受野是 5×5;三个 3×3 等效为 7×7。直观上,第二层卷积核“看”到的是前一层 3×3 的特征,而这些特征本身对应原始图像上的 3×3 区域,合并后等价于更大的窗口,但通过两次非线性(ReLU)增强了表达能力。

5. 关键设计点解析(深入)

  • 为什么用 3×3 而不是 7×7/11×11?

    • 参数效率:用三个 3×3 的层实现 7×7 的等效感受野,但参数更少;例如单个 7×7(输入 c, 输出 d)参数为 c×d×7×7c \times d \times 7 \times 7c×d×7×7,而三个 3×3 的组合参数为 c×m×3×3+m×n×3×3+n×d×3×3c\times m\times3\times3 + m\times n\times3\times3 + n\times d\times3\times3c×m×3×3+m×n×3×3+n×d×3×3(若中间通道数相同可更便宜),并且中间层带非线性,表达更丰富。论文对这一点做了论证。
  • ReLU:使用 ReLU 作为非线性,训练收敛快且减少了梯度消失问题(当时为常用选择)。

  • FC 层大且昂贵:VGG 的 FC 层占参数大头(约 90%+),是模型存储的瓶颈。后来很多工作(例如全局平均池化、去掉大 FC)用来做模型轻量化。

  • BN(批归一化):在后续实践中,VGG-BN(在 conv 后加 BN)能显著加速训练并提升稳定性;PyTorch/torchvision 提供 vgg16_bn。([PyTorch Docs][3])


6. PyTorch 实现

下面给出两个版本:(A)直接使用 torchvision 的预训练模型(最简单)(B)自定义实现 VGG-16 的代码(用于教学/修改)。二者都附训练/微调的骨架。

A. 直接用 torchvision(推荐做迁移学习)

# 直接加载 torchvision 预训练 VGG16,并替换最后的分类头(示例:用于 CIFAR-10)
import torch
import torch.nn as nn
from torchvision import modelsdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 加载预训练权重(PyTorch >= 0.13 的新 API 以 weights 参数为准)
vgg = models.vgg16(weights=models.VGG16_Weights.IMAGENET1K_V1)  # 或 weights='IMAGENET1K_V1'
# 替换 classifier 的最后一层为 10 类(CIFAR-10)
vgg.classifier[-1] = nn.Linear(in_features=4096, out_features=10)
vgg = vgg.to(device)

如果你的 PyTorch 版本没有 weights 参数,用 pretrained=True(老版本)。

B. 自定义 VGG-16(配置 D)的实现

# 教学用:手写 VGG-16 的构建函数(简化版,不含 BN)
import torch.nn.functional as F
import torchdef make_vgg_layers(cfg):layers = []in_channels = 3for v in cfg:if v == 'M':layers += [nn.MaxPool2d(kernel_size=2, stride=2)]else:layers += [nn.Conv2d(in_channels, v, kernel_size=3, padding=1),nn.ReLU(inplace=True)]in_channels = vreturn nn.Sequential(*layers)# cfg for VGG-16 (D)
cfg_D = [64, 64, 'M',128, 128, 'M',256, 256, 256, 'M',512, 512, 512, 'M',512, 512, 512, 'M']class VGG16Custom(nn.Module):def __init__(self, num_classes=1000, init_weights=True):super().__init__()self.features = make_vgg_layers(cfg_D)self.classifier = nn.Sequential(nn.Linear(512*7*7, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, num_classes))if init_weights:self._initialize_weights()def forward(self, x):x = self.features(x)x = torch.flatten(x, 1)x = 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')if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):nn.init.normal_(m.weight, 0, 0.01)nn.init.constant_(m.bias, 0)# 使用举例
model = VGG16Custom(num_classes=10).to(device)

训练/微调的示例骨架(CIFAR-10)

# 训练骨架(略去数据加载细节)
import torch.optim as optim
from torch.optim import lr_schedulercriterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)  # 每 30 epoch lr*0.1num_epochs = 50
for epoch in range(num_epochs):model.train()for imgs, labels in train_loader:imgs, labels = imgs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(imgs)loss = criterion(outputs, labels)loss.backward()optimizer.step()scheduler.step()# 验证部分省略:计算 val_loss / val_acc 并记录用于作图

数据增强(CIFAR-10 推荐):RandomCrop(32, padding=4), RandomHorizontalFlip(), Normalize(mean,std)
PyTorch 官方 vgg16 / vgg16_bn 的细节参见 torchvision 文档。([PyTorch Docs][2])


7. 训练与评估(超参、训练曲线、结果呈现建议)

建议超参数(可作为 baseline)

  • dataset:CIFAR-10(演示)或 ImageNet(实际训练需大量资源)
  • batch_size:128(显存允许越大越稳)
  • optimizer:SGD(momentum=0.9)或 Adam(调参)
  • lr:0.01(SGD)或 1e-3(Adam),配合 lr scheduler(StepLR / CosineAnnealing)
  • weight_decay:5e-4(控制过拟合)
  • epochs:50–200(视数据集大小而定)
  • 数据增强:随机裁剪、水平翻转、颜色抖动(视情况)

训练曲线绘制(示例)

  • 每 epoch 记录 train_loss, val_loss, train_acc, val_acc,使用 matplotlib 绘图:
import matplotlib.pyplot as plt
plt.figure()
plt.plot(epochs, train_losses, label='train_loss')
plt.plot(epochs, val_losses, label='val_loss')
plt.legend(); plt.xlabel('epoch'); plt.ylabel('loss')
  • 典型现象:train_loss 下降,val_loss 在开始下降后趋于平稳或上升(过拟合)→ 可加入更多增强/减小 FC/加 BN/用 dropout。

示例结果(说明)

  • 说明:我无法在这里替你训练模型拿到具体曲线,但用上面的超参和 CIFAR-10 数据增强,VGG-16(做迁移学习或从头训练)通常能达到 约 90%+ 的 top-1 准确率(取决于训练时长与增强策略)。如果需要,我可以给出一个更精确的训练脚本和绘图代码(但当前回答包含了足够骨架,让你直接运行)。(注:不同实现/数据预处理会影响最终数值)

8. 实验扩展(对比/消融实验建议)

若想在文章里做小实验来展示设计选择的影响,这里给出常见对比项与预期结论:

  1. 3×3 堆叠 vs 大核(5×5 / 7×7)

    • 实验:用 2×3×3 替代 1×5×5,或用单 7×7 替代三 3×3;比较参数、准确率与训练收敛速度。
    • 预期:堆叠小核在参数相近或更少的情况下表现更好(且非线性更多)。
  2. ReLU vs LeakyReLU / ELU

    • 实验:把所有 ReLU 替换为 LeakyReLU,比较收敛和最后精度。
    • 预期:对大多数任务 ReLU 是稳健选择,其他激活在特定任务上可能有微小提升。
  3. MaxPool vs AvgPool

    • 实验:把每个 max-pool 换成 avg-pool,或用 stride=2 卷积实现下采样。
    • 预期:max-pool 通常保留更锐利的特征(分类任务常更优);avg-pool 可以在某些特征统计任务上更稳定。
  4. BatchNorm(VGG_BN)

    • 实验:VGG-16 与 VGG-16-BN 对比(相同 lr/optimizer),观察收敛速度与最终精度。
    • 预期:BN 能显著加速训练并提高稳定性(更容易用较大学习率训练)。PyTorch 的 vgg16_bn 可直接使用。([PyTorch Docs][3])
  5. 数据增强(与否)

    • 实验:无增强 / 基础增强 / 强增强(Cutout, Mixup)对比。
    • 预期:合理增强能显著提高泛化与 val 精度,尤其在小数据集上效果明显。

9. 总结与实践建议

  • VGG 的价值不仅在于当时的比赛成绩,更在于它提出并验证了“深层 + 小卷积核”的设计范式(简单、统一、易迁移),对后续网络设计影响深远(ResNet/Inception 等都是在这类设计基础上进一步改进)。
  • 如果你资源有限:优先使用预训练的 VGG 并做微调(替换最后一层 / 冻结前几层),而不是从头训练 ImageNet。PyTorch torchvision 提供了便捷的接口与权重。([PyTorch Docs][2])
  • 若关注模型轻量化或部署效率:考虑移除大 FC 层(换成 GAP)或改用更现代且轻量的 backbone(ResNet / MobileNet / EfficientNet 等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98420.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光伏运维迎来云端革命!AcrelCloud-1200如何破解分布式光伏四大痛点?

在国家“双碳”目标推动下,分布式光伏正迎来爆发式增长🌞。甘肃、吉林、云南等多地政策接连落地,整县推进屋顶光伏试点如火如荼!然而,快速发展的背后,你是否也遇到过这些“光伏运维之痛”?✨【痛…

将 maven 集成到 idea 后出现 向项目创建模块时出错:null 的问题

1.出现的问题今天想将maven继承到idea出现了一下问题:用生成器里面的也会报错,找了找帖子并没有哪位大佬出现类似错误,于是我解决完想分享一下,如果有不对,请指正。2.解决办法很可能是java 的 版本 与 maven 版本有问题…

类似于 Progress Telerik Fiddler Classic 的 免费 或 开源 HTTP/HTTPS 抓包与调试工具推荐

以下是一些 类似于 Progress Telerik Fiddler Classic 的 免费 或 开源 HTTP/HTTPS 抓包与调试工具推荐:免费 / 开源替代工具推荐 1. Wireshark 免费且开源的网络协议分析工具,支持 Windows、macOS、Linux 等平台。可捕获并深入分析网络流量,…

7.0 热电偶的工作原理

在工业生产过程中,温度是需要测量和控制的重要参数之一。在温度测量中,热电偶的应用极为广泛,它具有结构简单、制造方便、测量范围广、精度高、惯性小和输出信号便于远传等许多优点。另外,由于热电偶是一种无源传感器,…

commons-lang3

概述 提供了许多帮助程序实用程序&#xff0c;特别是字符串操作方法&#xff0c;基本数值方法&#xff0c;对象反射&#xff0c;并发&#xff0c;创建和序列化以及系统属性。maven依赖<dependency><groupId>org.apache.commons</groupId><artifactId>c…

vue-amap组件呈现的效果图如何截图

我们用amap呈现了几个图层后&#xff0c;用户觉得效果很好&#xff0c;想点个按钮直接将这个画面截图下来。 首先我们用Canvas的toDataURL方法可以直接获取图像数据&#xff0c;但是实践发现截图后是空白的。 原因在警告中&#xff1a; 地图的WebGL context 的preserveDrawin…

杰理烧录ERROR: Data error after erasing, address = 0x430000

把CONFIG_BOARD_DEV_KIT关闭&#xff0c;打开CONFIG_BOARD_DEVELOP

超越自动化:为什么说供应链的终局是“AI + 人类专家”的混合智能?

摘要&#xff1a;当前&#xff0c;围绕AI赋能供应链的讨论&#xff0c;大多聚焦于“自动化”带来的降本增效。然而&#xff0c;这仅仅是第一层。当我们的系统面对“黑天鹅”事件时&#xff0c;一个过度依赖自动化的“脆弱”系统可能会瞬间崩溃。本文旨在深入探讨供应链演进的下…

Spine文件导入Unity流程

1、转为Json文件导出 2、对文件进行处理 3、添加Spine的Package包 一、Spine文件导出设置 1、选择Json文件 2、选择导出所在路径 3、点击打包设置 更改图集扩展名 二、文件导出后的设置 1、修改Json的Spine版本 这里必须是3.8 三、下载Unity支持包 1、链接 spine-unit…

Docker Compose healthcheck介绍(监控容器中服务的实际健康状态)数据库健康检查pg_isready

文章目录**功能概述****核心参数详解****配置示例****1. 基础用法****2. 使用数据库健康检查****3. 结合 depends_on 控制启动顺序****高级用法****1. 自定义健康检查脚本****2. 多种健康检查类型**- **HTTP 检查**&#xff1a;- **TCP 端口检查**&#xff1a;- **Redis 检查**…

算法之双指针

在算法设计中&#xff0c;双指针是一种高效优化工具&#xff0c;主要用于线性数据结构&#xff08;如数组&#xff08;数组划分和数组分块常用&#xff09;、链表、字符串&#xff09;&#xff0c;通过控制两个指针的移动轨迹&#xff0c;将原本需要 O (n) 时间复杂度的问题优化…

幂等性、顺序性保障以及消息积压

幂等性 概念 在应用程序中&#xff0c;幂等性就是指对一个系统进行重复调用&#xff08;相同参数&#xff09;&#xff0c;不论请求多少次&#xff0c;这些请求对系统的影响都是相同的效果. 比如数据库的select操作.不同时间两次查询的结果可能不同&#xff0c;但是这个操作…

算法训练营DAY58 第十一章:图论part08

拓扑排序精讲 卡码网&#xff1a;117. 软件构建(opens new window) 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依…

如何在Python中使用正则表达式?

在Python中使用正则表达式主要通过内置的re模块实现。正则表达式用于匹配、查找、替换字符串中的特定模式&#xff0c;是处理文本的强大工具。以下是使用正则表达式的核心方法和示例&#xff1a; 一、基本用法步骤 导入re模块&#xff1a;import re定义正则表达式模式&#xff…

用 Trae 玩转 Bright Data MCP 集成

引言 在自动化与智能体浪潮中&#xff0c;Trae 以“开箱即用、所见即所得”的工具编排体验&#xff0c;成为个人与团队落地 AI 工作流的高效选择。本篇将以 Trae 为主角&#xff0c;展示如何通过最少配置完成与 Bright Data MCP 的对接&#xff0c;并快速构建一个可用、可观测…

大数据Spark(六十三):RDD-Resilient Distributed Dataset

文章目录 RDD-Resilient Distributed Dataset 一、RDD五大特性 二、RDD创建方式 RDD-Resilient Distributed Dataset 在 Apache Spark 编程中&#xff0c;RDD&#xff08;Resilient Distributed Dataset&#xff0c;弹性分布式数据集&#xff09;是 Spark Core 中最基本的数…

java,通过SqlSessionFactory实现动态表明的插入和查询(适用于一个版本一个表的场景)

1,测试实体类package org.springblade.sample.test;import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data;/*** Author: 肖扬* CreateTime: 2025-09-05* Description: SqlSessionFactoryTest测试* Version: 1.0*/ Data TableName("session_factory_…

鹧鸪云光储流程系统全新升级:视频指引与分阶段模块使用指南

鹧鸪云光储流程系统近日完成重要更新&#xff0c;全面优化了操作指引体系&#xff0c;为用户带来更高效、直观的使用体验。本次升级重点推出了全套功能操作视频&#xff0c;并明确了不同业务阶段的核心模块使用指南&#xff0c;助力用户快速上手、提升工作效率。全覆盖视频操作…

ChatGPT 协作调优:把 SQL 查询从 5s 优化到 300ms 的全过程

ChatGPT 协作调优&#xff1a;把 SQL 查询从 5s 优化到 300ms 的全过程 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;每一个…

复杂计算任务的智能轮询优化实战

目录 复杂计算任务的智能轮询优化实战 一、轮询方法介绍 二、三种轮询优化策略 1、用 setTimeout 替代 setInterval 2、轮询时间指数退避 3、标签页可见性检测&#xff08;Page Visibility API&#xff09; 三、封装一个简单易用的智能轮询方法 四、结语 作者&#xff…