【参数量(Params)与计算量(FLOPs)的计算】


前言

随着深度学习在工业领域的使用,也随着深度学习的进步,模型的复杂度对于衡量一个模型的好坏也至关重要,本文主要介绍一般情况下参数量(Params)与计算量(FLOPs)的计算。


一、参数量的计算

参数量主要用来形容模型的大小程度,类似于算法中的空间复杂度。

1.卷积层

计算公式如下:
params = Co×(Ci×Kw×Kh +1)
其中,Co代表输入的通道数,Ci代表输出的通道数,Kw×Kh为卷积核的大小,若卷积核有偏置项(Bias)则+1,没有则不加。若卷积核为方形则Kw=Kh=K。

2.池化层

深度学习中,参数量一般是指随着训练可以不断进行自我调节大小的参数的数量。而池化层主要是用来采样,例如:最大池化,取一个filter中的最大值。所以池化层可以不用算参数量。

3.全连接层

计算公式如下:
params = (I+1)×O
其中,I为输入向量的维度也可以称作输入特征图的大小,O为输出向量的维度

二、计算量的计算

计算量原本用于形容硬件的性能,而在深度学习中用来形容模型执行的长短,类似宇算法中的时间复杂度。

1.卷积层

计算公式如下:
FLOPs = [Ci×Kw×Kh+(Ci×Kw×Kh-1) +1]×W×H×Co
其中Ci×Kw×Kh为一次卷积的乘法预算的计算量,(Ci×Kw×Kh-1)为一次卷积加法运算的计算量,+1为偏置项,W与H为特征图(feture map)的长和宽。
可简化为:
FLOPs = 2×Ci×Kw×Kh×W×H×Co
计算机视觉中常把一次乘法和加法合在一起,所以可以去掉前面乘的2。

### 深度学习模型的FLOPs参数量计算 #### 一、基本概念 在深度学习领域,FLOPs(浮点运算数)用于衡量模型的计算复杂度,而参数量则表示模型中的权重数量。两者共同决定了模型的资源需求和运行效率。 - **FLOPs** 是 floating point operations 的缩写,指的是模型完成一次前向传播所需的浮点运算总数[^2]。 - **参数量 (Params)** 表示模型中所有可训练变量的数量总和[^1]。 --- #### 二、计算公式 ##### 参数量计算 对于神经网络中的每一层,参数量可以通过以下方式计算: - 卷积层: \[ Params_{conv} = K_h \times K_w \times C_{in} \times C_{out} + Bias \] 其中 \(K_h\) 和 \(K_w\) 是卷积核的高度和宽度,\(C_{in}\) 和 \(C_{out}\) 分别是输入通道数和输出通道数,Bias 是否存在取决于具体实现[^4]。 - 全连接层: \[ Params_{fc} = InputSize \times OutputSize + Bias \] - 批归一化层: \[ Params_{bn} = 2 \times Channels \] --- ##### FLOPs 计算 FLOPs 可以通过逐层累加各层的浮点运算来获得。以下是常见层的 FLOPs 计算公式: - 卷积层: \[ FLOPs_{conv} = H_{out} \times W_{out} \times C_{out} \times K_h \times K_w \times C_{in} \] 这里假设每次乘法操作伴随一次加法操作,因此每组乘法和加法计为两次 FLOPs。 - 全连接层: \[ FLOPs_{fc} = InputSize \times OutputSize \] - 激活函数(ReLU 等): \[ FLOPs_{activation} = H_{input} \times W_{input} \times C_{input} \] --- #### 三、工具方法 为了简化手动计算过程,可以借助一些开源库自动统计模型的 FLOPs参数量。 1. **THOP** 使用 THOP 库可以方便地获取 PyTorch 模型的 FLOPs参数量: ```python from thop import profile model = YourModel() input_tensor = torch.randn(1, 3, 224, 224) flops, params = profile(model, inputs=(input_tensor,)) print(f"FLOPs: {flops}, Parameters: {params}") ``` 2. **PTFlops** PTFlops 提供更详细的分析功能: ```python from ptflops import get_model_complexity_info model = YourModel() macs, params = get_model_complexity_info(model, (3, 224, 224), as_strings=True, print_per_layer_stat=True, verbose=True) print(f"MACs: {macs}, Parameters: {params}") ``` 3. **PyTorch Model Summary** 此工具提供直观的分层统计信息: ```python from pytorch_model_summary import summary model = YourModel() input_size = (1, 3, 224, 224) print(summary(model, input_size)) ``` 4. **TensorFlow Profiler** TensorFlow 用户可通过内置 profiler 获取类似的统计数据。 --- #### 四、硬件要求权衡 - **显存占用** 主要由参数量决定,较大的参数量会消耗更多 GPU 显存。 - **计算时间** 则主要受 FLOPs 影响,较高的 FLOPs 导致推理延迟增加。 - 权衡策略通常包括剪枝、量化、蒸馏等技术,在保持精度的同时减少参数量FLOPs[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值