卷积神经网络参数量和计算量内存计算

博客主要介绍了卷积网络中的参数量、计算量和内存相关内容。参数量与卷积核大小等有关,给出了卷积层、全连接层和BN层参数量的计算公式;计算量涉及一次卷积、特征图卷积次数和全连接层的计算量;内存方面,介绍了参数量、每张图及训练所占显存的计算方法。

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

卷积神经网络参数量和计算量内存计算

参数量

每一次卷积的参数量和特征图的大小无关,仅和卷积核的大小,偏置及BN有关。

1.每个卷积层的参数量,+1表示偏置:
Co x (Kw x Kh x Cin + 1)

2.全连接层的参数量
(D1 + 1) x D2

3.BN层的参数量
因为BN层需要学习两个参数 γ \gamma γ β \beta β,所以参数量是2xCo

计算量

1.一次卷积的计算量(kxk次乘法+kxk-1次加法)
(Kw x Kh) + (Kw x Kh - 1)

2.一个特征图上的卷积次数,即输出特征图的大小
( H − K h + 2 ∗ p a d d i n g S + 1 ) ∗ ( W − K w + 2 ∗ p a d d i n g S + 1 ) ({\frac{H-Kh+2*padding}{S}+1}) * ({\frac{W-Kw+2*padding}{S}+1}) (SHKh+2padding+1)(SWKw+2padding+1)

3.全连接层的计算量(乘法+加法)
(D1 + (D1 - 1) + 1) x D2

内存

1.参数量所占内存
(32位的float需要占用4个字节)
Memory(MB) = params x 4 /1024 /1024
比如:VGG参数量约为138million,则内存大小为138*3.8 = 524MB

2.每张图所占内存
计算一整张图的过程中的所有特征图层所占内存为Fw x Fh x C的加和,乘以4byte,再/1024/1024。

3.训练所占显存
比如:
参数量为500w,则内存为19MB;
一张图内存为100w,则内存为4MB;
Batchsize = 128;

则:
模型所占显存:19x2 = 38MB(1为params,1为Adam)
输出所占显存:128x4x2 = 1024MB(2为forward和backward)
总共需要显存:38+1024 > 1G

### 卷积神经网络参数量的单位表示 在卷积神经网络(CNN)的设计过程中,参数量是一个重要的考量因素。它直接影响到模型所需的存储空间以及计算资源的需求[^3]。 #### 参数量的定义 参数量是指模型中可学习参数的数量总。对于 CNN 来说,主要由卷积层、全连接层、批量归一化(Batch Normalization, BN)层等构成。每种类型的层都有其特定的参数数量计算方式: 1. **卷积层** 对于一个标准的二维卷积层,假设输入通道数为 \(C_{in}\),输出通道数为 \(C_{out}\),卷积核大小为 \(K \times K\),则该层的参数量可以表示为: \[ C_{out} \cdot (C_{in} \cdot K^2 + 1) \] 这里额外加上偏置项(bias),如果未启用 bias,则忽略最后一部分的 "+1"。 2. **全连接层** 假设某一层有 \(N_{input}\) 输入节点 \(N_{output}\) 输出节点,则对应的参数量为: \[ N_{input} \cdot N_{output} + N_{output} \] 3. **BN 层** 批量归一化层的学习参数主要包括缩放因子 (\(\gamma\)) 平移因子 (\(\beta\)),因此对于具有 \(C_o\) 个特征图的 BN 层来说,参数量为: \[ 2 \cdot C_o \][^4] #### 参数量的单位 参数量通常以单个数值的形式给出,代表的是整个模型中的独立权重或偏差变量总数。它的单位通常是“个”,即指代具体的参数数目。例如,当提到某个模型拥有 10M 的参数时,意味着此模型共有约 10 百万个独立的可训练参数。 为了进一步评估内存需求,在实际应用中还需要考虑数据精度的影响。常见的浮点数格式包括 FP32(32-bit 浮点数)、FP16(16-bit 浮点数)。若采用 FP32 格式保存每个参数,则所需内存可以通过如下公式估算: \[ \text{Memory Usage (Bytes)} = \text{Parameter Count} \times \text{Bits per Parameter} / 8 \] 例如,对于含有 10M 参数且使用 FP32 数据类型的模型而言,其理论上的显存占用大约为: ```python memory_usage_bytes = 10 * 1e6 * 4 # 10 million parameters with 4 bytes each print(f'Memory usage: {memory_usage_bytes / (1024**2):.2f} MB') ``` 上述代码会打印出相应的内存消耗情况。 --- ### 示例代码:计算简单 CNN 模型的参数量 下面提供一段 Python 代码用于演示如何统计 PyTorch 中构建的一个小型 CNN 模型的参数总量。 ```python import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1) self.bn1 = nn.BatchNorm2d(num_features=64) def forward(self, x): pass # Omitted for simplicity. net = SimpleCNN() total_params = sum(p.numel() for p in net.parameters()) print(f'Total number of parameters: {total_params}') ``` 运行以上脚本后将会得到该网络总的参数计数结果。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值