当前位置: 首页 > article >正文

别再死记硬背VGG结构了!手把手教你用PyTorch复现VGG16/19(附代码与权重加载)

从零构建VGG16PyTorch实战指南与设计哲学解析在计算机视觉领域VGG网络以其优雅的对称结构和卓越的性能表现成为深度学习发展史上的里程碑。不同于简单记忆网络层数真正理解VGG的精髓在于亲手实现其架构设计。本文将带您用PyTorch完整实现VGG16并深入探讨其背后的设计智慧。1. 环境准备与基础认知开始编码前我们需要配置合适的开发环境。建议使用Python 3.8和PyTorch 1.10版本这些组合经过长期验证具有最佳稳定性。安装命令如下conda create -n vgg_env python3.8 conda activate vgg_env pip install torch torchvision torchaudioVGG的核心设计理念可以概括为三点小卷积核的堆叠全网络采用3×3卷积核通过多层叠加获得与大卷积核相同的感受野深度与宽度的平衡每经过一个池化层特征图通道数翻倍结构对称性卷积层分组呈现明显的对称模式便于记忆与实现提示现代GPU对3×3卷积有特殊优化这是VGG能在较深网络下保持高效的原因之一2. VGG16网络架构详解2.1 卷积块设计模式VGG16由5个卷积块组成每个块末尾连接最大池化层。下表展示了各块的详细配置卷积块卷积层数量输出通道数是否包含池化Block1264是Block22128是Block33256是Block43512是Block53512是实现时每个卷积块可以定义为包含多个卷积层的Sequential模块。PyTorch实现代码如下import torch.nn as nn def make_conv_block(in_channels, out_channels, num_convs): layers [] for _ in range(num_convs): layers [ nn.Conv2d(in_channels, out_channels, kernel_size3, padding1), nn.ReLU(inplaceTrue) ] in_channels out_channels layers.append(nn.MaxPool2d(kernel_size2, stride2)) return nn.Sequential(*layers)2.2 全连接层设计卷积特征提取后VGG使用三个全连接层完成分类FC125088 → 4096FC24096 → 4096FC34096 → 1000 (ImageNet类别数)现代实现通常会添加Dropout层防止过拟合class VGG16FC(nn.Module): def __init__(self, num_classes1000): super().__init__() self.classifier nn.Sequential( nn.Linear(512*7*7, 4096), nn.ReLU(True), nn.Dropout(p0.5), nn.Linear(4096, 4096), nn.ReLU(True), nn.Dropout(p0.5), nn.Linear(4096, num_classes) ) def forward(self, x): x x.view(x.size(0), -1) return self.classifier(x)3. 完整VGG16实现3.1 网络组装结合卷积块和全连接层完整VGG16实现如下class VGG16(nn.Module): def __init__(self, num_classes1000): super().__init__() self.features nn.Sequential( make_conv_block(3, 64, 2), # Block1 make_conv_block(64, 128, 2), # Block2 make_conv_block(128, 256, 3), # Block3 make_conv_block(256, 512, 3), # Block4 make_conv_block(512, 512, 3) # Block5 ) self.avgpool nn.AdaptiveAvgPool2d((7, 7)) self.classifier VGG16FC(num_classes) def forward(self, x): x self.features(x) x self.avgpool(x) return self.classifier(x)3.2 网络参数统计使用以下代码可以统计网络参数量def count_parameters(model): return sum(p.numel() for p in model.parameters() if p.requires_grad) vgg VGG16() print(fTotal parameters: {count_parameters(vgg):,}) # 输出138,357,544VGG16的参数量主要集中在全连接层这也是后来网络设计趋向全卷积结构的原因之一。4. 预训练权重加载与迁移学习4.1 官方权重加载PyTorch官方提供了在ImageNet上预训练的VGG16权重from torchvision.models import vgg16 # 加载预训练模型 pretrained_vgg vgg16(pretrainedTrue) # 自定义分类头 num_ftrs pretrained_vgg.classifier[6].in_features pretrained_vgg.classifier[6] nn.Linear(num_ftrs, 10) # 假设我们的任务有10类4.2 权重转换技巧当需要从其他框架转换权重时需注意维度顺序可能不同。以下是将Keras权重转换为PyTorch的示例def convert_keras_to_pytorch(keras_weights): pytorch_model VGG16() layer_names [name for name, _ in pytorch_model.named_parameters()] for i, (name, param) in enumerate(pytorch_model.named_parameters()): if weight in name: # 处理卷积核维度顺序差异 if len(param.shape) 4: # 卷积层权重 keras_weight keras_weights[i].transpose(3, 2, 0, 1) else: # 全连接层权重 keras_weight keras_weights[i].T param.data torch.from_numpy(keras_weight) else: # 偏置项 param.data torch.from_numpy(keras_weights[i]) return pytorch_model4.3 迁移学习实践针对新数据集微调VGG16时建议采用以下策略分层学习率深层参数使用较小学习率选择性冻结先冻结所有层训练分类头再解冻部分卷积层数据增强适当增加与目标领域相关的增强方式# 分层学习率设置示例 optimizer torch.optim.SGD([ {params: model.features.parameters(), lr: 1e-4}, {params: model.classifier.parameters(), lr: 1e-3} ], momentum0.9)5. VGG设计哲学的现代启示尽管VGG已经不再是性能最优的模型但其设计理念仍影响着现代网络架构小卷积核的堆叠ResNet、EfficientNet等仍延续这一思想结构对称性U-Net等编码器-解码器结构借鉴了这种设计美学深度与性能关系VGG的消融实验为后续研究提供了方法论范例在移动端部署时可以考虑以下优化# 将全连接层转换为卷积层以减少参数量 def fc_to_conv(model): model.avgpool nn.Identity() model.classifier nn.Sequential( nn.Conv2d(512, 4096, kernel_size7), nn.ReLU(True), nn.Conv2d(4096, 4096, kernel_size1), nn.ReLU(True), nn.Conv2d(4096, 1000, kernel_size1) ) return model实现过程中使用torchsummary可以方便地查看网络结构from torchsummary import summary model VGG16().to(cuda) summary(model, (3, 224, 224)) # 输出各层详细信息通过这次完整实现我发现VGG的结构虽然看似简单但每个设计选择背后都有深思熟虑的考量。特别是在处理特征图尺寸变化时保持padding1的对称性设计让网络实现变得异常优雅。实际部署时将第一个全连接层替换为卷积层的技巧可以显著提升模型在不同输入尺寸下的灵活性。

相关文章:

别再死记硬背VGG结构了!手把手教你用PyTorch复现VGG16/19(附代码与权重加载)

从零构建VGG16:PyTorch实战指南与设计哲学解析 在计算机视觉领域,VGG网络以其优雅的对称结构和卓越的性能表现,成为深度学习发展史上的里程碑。不同于简单记忆网络层数,真正理解VGG的精髓在于亲手实现其架构设计。本文将带您用PyT…...

React 大师级思考:如何在不断演变的 Web 标准中保持 React 项目的长期可维护性与扩展性

React 大师级思考:如何在不断演变的 Web 标准中保持 React 项目的长期可维护性与扩展性各位代码的朝圣者,各位在组件海洋中溺水又被救起的勇士们,欢迎来到今天这场关于“如何让 React 项目活过 10 年”的讲座。我知道你们在想什么。你们在想&…...

别再手动算面积和距离了!用Shapely处理GeoJSON数据,效率提升10倍

地理空间数据分析实战:用Shapely解锁GeoJSON处理新姿势 还在用传统方法逐行解析GeoJSON数据?当面对城市地块分析、物流路径优化或区域规划时,手动计算几何属性不仅耗时费力,还容易引入人为误差。这里有一份来自某城市规划局的真实…...

X.509数字证书实战解析:从结构到应用

1. X.509数字证书的前世今生 第一次听说X.509证书时,我正盯着浏览器地址栏那个小锁图标发呆。这个看似简单的技术,实际上支撑着整个互联网的安全通信。X.509就像数字世界的身份证,它用密码学的方式证明了"你是你"。想象一下&#x…...

Qt 6.2 静态编译实战:从环境配置到IDE集成的完整指南

1. 环境准备:搭建静态编译的基础舞台 第一次尝试Qt静态编译时,我盯着满屏的英文文档和报错信息整整发呆了半小时。作为过来人,我理解那种面对复杂工具链的无力感。别担心,跟着我的步骤走,咱们用最稳妥的方式把地基打牢…...

d2s-editor:暗黑破坏神2存档编辑实战指南与深度解析

d2s-editor:暗黑破坏神2存档编辑实战指南与深度解析 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 暗黑破坏神2玩家常面临角色属性不足、装备搭配受限、存档损坏等问题。d2s-editor作为一款基于Web的存档编辑工具&a…...

GHelper轻量级控制工具:三步解决华硕笔记本性能管理难题

GHelper轻量级控制工具:三步解决华硕笔记本性能管理难题 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, …...

如何快速掌握LRC歌词制作工具:新手也能上手的完整教程

如何快速掌握LRC歌词制作工具:新手也能上手的完整教程 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 你是否曾经为制作精准的LRC歌词而烦恼&#xff1f…...

如何决定是否需要创建索引_数据区分度与基数Cardinality计算

索引是否有效取决于Cardinality值高低:接近总行数(≥95%)说明区分度高,适合建索引;<10%则单列索引意义不大;低区分度字段应置于联合索引后缀,如(created_at, status),并用…...

Windows右键菜单的“数字园艺师“:ContextMenuManager深度解析与实战手册

Windows右键菜单的"数字园艺师":ContextMenuManager深度解析与实战手册 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾想过&…...

在线考试|基于springboot + vue在线考试管理系统(源码+数据库+文档)

在线考试管理系统 目录 基于springboot vue在线考试管理系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue在线考试管理系统 一、…...

终极指南:如何用Bioicons免费开源图标库彻底改变科研可视化

终极指南:如何用Bioicons免费开源图标库彻底改变科研可视化 【免费下载链接】bioicons A library of free open source icons for science illustrations in biology and chemistry 项目地址: https://gitcode.com/gh_mirrors/bi/bioicons Bioicons是一个专为…...

从双非到东南网安:一名普通考生的备考心路与策略复盘

1. 从迷茫到坚定:我的考研目标选择历程 作为一个双非院校的普通学生,我最初对考研这件事充满了迷茫。记得大三上学期结束时,身边的同学都在讨论考研目标,而我却连考什么专业、什么学校都没想清楚。这种状态持续了整整半年&#xf…...

服装商城|基于springboot + vue服装商城系统(源码+数据库+文档)

服装商城系统 目录 基于springboot vue服装商城系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue服装商城系统 一、前言 博主介绍…...

保姆级教程:用Python 3.12+和Dify脚手架从零开发你的第一个工具插件

保姆级教程:用Python 3.12和Dify脚手架从零开发你的第一个工具插件 在当今快速发展的AI应用生态中,能够快速构建和部署自定义插件已成为开发者的核心竞争力之一。Dify作为一个新兴的AI开发平台,其插件系统为开发者提供了极大的灵活性和扩展能…...

加了领导微信,发现他从不发朋友圈。同事说把你屏蔽了。后来才知道没屏蔽任何人,只是不发!问他为什么,他说发什么都不对!

职场里最高级的“躺平”,是把朋友圈彻底清零。最近刷到一个扎心帖子,瞬间戳中了无数职场人的共鸣:加了领导微信,翻遍他的朋友圈,一条动态都没有。同事说“你被屏蔽了”,结果真相更现实——他只是彻底不发了…...

4.18数组名理解

int main() {int a[5] {5, 4, 3, 2, 1};int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; }看这个代码,数组a中存放了五个元素,数组名a是指向数组首元素a[0]的地址,类型为int*,&a代…...

蓝桥杯单片机 | 实战解析【进阶02】定时器中断下的长短按键识别与数码管动态显示

1. 定时器中断与长短按键识别原理 在单片机开发中,按键识别是最基础也最容易出问题的功能之一。我刚开始接触蓝桥杯单片机时,最头疼的就是按键抖动和误触发问题。后来发现,定时器中断是解决这些问题的银弹。 定时器中断就像是你家厨房里的定时…...

2026 多智能体全流程实战:用 Python + API 搭建可观测门店运营助手,附最小可复现代码

2026 多智能体全流程实战:用 Python API 搭建可观测门店运营助手,附最小可复现代码 从 2026-04-16 到 2026-04-18 的 6 条 AI 热点出发,拆到场景定义、关键代码、调试排错与上线建议 导语 先给最终效果:我们要做一个本地就能跑通…...

易语言VNC远程控制模块|虚拟机隔离防检测专用组件

温馨提示:文末有联系方式易语言VNC远程控制模块 一款深度适配易语言生态的轻量级VNC通信组件,封装底层Socket与RFB协议逻辑,提供稳定、低延迟的远程画面传输与交互能力。VNC模块源代码及键鼠操作实战示例 附带可直接编译运行的完整源码包&…...

04月19日AI每日参考:OpenAI豪掷200亿押注Cerebras,ChatGPT用户突破10亿

今日概览 今天AI圈有两条主线值得重点关注。一是算力军备赛再度升温:OpenAI与Cerebras签下超200亿美元芯片采购协议,同时获得股权,这是AI公司绑定算力供应商的最大单笔交易之一。二是国内AI硬件与Agent落地提速:联想、科大讯飞同…...

别再用成品USB麦克风了!手把手教你用STM32F4和CubeMX打造专属录音声卡(附完整代码)

从零打造专属录音声卡:STM32F4与CubeMX实战指南 市面上大多数USB麦克风都是封闭的黑箱系统,无法满足硬件创客和嵌入式开发者对底层控制的渴望。本文将带你用STM32F4开发板和CubeMX工具,打造一款完全可定制的USB录音设备,突破成品声…...

C++ STL 标准模板库 六大核心

文章目录容器(Containers)—— 存放数据算法(Algorithms)—— 操作数据迭代器(Iterators)—— 容器与算法的桥梁仿函数 / 函数对象(Functors)适配器(Adapters&#xff09…...

Bilibili视频下载器:高效下载大会员4K超清内容的专业解决方案

Bilibili视频下载器:高效下载大会员4K超清内容的专业解决方案 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 在当今数字化…...

HFSS实战:手把手教你仿真一个2.1GHz圆极化微带天线阵列(从单贴片到2x2阵)

HFSS实战:从单贴片到2x2阵列的圆极化微带天线仿真全流程 在射频工程领域,微带天线因其结构紧凑、成本低廉和易于集成的特点,成为无线通信系统的热门选择。特别是圆极化微带天线,能够有效减少极化失配带来的信号损失,在…...

【Python基础20讲】第17章:正则表达式

博主智算菩萨,专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术,从零基础入门到高阶实战,陪伴开发者共同成长。目前已开设五大技术专栏,累计发布多篇原创技术文章,…...

stable_baseline3 快速入门(二): 训练自定义游戏,构建Gymnasium训练环境

简介Gymnasium 为强化学习提供了一个标准化的API,它定义了 Agent 应该如何观察世界、如何做出动作以及如何获得奖励,不管是游戏,还是工业设备,只需要满足Gymnasium标准都能使用同一套代码进行训练。认识Gymnasium使用stable_basel…...

合并报表系统:多公司财务报表的自动合并

合并报表系统:多公司财务报表的自动合并 在全球化与集团化经营日益普遍的今天,企业往往需要管理多家子公司或分支机构的财务数据。传统的手工合并报表方式不仅耗时耗力,还容易因人为错误导致数据不准确。合并报表系统的出现,为企…...

【Python基础20讲】第01章:Python 环境搭建与第一个程序

博主智算菩萨,专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术,从零基础入门到高阶实战,陪伴开发者共同成长。目前已开设五大技术专栏,累计发布多篇原创技术文章,…...

山东大学软件学院2026项目实训个人博客(二)

项目名称:基于AI大模型的智能考研社区撰写日期:2026年4月18日本周我主要完成了项目基础环境的进一步搭建和Redis、RabbitMQ配置的完善,优化当前注册功能、登录功能、错题本CRUD功能,并进行Swagger测试。一、基础环境搭建从git仓获…...