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

别再死记硬背公式了!用PyTorch代码实战推导普通/深度可分离/分组卷积的参数量与FLOPs

用PyTorch代码实战验证卷积层的参数量与计算量在深度学习模型优化过程中理解不同卷积操作的参数量(Params)和浮点运算量(FLOPs)至关重要。本文将带您通过PyTorch代码实际构建普通卷积、深度可分离卷积和分组卷积层并使用torchinfo和thop工具验证理论计算公式的正确性。1. 实验环境准备与工具介绍1.1 安装必要库首先确保已安装以下Python库pip install torch torchvision torchinfo thop1.2 核心工具简介torchinfo提供模型层级的参数统计thop计算模型或层的FLOPs自定义验证函数我们将编写辅助函数来手动计算理论值import torch import torch.nn as nn from torchinfo import summary from thop import profile def print_params_flops(model, input_size(1, 3, 224, 224)): # 使用torchinfo打印参数量 summary(model, input_sizeinput_size) # 使用thop计算FLOPs input_tensor torch.randn(input_size) flops, params profile(model, inputs(input_tensor,)) print(fTHOP计算的FLOPs: {flops/1e6:.2f}M)2. 普通卷积的实战验证2.1 理论公式回顾普通卷积的参数量计算公式为Params (Kw × Kh × Ci 1) × CoFLOPs计算公式为FLOPs 2 × Kw × Kh × Ci × Wo × Ho × Co2.2 PyTorch实现与验证我们构建一个普通卷积层并验证上述公式class StandardConvNet(nn.Module): def __init__(self, in_channels3, out_channels64, kernel_size3, stride1, padding1): super().__init__() self.conv nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding) def forward(self, x): return self.conv(x) # 实例化模型 model StandardConvNet(in_channels3, out_channels64, kernel_size3) # 输入尺寸 (batch, channels, height, width) input_size (1, 3, 224, 224) print_params_flops(model, input_size)2.3 手动计算验证根据输入输出尺寸和卷积参数我们可以手动计算def calculate_std_conv(Ci3, Co64, K3, H224, W224, padding1, stride1): # 计算输出尺寸 Ho (H 2*padding - K) // stride 1 Wo (W 2*padding - K) // stride 1 # 计算参数量 params (K * K * Ci 1) * Co # 计算FLOPs flops 2 * K * K * Ci * Ho * Wo * Co return params, flops manual_params, manual_flops calculate_std_conv() print(f手动计算参数量: {manual_params}) print(f手动计算FLOPs: {manual_flops/1e6:.2f}M)2.4 结果对比与分析计算方式参数量FLOPstorchinfo1,792-thop-173.02M手动计算1,792173.02M三者结果完全一致验证了理论公式的正确性。3. 深度可分离卷积的实战验证3.1 理论公式回顾深度可分离卷积分为两部分深度卷积(逐通道卷积)Params_depth (Kw × Kh 1) × Ci FLOPs_depth 2 × Kw × Kh × Hm × Wm × Ci点卷积(1×1卷积)Params_point (1 × 1 × Ci 1) × Co FLOPs_point 2 × Ci × Ho × Wo × Co3.2 PyTorch实现与验证class DepthwiseSeparableConv(nn.Module): def __init__(self, in_channels3, out_channels64, kernel_size3, stride1, padding1): super().__init__() # 深度卷积 self.depthwise nn.Conv2d( in_channels, in_channels, kernel_size, stride, padding, groupsin_channels ) # 点卷积 self.pointwise nn.Conv2d(in_channels, out_channels, 1) def forward(self, x): x self.depthwise(x) x self.pointwise(x) return x model DepthwiseSeparableConv(in_channels3, out_channels64, kernel_size3) print_params_flops(model, input_size)3.3 手动计算验证def calculate_dw_conv(Ci3, Co64, K3, H224, W224, padding1, stride1): # 深度卷积输出尺寸 Hm (H 2*padding - K) // stride 1 Wm (W 2*padding - K) // stride 1 # 点卷积输出尺寸 (1x1卷积不改变空间尺寸) Ho, Wo Hm, Wm # 计算参数量 params_depth (K * K 1) * Ci params_point (1 * 1 * Ci 1) * Co total_params params_depth params_point # 计算FLOPs flops_depth 2 * K * K * Hm * Wm * Ci flops_point 2 * Ci * Ho * Wo * Co total_flops flops_depth flops_point return total_params, total_flops manual_params, manual_flops calculate_dw_conv() print(f手动计算参数量: {manual_params}) print(f手动计算FLOPs: {manual_flops/1e6:.2f}M)3.4 结果对比与分析计算方式参数量FLOPstorchinfo259-thop-3.69M手动计算2593.69M深度可分离卷积相比普通卷积显著减少了参数量和计算量验证了其在轻量化模型中的优势。4. 分组卷积的实战验证4.1 理论公式回顾分组数为g的分组卷积Params (Kw × Kh × Ci/g 1) × Co FLOPs 2 × Kw × Kh × Ci/g × Ho × Wo × Co4.2 PyTorch实现与验证class GroupConvNet(nn.Module): def __init__(self, in_channels64, out_channels64, kernel_size3, groups4): super().__init__() self.conv nn.Conv2d( in_channels, out_channels, kernel_size, padding1, groupsgroups ) def forward(self, x): return self.conv(x) model GroupConvNet(in_channels64, out_channels64, kernel_size3, groups4) print_params_flops(model, input_size(1, 64, 224, 224))4.3 手动计算验证def calculate_group_conv(Ci64, Co64, K3, H224, W224, groups4, padding1, stride1): # 输出尺寸 Ho (H 2*padding - K) // stride 1 Wo (W 2*padding - K) // stride 1 # 计算参数量 params (K * K * (Ci//groups) 1) * Co # 计算FLOPs flops 2 * K * K * (Ci//groups) * Ho * Wo * Co return params, flops manual_params, manual_flops calculate_group_conv() print(f手动计算参数量: {manual_params}) print(f手动计算FLOPs: {manual_flops/1e6:.2f}M)4.4 结果对比与分析计算方式参数量FLOPstorchinfo2,944-thop-115.61M手动计算2,944115.61M与普通卷积相比分组数为4的分组卷积将参数量和计算量都减少到了原来的1/4。5. 高级验证技巧与常见问题5.1 处理padding和stride的影响不同padding和stride设置会影响输出尺寸进而影响FLOPs计算。我们需要在手动计算时准确考虑这些参数def calculate_output_size(H, K, padding, stride): return (H 2*padding - K) // stride 15.2 偏置项的影响在参数量计算中每个卷积核有一个偏置参数(1)。在FLOPs计算中每个输出位置需要一次加法操作(1)。5.3 工具计算与实际值的差异有时thop计算的结果与理论值会有微小差异这通常是由于框架实现的细节差异特殊优化如Winograd卷积边界条件的处理方式不同5.4 批量处理时的计算上述计算都是针对单个样本的。对于批量处理FLOPs需要乘以batch sizebatch_flops flops * batch_size6. 综合对比与应用建议6.1 三种卷积方式的性能对比我们固定输入输出通道数(64→64)核大小(3×3)输入尺寸(224×224)对比三种卷积卷积类型参数量FLOPs相对普通卷积节省普通卷积36,928231.21M-深度可分离1,7923.69M95.1% / 98.4%分组卷积(g4)9,28057.80M74.9% / 75.0%6.2 选择卷积类型的实用建议普通卷积当计算资源充足追求最高精度时深度可分离卷积移动端、嵌入式设备等资源受限场景分组卷积需要在计算效率和模型容量间取得平衡时6.3 实际模型中的组合使用现代高效网络架构通常组合使用这些卷积类型class EfficientBlock(nn.Module): def __init__(self, in_ch, out_ch): super().__init__() # 深度可分离卷积 self.dw_conv nn.Conv2d(in_ch, in_ch, 3, padding1, groupsin_ch) # 分组卷积 self.group_conv nn.Conv2d(in_ch, out_ch, 1, groups4) def forward(self, x): x self.dw_conv(x) x self.group_conv(x) return x

相关文章:

别再死记硬背公式了!用PyTorch代码实战推导普通/深度可分离/分组卷积的参数量与FLOPs

用PyTorch代码实战验证卷积层的参数量与计算量 在深度学习模型优化过程中,理解不同卷积操作的参数量(Params)和浮点运算量(FLOPs)至关重要。本文将带您通过PyTorch代码实际构建普通卷积、深度可分离卷积和分组卷积层,并使用torchinfo和thop工具验证理论计…...

5分钟终极指南:用Win11Debloat让你的Windows 11系统焕然一新

5分钟终极指南:用Win11Debloat让你的Windows 11系统焕然一新 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter …...

Windows 11终极优化指南:用Win11Debloat快速清理系统并提升性能

Windows 11终极优化指南:用Win11Debloat快速清理系统并提升性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutt…...

Java向量API硬件加速落地失败?3类CPU指令集兼容性断层(AVX2/AVX-512/SVE)导致JIT退化真相

更多请点击: https://intelliparadigm.com 第一章:Java 25 向量 API 硬件加速落地困局全景透视 Java 25 正式引入了 jdk.incubator.vector 模块的 GA 版本,标志着 JVM 层面向量计算能力迈入生产就绪阶段。然而,真实场景中硬件加速…...

热泵干燥装置电控系统设计(论文+程序)

热泵干燥装置电控系统是提升干燥效率与节能效果的核心环节,其设计需兼顾温度、湿度、风速等多参数的精准调控。传统干燥设备多依赖人工经验调节,存在能耗高、稳定性差等问题,而电控系统的引入通过传感器实时采集数据,结合逻辑控制…...

汽车变速箱加工工艺及夹具设计(毕业设计)论文+CAD图纸+工艺卡+文献翻译……

汽车变速箱作为车辆动力传输的核心部件,其加工质量直接影响整车性能与可靠性。在变速箱制造过程中,加工工艺与夹具设计是保障零件精度、提升装配效率的关键环节。加工工艺需综合考虑材料特性、加工顺序及刀具选择,例如齿轮类零件需通过滚齿、…...

汽车大梁生产线全液压铆接机液压系统设计

汽车大梁作为车身的“骨架”,其结构强度直接影响整车安全性。全液压铆接机通过液压系统精准控制铆接力,将铆钉与大梁板材紧密结合,确保连接部位在复杂工况下仍能保持高强度与稳定性。这一过程无需传统焊接的高温环境,避免了金属晶…...

改进YOLOv10:引入SIoU角度感知损失实现高精度旋转目标检测

开篇:为什么旋转目标检测这么难? 大家好,我是老张,做目标检测也有五六年了。最近在做一个无人机航拍项目,遇到了一个特别头疼的问题——普通YOLO检测器对旋转目标的检测效果实在太差。比如停车场里的汽车,方向各异;仓库里的货物箱子,摆放角度乱七八糟;还有遥感图像里…...

2025届最火的十大AI写作工具解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对人工智能辅助开题报告撰写这一已日益成为学术研究高效手段的情况,首先&#…...

如何高效解决OpenArk内核驱动加载问题:Windows安全分析最佳实践

如何高效解决OpenArk内核驱动加载问题:Windows安全分析最佳实践 【免费下载链接】OpenArk The Next Generation of Anti-Rookit(ARK) tool for Windows. 项目地址: https://gitcode.com/GitHub_Trending/op/OpenArk 作为Windows平台新一代的反Rootkit工具&am…...

保姆级教程:用Wireshark抓包分析MQTT协议,从CONNECT到PUBLISH全流程拆解

从零解码MQTT协议:Wireshark实战抓包与深度解析指南 当你第一次在Wireshark中看到那些密密麻麻的十六进制数据流时,是否感到既兴奋又困惑?作为物联网领域的核心通信协议,MQTT的高效与简洁背后隐藏着精妙的设计逻辑。本文将带你像侦…...

ARM架构BRBSRC_EL1寄存器:分支记录与性能分析

1. ARM架构中的BRBSRC_EL1寄存器深度解析在ARMv8/v9架构中,系统寄存器扮演着处理器与操作系统间关键桥梁的角色。作为性能监控与调试基础设施的重要组成部分,BRBSRC_EL1(Branch Record Buffer Source Address Register)寄存器在分…...

解放你的桌面:用PinWin告别窗口切换的烦恼

解放你的桌面:用PinWin告别窗口切换的烦恼 【免费下载链接】PinWin Pin any window to be always on top of the screen 项目地址: https://gitcode.com/gh_mirrors/pin/PinWin 你是否曾经为了同时查看视频教程和编写代码而频繁切换窗口?是否在写…...

QT 5.15在Windows上死活装不上?别急,试试这个被忽略的‘Archive’按钮(附清华源加速)

QT 5.15安装难题破解:揭秘Windows下被隐藏的版本入口 最近在Windows上安装QT 5.15时,不少开发者遇到了一个令人抓狂的问题——明明官方文档写着支持这个版本,但在线安装器里却怎么也找不到。这就像去餐厅点菜,菜单上明明有你想要的…...

Facebook三不限账户, 普通户比不了的宽松政策

对于跨境投手、出海企业而言,选对Facebook广告账户类型,是投放成功的第一步。2026年风控持续收紧,不同账户类型的权限、稳定性、适用场景差异显著,很多新手因混淆账户类型、选错渠道,导致开户失败、账户被封或投放受限…...

C++27静态反射元编程落地实践(编译期自省架构大揭秘)

更多请点击: https://intelliparadigm.com 第一章:C27静态反射元编程落地实践(编译期自省架构大揭秘) C27 将首次将核心静态反射(std::reflexpr)纳入标准草案,标志着编译期自省从实验性库&…...

LayerDivider:从单张插画到可编辑图层的魔法转换器

LayerDivider:从单张插画到可编辑图层的魔法转换器 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾面对一张精美的插画,却…...

Java 25虚拟线程调度突然卡顿?5步精准诊断法(含jcmd+AsyncProfiler+VirtualThreadMonitor三工具联动脚本)

更多请点击: https://intelliparadigm.com 第一章:Java 25虚拟线程资源调度优化 Java 25 引入了对虚拟线程(Virtual Threads)调度器的深度重构,核心在于将平台线程(Platform Thread)与虚拟线程…...

北京通州口碑好的学画画画画班推荐榜

为您推荐北京通州区口碑较好的绘画班,按不同学习阶段划分如下:🎓 美术高考集训 (艺考生)北京新高度画室 (通州宋庄艺术区)主攻方向:央美设计/造型、清华美院等名校。 成绩亮点:2026届央美校考获2状元2探花,…...

【Backend Flow工程实践 12】Collection / Property / Filter:为什么对象查询能力决定 Backend 脚本工程上限?

作者:Darren H. Chen 方向:Backend Flow / 后端实现流程 / EDA 工具工程 / Tcl 脚本工程 demo:LAY-BE-12_collection_property_filter 标签:Backend Flow、EDA、Tcl、Collection、Property、Filter、Design Object Model、后端实现…...

蓝桥杯单片机省赛代码复盘:从I2C驱动到数码管显示,一个完整工程如何拆解调试

蓝桥杯单片机竞赛代码深度解析:从模块拆解到系统调试实战 第一次拿到蓝桥杯单片机竞赛的完整工程代码时,我盯着满屏的寄存器操作和硬件驱动函数,感觉就像面对一个精密但陌生的机械装置——每个零件都在运转,但我却不知道它们如何协…...

HTML函数在多GPU系统中如何调用_显卡切换机制说明【汇总】

cudaSetDevice()必须在任何CUDA上下文创建前调用,否则无效;CUDA_VISIBLE_DEVICES是设备重映射而非过滤;PyTorch与TensorFlow需硬隔离或内存增长配置;NCCL通信依赖硬件拓扑与环境变量对齐。GPU设备索引不生效:为什么cud…...

为什么我坚持从GitHub源码编译LLVM?谈谈定制化开发与版本管理的真实需求

为什么我坚持从GitHub源码编译LLVM?谈谈定制化开发与版本管理的真实需求 在编译器工具链的选择上,预编译二进制包和源码编译两种方式看似只是安装路径的差异,实则代表着完全不同的工程哲学。当团队需要将LLVM深度集成到自己的开发流程中时&am…...

这道 AI 考题,99% 的人都选错了——不是因为他们笨

这道 AI 考题,99% 的人都选错了——不是因为他们笨 ——关于"本体"这道题,今天一次性讲透 说实话,我看到这道题的时候,第一反应是:完了,这是哲学题还是计算机题? “本体”&#xff08…...

如何快速掌握Tiled地图编辑器:专业级地图拼接与场景构建完整指南

如何快速掌握Tiled地图编辑器:专业级地图拼接与场景构建完整指南 【免费下载链接】tiled Flexible level editor 项目地址: https://gitcode.com/gh_mirrors/ti/tiled Tiled是一款强大而灵活的开源2D地图编辑器,专为各类瓦片游戏设计,…...

Fast-GitHub终极指南:3分钟解决国内GitHub访问卡顿问题

Fast-GitHub终极指南:3分钟解决国内GitHub访问卡顿问题 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为GitHub的…...

lvgl_v8.1.0-dev之修复渐变效果不生效的bug

根据codex-5.3模型分析,定位到是lvgl源码有问题,在lv_draw_rect.c 183行处 源码为: grad_map[i] = grad_get(dsc, coords_w, i - coords_bg.x1);修改为: grad_map[i...

Unity立方体贴图技术:环境反射与动态阴影实现

1. Unity中的立方体贴图技术概述立方体贴图(Cubemap)作为实时渲染中实现环境反射与折射效果的核心技术,其本质是由6张2D纹理组成的立方体纹理集合。与传统2D纹理不同,立方体贴图通过方向向量进行采样,这使得它特别适合模拟全向的环境光照效果…...

Unity着色器编译核心指令与优化技巧详解

1. Unity着色器编译基础与核心指令解析在Unity游戏开发中,着色器是图形渲染管线的核心组件,负责将3D几何数据转换为屏幕上的2D像素。Unity支持多种着色器语言,其中CG/HLSL是最常用的选择。让我们深入探讨着色器编译的核心机制和优化技巧。1.1…...

NVIDIA Profile Inspector 完整指南:解锁显卡隐藏性能的10个专业技巧

NVIDIA Profile Inspector 完整指南:解锁显卡隐藏性能的10个专业技巧 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector 是一款强大的开源工具,专为追求极…...