神经网络中参数量以及计算量的计算

本文详细解析了深度学习模型中卷积网络和全连接层的参数量及计算量计算方法,包括不同条件下的参数量变化,如是否使用偏置项和BN层,以及卷积操作的具体计算步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自知乎:https://zhuanlan.zhihu.com/p/86587652

1、参数量的计算

1.1 卷积网络

假设卷积核的大小为 k*k, 输入channel为M, 输出channel为N。

(1)bias为True时:

则参数数量为:k×k×M×N + N(bias的数量与输出channel的数量是一样的)

(2)bias为False时:

则参数数量为:k×k×M×N

(3)当使用BN时,还有两个可学习的参数α和β,参数量均为N

则参数数量为:k×k×M×N + 3×N

常用网络架构的参数数量:

AlexNet:62369155

VGG16:138357544

ResNet10(BasicBlock):14356544

ResNet18(BasicBlock):33161024

ResNet34(BasicBlock):46159168

ResNet50(Bottleneck):63470656

ResNet101(Bottleneck):85205312

ResNet152(Bottleneck):117364032

1.2 全连接层

假设 输入神经元数为M,输出神经元数为N,则

(1)bias为True时:

则参数数量为:M*N + N(bias的数量与输出神经元数的数量是一样的)

(2)bias为False时:

则参数数量为:M×N

2、计算量

2.1 卷积

假设输入特征图(B,C,H,W),卷积核大小为K×K, 输入通道为C,输出通道为N,步长stride为S, 输出特征图大小为H2,W2.

(1)一次卷积的计算量

一个k×k的卷积,执行一次卷积操作,需要k×k次乘法操作(卷积核中每个参数都要和特征图上的元素相乘一次),k×k−1 次加法操作(将卷积结果,k×k 个数加起来)。所以,一次卷积操作需要的乘加次数:(K×K)+(K×K−1)=2×K×K−1

(2)在一个特征图上需要执行卷积需要卷积的次数

在一个特征图上需要执行的卷积次数:((H-k+Ph)/S +1 )×((H-k+Pw)/S +1),Ph,Pw表示在高和宽方向填充的像素,此处假定了宽高方向滑动步长和核的宽高是一样,若不同,调整一下值即可。若不能整除,可向下取整。

(3)C个特征图上进行卷积运算的次数

C个输入特征图上进行卷积运算的次数为C

(4)输出一个特征图通道需要的加法次数

在C个输入特征图上进行卷积之后需要将卷积的结果相加,得到一个输出特征图上卷积结果,C个相加需要C-1次加法,计算量为 :(C-1)×H2×W2

(5)输出N个特征图需要计算的次数

N×((C-1)×H2×W2 + (2×K×K−1)×((H-k+Ph)/S +1 )×((H-k+Pw)/S +1) ×C)
(6)一个batch需要计算的次数

B×N×((C-1)×H2×W2 + (2×K×K−1)×((H-k+Ph)/S +1 )×((H-k+Pw)/S +1) ×C)

2.1 全连接

假设 输入神经元数为M,输出神经元数为N,则

(1)先执行M次乘法;

(2)再执行M-1次加法

(3)加上bias,计算出一个神经元的计算量为 (M+M-1+1)

(4)N个输出神经元,则总的计算量为 2M×N

<think>好的,用户想了解如何统计ResNet模型参数量。首先,我需要回顾一下用户提供的引用内容,特别是引用[1]中的Python代码,那个函数可以计算PyTorch模型参数量。用户提到ResNet模型的总参数和可训练参数数量相同,引用[2]中的例子显示ResNet的总参数量是148224,这说明所有参数都是可训练的。 接下来,用户可能想知道具体如何操作。我需要分步骤解释,首先安装必要的库,比如torch和torchvision,然后加载预训练的ResNet模型。接着,使用引用[1]中的函数来计算总参数和可训练参数。需要注意的是,不同的ResNet版本(如ResNet-18、ResNet-34等)参数量不同,用户可能需要调整模型名称。此外,引用[3]提到使用numel()函数来统计元素数量,这应该和代码中的numel()方法一致,确保正确性。 用户可能的疑问点包括:为什么总参数和可训练参数相同?这时候需要解释模型中没有冻结层,所有参数都参与训练。另外,用户可能想知道如何验证结果是否正确,可以提到官方文档或相关论文中的参数数量作为参考。同时,如果用户想统计特定模块的参数,可能需要修改函数,比如遍历子模块,但引用[2]中的例子已经展示了单个模块的参数统计方法,不过用户的问题主要针对整个模型,所以重点放在整体统计上。 最后,生成相关问题时要考虑用户可能的后续需求,比如优化参数量、不同模型的比较,或者参数量的影响因素等。确保回答结构清晰,步骤明确,引用正确,并且语言通俗易懂。</think>### ResNet模型参数量统计方法 统计ResNet模型参数量主要分为以下步骤: #### 1. 安装依赖库 ```python import torch from torchvision.models import resnet18 ``` #### 2. 加载预训练模型 ```python model = resnet18(pretrained=True) ``` #### 3. 使用统计函数(基于引用[1]) ```python def get_parameter_number(net): total_num = sum(p.numel() for p in net.parameters()) # 总参数量 trainable_num = sum(p.numel() for p in net.parameters() if p.requires_grad) # 可训练参数量 return {'Total': total_num, 'Trainable': trainable_num} ``` #### 4. 查看统计结果 ```python print(get_parameter_number(model)) ``` #### 5. 典型输出(对应引用[2]) ```python {'Total': 11689512, 'Trainable': 11689512} # ResNet-18的参数量 ``` #### 关键说明: - `numel()`方法用于统计张量元素总数(对应引用[3]) - ResNet不同版本参数量差异: $$ \begin{aligned} &\text{ResNet-18: } 11.7M \\ &\text{ResNet-34: } 21.8M \\ &\text{ResNet-50: } 25.6M \end{aligned} $$ - 所有参数默认可训练(`requires_grad=True`),因此Total和Trainable值相同[^2]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值